Annotation of embedaddon/iftop/threadprof.c, revision 1.1.1.1
1.1 misho 1: /*
2: * pthread_create wrapper for gprof compatibility
3: *
4: */
5:
6: #include <pthread.h>
7: #include <sys/time.h>
8:
9: #undef pthread_create
10:
11: typedef struct wrapper_s
12: {
13: void * (*start_routine)(void *);
14: void * arg;
15:
16: pthread_mutex_t lock;
17: pthread_cond_t wait;
18:
19: struct itimerval itimer;
20:
21: } wrapper_t;
22:
23: static void * wrapper_routine(void *);
24:
25: /* Same prototype as pthread_create; use some #define magic to
26: * transparently replace it in other files */
27: int gprof_pthread_create(pthread_t * thread, pthread_attr_t * attr,
28: void * (*start_routine)(void *), void * arg)
29: {
30: wrapper_t wrapper_data;
31: int i_return;
32:
33: /* Initialize the wrapper structure */
34: wrapper_data.start_routine = start_routine;
35: wrapper_data.arg = arg;
36: getitimer(ITIMER_PROF, &wrapper_data.itimer);
37: pthread_cond_init(&wrapper_data.wait, NULL);
38: pthread_mutex_init(&wrapper_data.lock, NULL);
39: pthread_mutex_lock(&wrapper_data.lock);
40:
41: /* The real pthread_create call */
42: i_return = pthread_create(thread, attr, &wrapper_routine,
43: &wrapper_data);
44:
45: /* If the thread was successfully spawned, wait for the data
46: * to be released */
47: if(i_return == 0)
48: {
49: pthread_cond_wait(&wrapper_data.wait, &wrapper_data.lock);
50: }
51:
52: pthread_mutex_unlock(&wrapper_data.lock);
53: pthread_mutex_destroy(&wrapper_data.lock);
54: pthread_cond_destroy(&wrapper_data.wait);
55:
56: return i_return;
57: }
58:
59: /* The wrapper function in charge for setting the itimer value */
60: static void * wrapper_routine(void * data)
61: {
62: /* Put user data in thread-local variables */
63: void * (*start_routine)(void *) = ((wrapper_t*)data)->start_routine;
64: void * arg = ((wrapper_t*)data)->arg;
65:
66: /* Set the profile timer value */
67: setitimer(ITIMER_PROF, &((wrapper_t*)data)->itimer, NULL);
68:
69: /* Tell the calling thread that we don't need its data anymore */
70: pthread_mutex_lock(&((wrapper_t*)data)->lock);
71: pthread_cond_signal(&((wrapper_t*)data)->wait);
72: pthread_mutex_unlock(&((wrapper_t*)data)->lock);
73:
74: /* Call the real function */
75: return start_routine(arg);
76: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>