diff options
-rw-r--r-- | private.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/private.c b/private.c new file mode 100644 index 0000000..a880042 --- /dev/null +++ b/private.c @@ -0,0 +1,39 @@ +/* + * private.c + * + * Description: + * This translation unit implements routines which are private to + * the implementation and may be used throughout it. + */ + +#include <windows.h> +#include <process.h> +#include "pthread.h" +#include "implement.h" + +int +_pthread_getthreadindex(pthread_t thread) +{ + /* The hash table works as follows: + hash into the table, + if the thread in this slot doesn't match then start single + stepping from there until we find it. + + The scheme should have these characteristics: + - if the thread handle is a sequence number then the hash will + succeed first time every time, + - if the thread handle is a pseudo randomish value (eg. a pointer) + then the hash should succeed first time most times. + */ + int t = _PTHREAD_HASH_INDEX(*thread); + int it = t; /* The initial thread index */ + + while ((_pthread_threads_table[t])->thread != thread) { + t++; + if (t == PTHREAD_THREADS_MAX) + t = 0; /* Wrap around to the first slot */ + if (t == it) + return -1; /* Failed to find the thread */ + } + return t; +} |