12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- #include <pthread.h>
- #include <sys/time.h>
- #undef pthread_create
- typedef struct wrapper_s
- {
- void * (*start_routine)(void *);
- void * arg;
- pthread_mutex_t lock;
- pthread_cond_t wait;
- struct itimerval itimer;
- } wrapper_t;
- static void * wrapper_routine(void *);
- int gprof_pthread_create(pthread_t * thread, pthread_attr_t * attr,
- void * (*start_routine)(void *), void * arg)
- {
- wrapper_t wrapper_data;
- int i_return;
-
- wrapper_data.start_routine = start_routine;
- wrapper_data.arg = arg;
- getitimer(ITIMER_PROF, &wrapper_data.itimer);
- pthread_cond_init(&wrapper_data.wait, NULL);
- pthread_mutex_init(&wrapper_data.lock, NULL);
- pthread_mutex_lock(&wrapper_data.lock);
-
- i_return = pthread_create(thread, attr, &wrapper_routine,
- &wrapper_data);
-
- if(i_return == 0)
- {
- pthread_cond_wait(&wrapper_data.wait, &wrapper_data.lock);
- }
- pthread_mutex_unlock(&wrapper_data.lock);
- pthread_mutex_destroy(&wrapper_data.lock);
- pthread_cond_destroy(&wrapper_data.wait);
- return i_return;
- }
- static void * wrapper_routine(void * data)
- {
-
- void * (*start_routine)(void *) = ((wrapper_t*)data)->start_routine;
- void * arg = ((wrapper_t*)data)->arg;
-
- setitimer(ITIMER_PROF, &((wrapper_t*)data)->itimer, NULL);
-
- pthread_mutex_lock(&((wrapper_t*)data)->lock);
- pthread_cond_signal(&((wrapper_t*)data)->wait);
- pthread_mutex_unlock(&((wrapper_t*)data)->lock);
-
- return start_routine(arg);
- }
|