File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / iftop / threadprof.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 16:57:34 2012 UTC (12 years, 3 months ago) by misho
Branches: iftop, MAIN
CVS tags: v1_0rc4, v0_17p0, v0_17, HEAD
iftop

    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>