Backport time tracking fix from NewOS:
thread code now properly traces time spent in user vs kernel mode. The code was just plain broken before http://www.newos.org/cgi-bin/perfbrowse.perl?@describe+1704 git-svn-id: file:///srv/svn/repos/haiku/trunk/current@2599 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -44,6 +44,10 @@ enum team_state {
|
|||||||
TEAM_STATE_DEATH // being killed
|
TEAM_STATE_DEATH // being killed
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
KERNEL_TIME,
|
||||||
|
USER_TIME
|
||||||
|
};
|
||||||
|
|
||||||
#define THREAD_RETURN_EXIT 0x1
|
#define THREAD_RETURN_EXIT 0x1
|
||||||
#define THREAD_RETURN_INTERRUPTED 0x2
|
#define THREAD_RETURN_INTERRUPTED 0x2
|
||||||
@@ -129,7 +133,8 @@ struct thread {
|
|||||||
bigtime_t user_time;
|
bigtime_t user_time;
|
||||||
bigtime_t kernel_time;
|
bigtime_t kernel_time;
|
||||||
bigtime_t last_time;
|
bigtime_t last_time;
|
||||||
|
int last_time_type; // KERNEL_TIME or USER_TIME
|
||||||
|
|
||||||
// architecture dependant section
|
// architecture dependant section
|
||||||
struct arch_thread arch_info;
|
struct arch_thread arch_info;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -129,9 +129,12 @@ context_switch(struct thread *fromThread, struct thread *toThread)
|
|||||||
{
|
{
|
||||||
bigtime_t now;
|
bigtime_t now;
|
||||||
|
|
||||||
// track kernel time
|
// track kernel & user time
|
||||||
now = system_time();
|
now = system_time();
|
||||||
fromThread->kernel_time += now - fromThread->last_time;
|
if(fromThread->last_time_type == KERNEL_TIME)
|
||||||
|
fromThread->kernel_time += now - fromThread->last_time;
|
||||||
|
else
|
||||||
|
fromThread->user_time += now - fromThread->last_time;
|
||||||
toThread->last_time = now;
|
toThread->last_time = now;
|
||||||
|
|
||||||
toThread->cpu = fromThread->cpu;
|
toThread->cpu = fromThread->cpu;
|
||||||
|
|||||||
@@ -187,6 +187,7 @@ create_thread_struct(const char *name)
|
|||||||
t->user_time = 0;
|
t->user_time = 0;
|
||||||
t->kernel_time = 0;
|
t->kernel_time = 0;
|
||||||
t->last_time = 0;
|
t->last_time = 0;
|
||||||
|
t->last_time_type = KERNEL_TIME;
|
||||||
t->return_code = 0;
|
t->return_code = 0;
|
||||||
t->return_flags = 0;
|
t->return_flags = 0;
|
||||||
|
|
||||||
@@ -248,7 +249,9 @@ _create_user_thread_kentry(void)
|
|||||||
|
|
||||||
// a signal may have been delivered here
|
// a signal may have been delivered here
|
||||||
// thread_atkernel_exit();
|
// thread_atkernel_exit();
|
||||||
|
// start tracking kernel & user time
|
||||||
thread->last_time = system_time();
|
thread->last_time = system_time();
|
||||||
|
thread->last_time_type = KERNEL_TIME;
|
||||||
thread->in_kernel = false;
|
thread->in_kernel = false;
|
||||||
|
|
||||||
// jump to the entry point in user space
|
// jump to the entry point in user space
|
||||||
@@ -268,7 +271,9 @@ _create_kernel_thread_kentry(void)
|
|||||||
struct thread *thread = thread_get_current_thread();
|
struct thread *thread = thread_get_current_thread();
|
||||||
int (*func)(void *args);
|
int (*func)(void *args);
|
||||||
|
|
||||||
|
// start tracking kernel & user time
|
||||||
thread->last_time = system_time();
|
thread->last_time = system_time();
|
||||||
|
thread->last_time_type = KERNEL_TIME;
|
||||||
|
|
||||||
// call the entry function with the appropriate args
|
// call the entry function with the appropriate args
|
||||||
func = (void *)thread->entry;
|
func = (void *)thread->entry;
|
||||||
@@ -905,6 +910,7 @@ thread_atkernel_entry(void)
|
|||||||
now = system_time();
|
now = system_time();
|
||||||
t->user_time += now - t->last_time;
|
t->user_time += now - t->last_time;
|
||||||
t->last_time = now;
|
t->last_time = now;
|
||||||
|
t->last_time_type = KERNEL_TIME;
|
||||||
|
|
||||||
t->in_kernel = true;
|
t->in_kernel = true;
|
||||||
|
|
||||||
@@ -937,6 +943,7 @@ thread_atkernel_exit(void)
|
|||||||
now = system_time();
|
now = system_time();
|
||||||
t->kernel_time += now - t->last_time;
|
t->kernel_time += now - t->last_time;
|
||||||
t->last_time = now;
|
t->last_time = now;
|
||||||
|
t->last_time_type = USER_TIME;
|
||||||
|
|
||||||
RELEASE_THREAD_LOCK();
|
RELEASE_THREAD_LOCK();
|
||||||
restore_interrupts(state);
|
restore_interrupts(state);
|
||||||
|
|||||||
Reference in New Issue
Block a user