mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-12 22:27:47 +00:00
[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:
parent
90c33177f5
commit
cc8b13a00b
@ -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>
|
2006-07-10 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
|
||||||
|
|
||||||
* vty.c: (vty_log_out) Do not call vty_close, because this could
|
* vty.c: (vty_log_out) Do not call vty_close, because this could
|
||||||
|
31
lib/thread.c
31
lib/thread.c
@ -879,12 +879,23 @@ thread_call (struct thread *thread)
|
|||||||
{
|
{
|
||||||
unsigned long realtime, cputime;
|
unsigned long realtime, cputime;
|
||||||
RUSAGE_T ru;
|
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.func = thread->func;
|
||||||
tmp.funcname = thread->funcname;
|
tmp.funcname = thread->funcname;
|
||||||
cpu = hash_get (cpu_record, &tmp,
|
|
||||||
|
thread->hist = hash_get (cpu_record, &tmp,
|
||||||
(void * (*) (void *))cpu_record_hash_alloc);
|
(void * (*) (void *))cpu_record_hash_alloc);
|
||||||
|
}
|
||||||
|
|
||||||
GETRUSAGE (&thread->ru);
|
GETRUSAGE (&thread->ru);
|
||||||
|
|
||||||
@ -893,17 +904,17 @@ thread_call (struct thread *thread)
|
|||||||
GETRUSAGE (&ru);
|
GETRUSAGE (&ru);
|
||||||
|
|
||||||
realtime = thread_consumed_time (&ru, &thread->ru, &cputime);
|
realtime = thread_consumed_time (&ru, &thread->ru, &cputime);
|
||||||
cpu->real.total += realtime;
|
thread->hist->real.total += realtime;
|
||||||
if (cpu->real.max < realtime)
|
if (thread->hist->real.max < realtime)
|
||||||
cpu->real.max = realtime;
|
thread->hist->real.max = realtime;
|
||||||
#ifdef HAVE_RUSAGE
|
#ifdef HAVE_RUSAGE
|
||||||
cpu->cpu.total += cputime;
|
thread->hist->cpu.total += cputime;
|
||||||
if (cpu->cpu.max < cputime)
|
if (thread->hist->cpu.max < cputime)
|
||||||
cpu->cpu.max = cputime;
|
thread->hist->cpu.max = cputime;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
++cpu->total_calls;
|
++(thread->hist->total_calls);
|
||||||
cpu->types |= (1 << thread->add_type);
|
thread->hist->types |= (1 << thread->add_type);
|
||||||
|
|
||||||
#ifdef CONSUMED_TIME_CHECK
|
#ifdef CONSUMED_TIME_CHECK
|
||||||
if (realtime > CONSUMED_TIME_CHECK)
|
if (realtime > CONSUMED_TIME_CHECK)
|
||||||
|
@ -80,6 +80,7 @@ struct thread
|
|||||||
struct timeval sands; /* rest of time sands value. */
|
struct timeval sands; /* rest of time sands value. */
|
||||||
} u;
|
} u;
|
||||||
RUSAGE_T ru; /* Indepth usage info. */
|
RUSAGE_T ru; /* Indepth usage info. */
|
||||||
|
struct cpu_thread_history *hist; /* cache pointer to cpu_history */
|
||||||
char* funcname;
|
char* funcname;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user