[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.
This commit is contained in:
Paul Jakma 2006-07-25 20:40:40 +00:00
parent 90c33177f5
commit cc8b13a00b
3 changed files with 35 additions and 14 deletions

View File

@ -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

View File

@ -879,12 +879,23 @@ thread_call (struct thread *thread)
{
unsigned long realtime, cputime;
RUSAGE_T ru;
struct cpu_thread_history tmp, *cpu;
/* 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;
cpu = hash_get (cpu_record, &tmp,
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)

View File

@ -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;
};