summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/thread.c84
-rw-r--r--lib/thread.h41
2 files changed, 58 insertions, 67 deletions
diff --git a/lib/thread.c b/lib/thread.c
index 468edd90..9de5f94f 100644
--- a/lib/thread.c
+++ b/lib/thread.c
@@ -267,7 +267,7 @@ cpu_record_hash_alloc (struct cpu_thread_history *a)
struct cpu_thread_history *new;
new = XCALLOC (MTYPE_THREAD_STATS, sizeof (struct cpu_thread_history));
new->func = a->func;
- strcpy(new->funcname, a->funcname);
+ new->funcname = a->funcname;
return new;
}
@@ -334,7 +334,7 @@ cpu_record_print(struct vty *vty, thread_type filter)
void *args[3] = {&tmp, vty, &filter};
memset(&tmp, 0, sizeof tmp);
- strcpy(tmp.funcname, "TOTAL");
+ tmp.funcname = "TOTAL";
tmp.types = filter;
#ifdef HAVE_RUSAGE
@@ -582,7 +582,6 @@ thread_add_unuse (struct thread_master *m, struct thread *thread)
assert (thread->prev == NULL);
assert (thread->type == THREAD_UNUSED);
thread_list_add (&m->unuse, thread);
- /* XXX: Should we deallocate funcname here? */
}
/* Free all unused thread. */
@@ -663,35 +662,13 @@ thread_timer_remain_second (struct thread *thread)
return 0;
}
-/* Trim blankspace and "()"s */
-void
-strip_funcname (char *dest, const char *funcname)
-{
- char buff[FUNCNAME_LEN];
- char tmp, *e, *b = buff;
-
- strncpy(buff, funcname, sizeof(buff));
- buff[ sizeof(buff) -1] = '\0';
- e = buff +strlen(buff) -1;
-
- /* Wont work for funcname == "Word (explanation)" */
-
- while (*b == ' ' || *b == '(')
- ++b;
- while (*e == ' ' || *e == ')')
- --e;
- e++;
-
- tmp = *e;
- *e = '\0';
- strcpy (dest, b);
- *e = tmp;
-}
+#define debugargdef const char *funcname, const char *schedfrom, int fromln
+#define debugargpass funcname, schedfrom, fromln
/* Get new thread. */
static struct thread *
thread_get (struct thread_master *m, u_char type,
- int (*func) (struct thread *), void *arg, const char* funcname)
+ int (*func) (struct thread *), void *arg, debugargdef)
{
struct thread *thread = thread_trim_head (&m->unuse);
@@ -707,7 +684,9 @@ thread_get (struct thread_master *m, u_char type,
thread->arg = arg;
thread->index = -1;
- strip_funcname (thread->funcname, funcname);
+ thread->funcname = funcname;
+ thread->schedfrom = schedfrom;
+ thread->schedfrom_line = fromln;
return thread;
}
@@ -715,7 +694,8 @@ thread_get (struct thread_master *m, u_char type,
/* Add new read thread. */
struct thread *
funcname_thread_add_read (struct thread_master *m,
- int (*func) (struct thread *), void *arg, int fd, const char* funcname)
+ int (*func) (struct thread *), void *arg, int fd,
+ debugargdef)
{
struct thread *thread;
@@ -727,7 +707,7 @@ funcname_thread_add_read (struct thread_master *m,
return NULL;
}
- thread = thread_get (m, THREAD_READ, func, arg, funcname);
+ thread = thread_get (m, THREAD_READ, func, arg, debugargpass);
FD_SET (fd, &m->readfd);
thread->u.fd = fd;
thread_list_add (&m->read, thread);
@@ -738,7 +718,8 @@ funcname_thread_add_read (struct thread_master *m,
/* Add new write thread. */
struct thread *
funcname_thread_add_write (struct thread_master *m,
- int (*func) (struct thread *), void *arg, int fd, const char* funcname)
+ int (*func) (struct thread *), void *arg, int fd,
+ debugargdef)
{
struct thread *thread;
@@ -750,7 +731,7 @@ funcname_thread_add_write (struct thread_master *m,
return NULL;
}
- thread = thread_get (m, THREAD_WRITE, func, arg, funcname);
+ thread = thread_get (m, THREAD_WRITE, func, arg, debugargpass);
FD_SET (fd, &m->writefd);
thread->u.fd = fd;
thread_list_add (&m->write, thread);
@@ -763,8 +744,8 @@ funcname_thread_add_timer_timeval (struct thread_master *m,
int (*func) (struct thread *),
int type,
void *arg,
- struct timeval *time_relative,
- const char* funcname)
+ struct timeval *time_relative,
+ debugargdef)
{
struct thread *thread;
struct pqueue *queue;
@@ -776,7 +757,7 @@ funcname_thread_add_timer_timeval (struct thread_master *m,
assert (time_relative);
queue = ((type == THREAD_TIMER) ? m->timer : m->background);
- thread = thread_get (m, type, func, arg, funcname);
+ thread = thread_get (m, type, func, arg, debugargpass);
/* Do we need jitter here? */
quagga_get_relative (NULL);
@@ -793,7 +774,8 @@ funcname_thread_add_timer_timeval (struct thread_master *m,
struct thread *
funcname_thread_add_timer (struct thread_master *m,
int (*func) (struct thread *),
- void *arg, long timer, const char* funcname)
+ void *arg, long timer,
+ debugargdef)
{
struct timeval trel;
@@ -803,14 +785,15 @@ funcname_thread_add_timer (struct thread_master *m,
trel.tv_usec = 0;
return funcname_thread_add_timer_timeval (m, func, THREAD_TIMER, arg,
- &trel, funcname);
+ &trel, debugargpass);
}
/* Add timer event thread with "millisecond" resolution */
struct thread *
funcname_thread_add_timer_msec (struct thread_master *m,
int (*func) (struct thread *),
- void *arg, long timer, const char* funcname)
+ void *arg, long timer,
+ debugargdef)
{
struct timeval trel;
@@ -820,15 +803,15 @@ funcname_thread_add_timer_msec (struct thread_master *m,
trel.tv_usec = 1000*(timer % 1000);
return funcname_thread_add_timer_timeval (m, func, THREAD_TIMER,
- arg, &trel, funcname);
+ arg, &trel, debugargpass);
}
/* Add a background thread, with an optional millisec delay */
struct thread *
funcname_thread_add_background (struct thread_master *m,
int (*func) (struct thread *),
- void *arg, long delay,
- const char *funcname)
+ void *arg, long delay,
+ debugargdef)
{
struct timeval trel;
@@ -846,19 +829,20 @@ funcname_thread_add_background (struct thread_master *m,
}
return funcname_thread_add_timer_timeval (m, func, THREAD_BACKGROUND,
- arg, &trel, funcname);
+ arg, &trel, debugargpass);
}
/* Add simple event thread. */
struct thread *
funcname_thread_add_event (struct thread_master *m,
- int (*func) (struct thread *), void *arg, int val, const char* funcname)
+ int (*func) (struct thread *), void *arg, int val,
+ debugargdef)
{
struct thread *thread;
assert (m != NULL);
- thread = thread_get (m, THREAD_EVENT, func, arg, funcname);
+ thread = thread_get (m, THREAD_EVENT, func, arg, debugargpass);
thread->u.val = val;
thread_list_add (&m->event, thread);
@@ -1253,7 +1237,7 @@ thread_call (struct thread *thread)
struct cpu_thread_history tmp;
tmp.func = thread->func;
- strcpy(tmp.funcname, thread->funcname);
+ tmp.funcname = thread->funcname;
thread->hist = hash_get (cpu_record, &tmp,
(void * (*) (void *))cpu_record_hash_alloc);
@@ -1301,7 +1285,7 @@ funcname_thread_execute (struct thread_master *m,
int (*func)(struct thread *),
void *arg,
int val,
- const char* funcname)
+ debugargdef)
{
struct thread dummy;
@@ -1313,7 +1297,11 @@ funcname_thread_execute (struct thread_master *m,
dummy.func = func;
dummy.arg = arg;
dummy.u.val = val;
- strip_funcname (dummy.funcname, funcname);
+
+ dummy.funcname = funcname;
+ dummy.schedfrom = schedfrom;
+ dummy.schedfrom_line = fromln;
+
thread_call (&dummy);
return NULL;
diff --git a/lib/thread.h b/lib/thread.h
index dbf5f25b..a088b472 100644
--- a/lib/thread.h
+++ b/lib/thread.h
@@ -64,9 +64,6 @@ struct thread_master
typedef unsigned char thread_type;
-/* ISO C99 maximum function name length is 63 */
-#define FUNCNAME_LEN 64
-
/* Thread itself. */
struct thread
{
@@ -85,7 +82,9 @@ struct thread
int index; /* used for timers to store position in queue */
struct timeval real;
struct cpu_thread_history *hist; /* cache pointer to cpu_history */
- char funcname[FUNCNAME_LEN];
+ const char *funcname;
+ const char *schedfrom;
+ int schedfrom_line;
};
struct cpu_thread_history
@@ -100,7 +99,7 @@ struct cpu_thread_history
struct time_stats cpu;
#endif
thread_type types;
- char funcname[FUNCNAME_LEN];
+ const char *funcname;
};
/* Clocks supported by Quagga */
@@ -165,15 +164,17 @@ enum quagga_clkid {
#define THREAD_WRITE_OFF(thread) THREAD_OFF(thread)
#define THREAD_TIMER_OFF(thread) THREAD_OFF(thread)
-#define thread_add_read(m,f,a,v) funcname_thread_add_read(m,f,a,v,#f)
-#define thread_add_write(m,f,a,v) funcname_thread_add_write(m,f,a,v,#f)
-#define thread_add_timer(m,f,a,v) funcname_thread_add_timer(m,f,a,v,#f)
-#define thread_add_timer_msec(m,f,a,v) funcname_thread_add_timer_msec(m,f,a,v,#f)
-#define thread_add_event(m,f,a,v) funcname_thread_add_event(m,f,a,v,#f)
-#define thread_execute(m,f,a,v) funcname_thread_execute(m,f,a,v,#f)
+#define debugargdef const char *funcname, const char *schedfrom, int fromln
+
+#define thread_add_read(m,f,a,v) funcname_thread_add_read(m,f,a,v,#f,__FILE__,__LINE__)
+#define thread_add_write(m,f,a,v) funcname_thread_add_write(m,f,a,v,#f,__FILE__,__LINE__)
+#define thread_add_timer(m,f,a,v) funcname_thread_add_timer(m,f,a,v,#f,__FILE__,__LINE__)
+#define thread_add_timer_msec(m,f,a,v) funcname_thread_add_timer_msec(m,f,a,v,#f,__FILE__,__LINE__)
+#define thread_add_event(m,f,a,v) funcname_thread_add_event(m,f,a,v,#f,__FILE__,__LINE__)
+#define thread_execute(m,f,a,v) funcname_thread_execute(m,f,a,v,#f,__FILE__,__LINE__)
/* The 4th arg to thread_add_background is the # of milliseconds to delay. */
-#define thread_add_background(m,f,a,v) funcname_thread_add_background(m,f,a,v,#f)
+#define thread_add_background(m,f,a,v) funcname_thread_add_background(m,f,a,v,#f,__FILE__,__LINE__)
/* Prototypes. */
extern struct thread_master *thread_master_create (void);
@@ -181,27 +182,29 @@ extern void thread_master_free (struct thread_master *);
extern struct thread *funcname_thread_add_read (struct thread_master *,
int (*)(struct thread *),
- void *, int, const char*);
+ void *, int, debugargdef);
extern struct thread *funcname_thread_add_write (struct thread_master *,
int (*)(struct thread *),
- void *, int, const char*);
+ void *, int, debugargdef);
extern struct thread *funcname_thread_add_timer (struct thread_master *,
int (*)(struct thread *),
- void *, long, const char*);
+ void *, long, debugargdef);
extern struct thread *funcname_thread_add_timer_msec (struct thread_master *,
int (*)(struct thread *),
- void *, long, const char*);
+ void *, long, debugargdef);
extern struct thread *funcname_thread_add_event (struct thread_master *,
int (*)(struct thread *),
- void *, int, const char*);
+ void *, int, debugargdef);
extern struct thread *funcname_thread_add_background (struct thread_master *,
int (*func)(struct thread *),
void *arg,
long milliseconds_to_delay,
- const char *funcname);
+ debugargdef);
extern struct thread *funcname_thread_execute (struct thread_master *,
int (*)(struct thread *),
- void *, int, const char *);
+ void *, int, debugargdef);
+#undef debugargdef
+
extern void thread_cancel (struct thread *);
extern unsigned int thread_cancel_event (struct thread_master *, void *);
extern struct thread *thread_fetch (struct thread_master *, struct thread *);