summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Jakma <paul.jakma@sun.com>2006-07-25 20:40:40 +0000
committerPaul Jakma <paul.jakma@sun.com>2006-07-25 20:40:40 +0000
commitcc8b13a00bfe7083ae68755e547a39cd762f2963 (patch)
tree9729858115e6862a6bc65a5454f41ce01e059306
parent90c33177f53ae36a8765f5f27bf34a90663806d3 (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/ChangeLog9
-rw-r--r--lib/thread.c39
-rw-r--r--lib/thread.h1
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;
};