diff options
author | Paul Jakma <paul.jakma@sun.com> | 2006-07-25 20:40:40 +0000 |
---|---|---|
committer | Paul Jakma <paul.jakma@sun.com> | 2006-07-25 20:40:40 +0000 |
commit | cc8b13a00bfe7083ae68755e547a39cd762f2963 (patch) | |
tree | 9729858115e6862a6bc65a5454f41ce01e059306 | |
parent | 90c33177f53ae36a8765f5f27bf34a90663806d3 (diff) |
[lib] Optimise thread_call by caching pointer to thread history in the thread
2006-07-25 Paul Jakma <paul.jakma@sun.com>
* thread.h: (struct thread) Add a cache pointer to the struct
cpu_thread_history, if it is known - saving hash lookup on
each thread_call.
* thread.c: (thread_call) Cache the pointer to the
cpu_thread_history, so that future thread_calls of same
thread can avoid the hash_lookup.
-rw-r--r-- | lib/ChangeLog | 9 | ||||
-rw-r--r-- | lib/thread.c | 39 | ||||
-rw-r--r-- | lib/thread.h | 1 |
3 files changed, 35 insertions, 14 deletions
diff --git a/lib/ChangeLog b/lib/ChangeLog index 02148671..7a744393 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,12 @@ +2006-07-25 Paul Jakma <paul.jakma@sun.com> + + * thread.h: (struct thread) Add a cache pointer to the struct + cpu_thread_history, if it is known - saving hash lookup on + each thread_call. + * thread.c: (thread_call) Cache the pointer to the + cpu_thread_history, so that future thread_calls of same + thread can avoid the hash_lookup. + 2006-07-10 Andrew J. Schorr <ajschorr@alumni.princeton.edu> * vty.c: (vty_log_out) Do not call vty_close, because this could diff --git a/lib/thread.c b/lib/thread.c index 32fc15ef..8b6a7e2f 100644 --- a/lib/thread.c +++ b/lib/thread.c @@ -879,12 +879,23 @@ thread_call (struct thread *thread) { unsigned long realtime, cputime; RUSAGE_T ru; - struct cpu_thread_history tmp, *cpu; - - tmp.func = thread->func; - tmp.funcname = thread->funcname; - cpu = hash_get (cpu_record, &tmp, - (void * (*) (void *))cpu_record_hash_alloc); + + /* Cache a pointer to the relevant cpu history thread, if the thread + * does not have it yet. + * + * Callers submitting 'dummy threads' hence must take care that + * thread->cpu is NULL + */ + if (!thread->hist) + { + struct cpu_thread_history tmp; + + tmp.func = thread->func; + tmp.funcname = thread->funcname; + + thread->hist = hash_get (cpu_record, &tmp, + (void * (*) (void *))cpu_record_hash_alloc); + } GETRUSAGE (&thread->ru); @@ -893,17 +904,17 @@ thread_call (struct thread *thread) GETRUSAGE (&ru); realtime = thread_consumed_time (&ru, &thread->ru, &cputime); - cpu->real.total += realtime; - if (cpu->real.max < realtime) - cpu->real.max = realtime; + thread->hist->real.total += realtime; + if (thread->hist->real.max < realtime) + thread->hist->real.max = realtime; #ifdef HAVE_RUSAGE - cpu->cpu.total += cputime; - if (cpu->cpu.max < cputime) - cpu->cpu.max = cputime; + thread->hist->cpu.total += cputime; + if (thread->hist->cpu.max < cputime) + thread->hist->cpu.max = cputime; #endif - ++cpu->total_calls; - cpu->types |= (1 << thread->add_type); + ++(thread->hist->total_calls); + thread->hist->types |= (1 << thread->add_type); #ifdef CONSUMED_TIME_CHECK if (realtime > CONSUMED_TIME_CHECK) diff --git a/lib/thread.h b/lib/thread.h index f693ff5a..0670a890 100644 --- a/lib/thread.h +++ b/lib/thread.h @@ -80,6 +80,7 @@ struct thread struct timeval sands; /* rest of time sands value. */ } u; RUSAGE_T ru; /* Indepth usage info. */ + struct cpu_thread_history *hist; /* cache pointer to cpu_history */ char* funcname; }; |