X-Git-Url: https://git.harvie.cz/?a=blobdiff_plain;f=c%2Fpthread_extra%2Fpthread_user_data.c;h=74ae1145c46511d7ed34021ee678fae8b1dede94;hb=46a7758b58eeff9b507e6e173b03b7fd909e22c3;hp=e0ba979be0c90751aac8e92429e31f162d6290d3;hpb=238a70320639c49bc44c74588fd94cd435dfa4c3;p=mirrors%2FPrograms.git diff --git a/c/pthread_extra/pthread_user_data.c b/c/pthread_extra/pthread_user_data.c index e0ba979..74ae114 100644 --- a/c/pthread_extra/pthread_user_data.c +++ b/c/pthread_extra/pthread_user_data.c @@ -1,5 +1,6 @@ #define __PTHREAD_EXTRA_INTERNAL +//#include #include #include #include @@ -7,16 +8,16 @@ //Static array with user data for all thread handles //TODO: perhaps use something more sophisticated like linked list? pthread_user_data_internal_t pthread_user_data[PTHREAD_XTHREADS_MAX+1] = {{.tid=PTHREAD_XNULL}}; -pthread_mutex_t pthread_user_data_mutex = PTHREAD_MUTEX_INITIALIZER; +pthread_mutex_t pthread_user_data_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; int pthread_user_data_lock() { - pthread_pause_disable(); + //pthread_pause_disable(); return pthread_mutex_lock(&pthread_user_data_mutex); } int pthread_user_data_unlock() { pthread_mutex_unlock(&pthread_user_data_mutex); - pthread_pause_enable(); + //pthread_pause_enable(); return 0; } @@ -36,6 +37,8 @@ pthread_user_data_internal_t* pthread_user_data_internal(pthread_t thread) { if(pthread_equal(pthread_user_data[i].tid, PTHREAD_XNULL)) { pthread_user_data[i+1].tid = PTHREAD_XNULL; pthread_user_data[i].tid = thread; + pthread_user_data[i].running = 1; //NEW THREADS ARE RUNNING UNLESS PAUSED! + //printf("ADDED %lu = %lu\n", pthread_user_data[i].tid, thread); break; } if(pthread_equal(pthread_user_data[i].tid, thread)) break; @@ -48,6 +51,19 @@ pthread_user_data_internal_t* pthread_user_data_internal(pthread_t thread) { return &pthread_user_data[i]; } +//Iterate specified callback over all registered threads +int pthread_user_data_internal_iterate(int (*routine)(pthread_t), void *arg) { + (void) arg; + int i; + pthread_user_data_lock(); + for(i = 0; iusr;