mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-12-03 04:50:29 +00:00
50677bf806
Threads now have numeric priorities with a base priority in the 1-99 range. Whenever a runnable thread is *not* scheduled, its effective priority is incremented by 1. This is tracked in Thread::m_extra_priority. The effective priority of a thread is m_priority + m_extra_priority. When a runnable thread *is* scheduled, its m_extra_priority is reset to zero and the effective priority returns to base. This means that lower-priority threads will always eventually get scheduled to run, once its effective priority becomes high enough to exceed the base priority of threads "above" it. The previous values for ThreadPriority (Low, Normal and High) are now replaced as follows: Low -> 10 Normal -> 30 High -> 50 In other words, it will take 20 ticks for a "Low" priority thread to get to "Normal" effective priority, and another 20 to reach "High". This is not perfect, and I've used some quite naive data structures, but I think the mechanism will allow us to build various new and interesting optimizations, and we can figure out better data structures later on. :^)
58 lines
1.1 KiB
C++
58 lines
1.1 KiB
C++
#pragma once
|
|
|
|
#include <stdio.h>
|
|
#include <unistd.h>
|
|
|
|
#ifdef __cplusplus
|
|
|
|
struct Stopwatch {
|
|
union SplitQword {
|
|
struct {
|
|
uint32_t lsw;
|
|
uint32_t msw;
|
|
};
|
|
uint64_t qw { 0 };
|
|
};
|
|
|
|
public:
|
|
Stopwatch(const char* name)
|
|
: m_name(name)
|
|
{
|
|
read_tsc(&m_start.lsw, &m_start.msw);
|
|
}
|
|
|
|
~Stopwatch()
|
|
{
|
|
SplitQword end;
|
|
read_tsc(&end.lsw, &end.msw);
|
|
uint64_t diff = end.qw - m_start.qw;
|
|
dbgprintf("Stopwatch(%s): %Q ticks\n", m_name, diff);
|
|
}
|
|
|
|
private:
|
|
const char* m_name { nullptr };
|
|
SplitQword m_start;
|
|
};
|
|
|
|
#endif // __cplusplus
|
|
|
|
__BEGIN_DECLS
|
|
|
|
int module_load(const char* path, size_t path_length);
|
|
int module_unload(const char* name, size_t name_length);
|
|
|
|
int profiling_enable(pid_t);
|
|
int profiling_disable(pid_t);
|
|
|
|
#define THREAD_PRIORITY_MIN 1
|
|
#define THREAD_PRIORITY_LOW 10
|
|
#define THREAD_PRIORITY_NORMAL 30
|
|
#define THREAD_PRIORITY_HIGH 50
|
|
#define THREAD_PRIORITY_MAX 99
|
|
|
|
#define FUTEX_WAIT 1
|
|
#define FUTEX_WAKE 2
|
|
|
|
int futex(int32_t* userspace_address, int futex_op, int32_t value, const struct timespec* timeout);
|
|
|
|
__END_DECLS
|