Annotation of embedaddon/iftop/threadprof.c, revision 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>