From 2bc58279a6e8baf8b4001042a4eb07d29e36b9a7 Mon Sep 17 00:00:00 2001 From: rpj Date: Sun, 19 Jul 1998 16:49:42 +0000 Subject: Mon Jul 20 02:31:05 1998 Ross Johnson * private.c (_pthread_getthreadindex): Implement. --- private.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 private.c 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 +#include +#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; +} -- cgit v1.2.3