Pthread pause based on pthread user data
[mirrors/Programs.git] / c / pthread_extra / pthread_user_data.c
CommitLineData
88342701
TM
1#define __PTHREAD_EXTRA_INTERNAL
2
3#include <pthread.h>
4#include <pthread_extra.h>
5
6//Static array with user data for all thread handles
7//TODO: perhaps use something more sophisticated like linked list?
8pthread_user_data_internal_t pthread_user_data[PTHREAD_XTHREADS_MAX+1] = {{.tid=PTHREAD_XNULL}};
9
10//Get pointer to internal record tied to specified thread
11pthread_user_data_internal_t* pthread_user_data_internal(pthread_t thread) {
12 //Return NULL if requested thread handle is NULL
13 if(pthread_equal(thread, PTHREAD_XNULL)) return NULL;
14
15 //Find if the thread is already registered, add it if not
16 //FIXME: recycle slots of destroyed threads!!!
17 pthread_t i;
18 for(i = 0; i<PTHREAD_XTHREADS_MAX; i++) {
19 if(pthread_equal(pthread_user_data[i].tid, PTHREAD_XNULL)) {
20 pthread_user_data[i].tid = thread;
21 pthread_user_data[i+1].tid = PTHREAD_XNULL;
22 break;
23 }
24 if(pthread_equal(pthread_user_data[i].tid, thread)) break;
25 }
26 //Return pointer
27 return &pthread_user_data[i];
28}
29
30//Get pointer to user specified pointer of that thread
31void** pthread_user_data_ptr(pthread_t thread) {
32 return &pthread_user_data_internal(thread)->usr;
33}
34
35//Set user specified pointer for thread
36void pthread_user_data_set(pthread_t thread, void *usr) {
37 *(pthread_user_data_ptr(thread)) = usr;
38}
39
40//Get user specified pointer for thread
41void* pthread_user_data_get(pthread_t thread) {
42 return *(pthread_user_data_ptr(thread));
43}
This page took 0.110159 seconds and 4 git commands to generate.