X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fglthread%2Fthread.h;h=456d397901fe00ad25b77d2df29902ac334d789d;hb=3c65a6806b208533f681855712e0febf4bb0ed67;hp=1a3b695fcf8a3c23bb95aeb832026a3b0d4a8fab;hpb=96ee65902e40c618aa07b6652152ecd5674815f2;p=gnulib.git diff --git a/lib/glthread/thread.h b/lib/glthread/thread.h index 1a3b695fc..456d39790 100644 --- a/lib/glthread/thread.h +++ b/lib/glthread/thread.h @@ -1,5 +1,5 @@ /* Creating and controlling threads. - Copyright (C) 2005-2008 Free Software Foundation, Inc. + Copyright (C) 2005-2010 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -137,6 +137,9 @@ extern int glthread_in_use (void); /* -------------------------- gl_thread_t datatype -------------------------- */ +/* This choice of gl_thread_t assumes that + pthread_equal (a, b) is equivalent to ((a) == (b)). + This is the case on all platforms in use in 2008. */ typedef pthread_t gl_thread_t; # define glthread_create(THREADP, FUNC, ARG) \ (pthread_in_use () ? pthread_create (THREADP, NULL, FUNC, ARG) : ENOSYS) @@ -277,13 +280,16 @@ extern "C" { /* -------------------------- gl_thread_t datatype -------------------------- */ -/* The gl_thread_t is the thread id, not the thread handle. If it were the - thread handle, it would be hard to implement gl_thread_self() - (since GetCurrentThread () returns a pseudo-handle, - DuplicateHandle (GetCurrentThread ()) returns a handle that must be closed - afterwards, and there is no function for quickly retrieving a thread handle - from its id). */ -typedef DWORD gl_thread_t; +/* The gl_thread_t is a pointer to a structure in memory. + Why not the thread handle? If it were the thread handle, it would be hard + to implement gl_thread_self() (since GetCurrentThread () returns a pseudo- + handle, DuplicateHandle (GetCurrentThread ()) returns a handle that must be + closed afterwards, and there is no function for quickly retrieving a thread + handle from its id). + Why not the thread id? I tried it. It did not work: Sometimes ids appeared + that did not belong to running threads, and glthread_join failed with ESRCH. + */ +typedef struct gl_thread_struct *gl_thread_t; # define glthread_create(THREADP, FUNC, ARG) \ glthread_create_func (THREADP, FUNC, ARG) # define glthread_sigmask(HOW, SET, OSET) \ @@ -291,12 +297,13 @@ typedef DWORD gl_thread_t; # define glthread_join(THREAD, RETVALP) \ glthread_join_func (THREAD, RETVALP) # define gl_thread_self() \ - GetCurrentThreadId () + gl_thread_self_func () # define gl_thread_exit(RETVAL) \ gl_thread_exit_func (RETVAL) # define glthread_atfork(PREPARE_FUNC, PARENT_FUNC, CHILD_FUNC) 0 extern int glthread_create_func (gl_thread_t *threadp, void * (*func) (void *), void *arg); extern int glthread_join_func (gl_thread_t thread, void **retvalp); +extern gl_thread_t gl_thread_self_func (void); extern int gl_thread_exit_func (void *retval); # ifdef __cplusplus