diff options
Diffstat (limited to 'X11/Xthreads.h')
-rw-r--r-- | X11/Xthreads.h | 316 |
1 files changed, 316 insertions, 0 deletions
diff --git a/X11/Xthreads.h b/X11/Xthreads.h new file mode 100644 index 000000000..54b5440ad --- /dev/null +++ b/X11/Xthreads.h @@ -0,0 +1,316 @@ +/* + * $Xorg: Xthreads.h,v 1.5 2001/02/09 02:03:23 xorgcvs Exp $ + * + * +Copyright 1993, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + * * + */ +/* $XFree86: Xthreads.h,v 3.10 2001/12/14 19:53:26 dawes Exp $ */ + +#ifndef _XTHREADS_H_ +#define _XTHREADS_H_ + +/* Redefine these to XtMalloc/XtFree or whatever you want before including + * this header file. + */ +#ifndef xmalloc +#define xmalloc malloc +#endif +#ifndef xfree +#define xfree free +#endif + +#ifdef CTHREADS +#include <cthreads.h> +typedef cthread_t xthread_t; +typedef struct condition xcondition_rec; +typedef struct mutex xmutex_rec; +#define xthread_init() cthread_init() +#define xthread_self cthread_self +#define xthread_fork(func,closure) cthread_fork(func,closure) +#define xthread_yield() cthread_yield() +#define xthread_exit(v) cthread_exit(v) +#define xthread_set_name(t,str) cthread_set_name(t,str) +#define xmutex_init(m) mutex_init(m) +#define xmutex_clear(m) mutex_clear(m) +#define xmutex_lock(m) mutex_lock(m) +#define xmutex_unlock(m) mutex_unlock(m) +#define xmutex_set_name(m,str) mutex_set_name(m,str) +#define xcondition_init(cv) condition_init(cv) +#define xcondition_clear(cv) condition_clear(cv) +#define xcondition_wait(cv,m) condition_wait(cv,m) +#define xcondition_signal(cv) condition_signal(cv) +#define xcondition_broadcast(cv) condition_broadcast(cv) +#define xcondition_set_name(cv,str) condition_set_name(cv,str) +#else /* !CTHREADS */ +#if defined(SVR4) && !defined(__sgi) && !defined(_SEQUENT_) +#include <thread.h> +#include <synch.h> +typedef thread_t xthread_t; +typedef thread_key_t xthread_key_t; +typedef cond_t xcondition_rec; +typedef mutex_t xmutex_rec; +#if defined(__UNIXWARE__) +extern xthread_t (*_x11_thr_self)(); +#define xthread_self (_x11_thr_self) +#else +#define xthread_self thr_self +#endif +#define xthread_fork(func,closure) thr_create(NULL,0,func,closure,THR_NEW_LWP|THR_DETACHED,NULL) +#define xthread_yield() thr_yield() +#define xthread_exit(v) thr_exit(v) +#define xthread_key_create(kp,d) thr_keycreate(kp,d) +#ifdef sun +#define xthread_key_delete(k) 0 +#else +#define xthread_key_delete(k) thr_keydelete(k) +#endif +#define xthread_set_specific(k,v) thr_setspecific(k,v) +#define xthread_get_specific(k,vp) thr_getspecific(k,vp) +#define xmutex_init(m) mutex_init(m,USYNC_THREAD,0) +#define xmutex_clear(m) mutex_destroy(m) +#define xmutex_lock(m) mutex_lock(m) +#define xmutex_unlock(m) mutex_unlock(m) +#define xcondition_init(cv) cond_init(cv,USYNC_THREAD,0) +#define xcondition_clear(cv) cond_destroy(cv) +#define xcondition_wait(cv,m) cond_wait(cv,m) +#define xcondition_signal(cv) cond_signal(cv) +#define xcondition_broadcast(cv) cond_broadcast(cv) +#else /* !SVR4 */ +#ifdef WIN32 +#include <X11/Xwindows.h> +typedef DWORD xthread_t; +typedef DWORD xthread_key_t; +struct _xthread_waiter { + HANDLE sem; + struct _xthread_waiter *next; +}; +typedef struct { + CRITICAL_SECTION cs; + struct _xthread_waiter *waiters; +} xcondition_rec; +typedef CRITICAL_SECTION xmutex_rec; +#define xthread_init() _Xthread_init() +#define xthread_self GetCurrentThreadId +#define xthread_fork(func,closure) { \ + DWORD _tmptid; \ + CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)func, (LPVOID)closure, 0, \ + &_tmptid); \ +} +#define xthread_yield() Sleep(0) +#define xthread_exit(v) ExitThread((DWORD)(v)) +#define xthread_key_create(kp,d) *(kp) = TlsAlloc() +#define xthread_key_delete(k) TlsFree(k) +#define xthread_set_specific(k,v) TlsSetValue(k,v) +#define xthread_get_specific(k,vp) TlsGetValue(k) +#define xmutex_init(m) InitializeCriticalSection(m) +#define xmutex_clear(m) DeleteCriticalSection(m) +#define _XMUTEX_NESTS +#define xmutex_lock(m) EnterCriticalSection(m) +#define xmutex_unlock(m) LeaveCriticalSection(m) +#define xcondition_init(cv) { \ + InitializeCriticalSection(&(cv)->cs); \ + (cv)->waiters = NULL; \ +} +#define xcondition_clear(cv) DeleteCriticalSection(&(cv)->cs) +extern struct _xthread_waiter *_Xthread_waiter(); +#define xcondition_wait(cv,m) { \ + struct _xthread_waiter *_tmpthr = _Xthread_waiter(); \ + EnterCriticalSection(&(cv)->cs); \ + _tmpthr->next = (cv)->waiters; \ + (cv)->waiters = _tmpthr; \ + LeaveCriticalSection(&(cv)->cs); \ + LeaveCriticalSection(m); \ + WaitForSingleObject(_tmpthr->sem, INFINITE); \ + EnterCriticalSection(m); \ +} +#define xcondition_signal(cv) { \ + EnterCriticalSection(&(cv)->cs); \ + if ((cv)->waiters) { \ + ReleaseSemaphore((cv)->waiters->sem, 1, NULL); \ + (cv)->waiters = (cv)->waiters->next; \ + } \ + LeaveCriticalSection(&(cv)->cs); \ +} +#define xcondition_broadcast(cv) { \ + struct _xthread_waiter *_tmpthr; \ + EnterCriticalSection(&(cv)->cs); \ + for (_tmpthr = (cv)->waiters; _tmpthr; _tmpthr = _tmpthr->next) \ + ReleaseSemaphore(_tmpthr->sem, 1, NULL); \ + (cv)->waiters = NULL; \ + LeaveCriticalSection(&(cv)->cs); \ +} +#else /* !WIN32 */ +#ifdef USE_TIS_SUPPORT +/* + * TIS support is intended for thread safe libraries. + * This should not be used for general client programming. + */ +#include <tis.h> +typedef pthread_t xthread_t; +typedef pthread_key_t xthread_key_t; +typedef pthread_cond_t xcondition_rec; +typedef pthread_mutex_t xmutex_rec; +#define xthread_self tis_self +#define xthread_fork(func,closure) { pthread_t _tmpxthr; \ + pthread_create(&_tmpxthr,NULL,func,closure); } +#define xthread_yield() pthread_yield_np() +#define xthread_exit(v) pthread_exit(v) +#define xthread_key_create(kp,d) tis_key_create(kp,d) +#define xthread_key_delete(k) tis_key_delete(k) +#define xthread_set_specific(k,v) tis_setspecific(k,v) +#define xthread_get_specific(k,vp) *(vp) = tis_getspecific(k) +#define XMUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER +#define xmutex_init(m) tis_mutex_init(m) +#define xmutex_clear(m) tis_mutex_destroy(m) +#define xmutex_lock(m) tis_mutex_lock(m) +#define xmutex_unlock(m) tis_mutex_unlock(m) +#define xcondition_init(c) tis_cond_init(c) +#define xcondition_clear(c) tis_cond_destroy(c) +#define xcondition_wait(c,m) tis_cond_wait(c,m) +#define xcondition_signal(c) tis_cond_signal(c) +#define xcondition_broadcast(c) tis_cond_broadcast(c) +#else +#ifdef USE_NBSD_THREADLIB +/* + * NetBSD threadlib support is intended for thread safe libraries. + * This should not be used for general client programming. + */ +#include <threadlib.h> +typedef thr_t xthread_t; +typedef thread_key_t xthread_key_t; +typedef cond_t xcondition_rec; +typedef mutex_t xmutex_rec; +#define xthread_self thr_self +#define xthread_fork(func,closure) { thr_t _tmpxthr; \ + /* XXX Create it detached? --thorpej */ \ + thr_create(&_tmpxthr,NULL,func,closure); } +#define xthread_yield() thr_yield() +#define xthread_exit(v) thr_exit(v) +#define xthread_key_create(kp,d) thr_keycreate(kp,d) +#define xthread_key_delete(k) thr_keydelete(k) +#define xthread_set_specific(k,v) thr_setspecific(k,v) +#define xthread_get_specific(k,vp) *(vp) = thr_getspecific(k) +#define XMUTEX_INITIALIZER MUTEX_INITIALIZER +#define xmutex_init(m) mutex_init(m, 0) +#define xmutex_clear(m) mutex_destroy(m) +#define xmutex_lock(m) mutex_lock(m) +#define xmutex_unlock(m) mutex_unlock(m) +#define xcondition_init(c) cond_init(c, 0, 0) +#define xcondition_clear(c) cond_destroy(c) +#define xcondition_wait(c,m) cond_wait(c,m) +#define xcondition_signal(c) cond_signal(c) +#define xcondition_broadcast(c) cond_broadcast(c) +#else +#include <pthread.h> +typedef pthread_t xthread_t; +typedef pthread_key_t xthread_key_t; +typedef pthread_cond_t xcondition_rec; +typedef pthread_mutex_t xmutex_rec; +#define xthread_self pthread_self +#define xthread_yield() pthread_yield() +#define xthread_exit(v) pthread_exit(v) +#define xthread_set_specific(k,v) pthread_setspecific(k,v) +#define xmutex_clear(m) pthread_mutex_destroy(m) +#define xmutex_lock(m) pthread_mutex_lock(m) +#define xmutex_unlock(m) pthread_mutex_unlock(m) +#ifndef XPRE_STANDARD_API +#define xthread_key_create(kp,d) pthread_key_create(kp,d) +#define xthread_key_delete(k) pthread_key_delete(k) +#define xthread_get_specific(k,vp) *(vp) = pthread_getspecific(k) +#define xthread_fork(func,closure) { pthread_t _tmpxthr; \ + pthread_create(&_tmpxthr,NULL,func,closure); } +#define XMUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER +#define xmutex_init(m) pthread_mutex_init(m, NULL) +#define xcondition_init(c) pthread_cond_init(c, NULL) +#else /* XPRE_STANDARD_API */ +#define xthread_key_create(kp,d) pthread_keycreate(kp,d) +#define xthread_key_delete(k) 0 +#define xthread_get_specific(k,vp) pthread_getspecific(k,vp) +#define xthread_fork(func,closure) { pthread_t _tmpxthr; \ + pthread_create(&_tmpxthr,pthread_attr_default,func,closure); } +#define xmutex_init(m) pthread_mutex_init(m, pthread_mutexattr_default) +#define xcondition_init(c) pthread_cond_init(c, pthread_condattr_default) +#endif /* XPRE_STANDARD_API */ +#define xcondition_clear(c) pthread_cond_destroy(c) +#define xcondition_wait(c,m) pthread_cond_wait(c,m) +#define xcondition_signal(c) pthread_cond_signal(c) +#define xcondition_broadcast(c) pthread_cond_broadcast(c) +#if defined(_DECTHREADS_) +static xthread_t _X_no_thread_id; +#define xthread_have_id(id) !pthread_equal(id, _X_no_thread_id) +#define xthread_clear_id(id) id = _X_no_thread_id +#define xthread_equal(id1,id2) pthread_equal(id1, id2) +#endif /* _DECTHREADS_ */ +#if defined(__linux__) +#define xthread_have_id(id) !pthread_equal(id, 0) +#define xthread_clear_id(id) id = 0 +#define xthread_equal(id1,id2) pthread_equal(id1, id2) +#endif /* linux */ +#if defined(_CMA_VENDOR_) && defined(_CMA__IBM) && (_CMA_VENDOR_ == _CMA__IBM) +#ifdef DEBUG /* too much of a hack to enable normally */ +/* see also cma__obj_set_name() */ +#define xmutex_set_name(m,str) ((char**)(m)->field1)[5] = (str) +#define xcondition_set_name(cv,str) ((char**)(cv)->field1)[5] = (str) +#endif /* DEBUG */ +#endif /* _CMA_VENDOR_ == _CMA__IBM */ +#endif /* USE_NBSD_THREADLIB */ +#endif /* USE_TIS_SUPPORT */ +#endif /* WIN32 */ +#endif /* SVR4 */ +#endif /* CTHREADS */ +typedef xcondition_rec *xcondition_t; +typedef xmutex_rec *xmutex_t; +#ifndef xcondition_malloc +#define xcondition_malloc() (xcondition_t)xmalloc(sizeof(xcondition_rec)) +#endif +#ifndef xcondition_free +#define xcondition_free(c) xfree((char *)c) +#endif +#ifndef xmutex_malloc +#define xmutex_malloc() (xmutex_t)xmalloc(sizeof(xmutex_rec)) +#endif +#ifndef xmutex_free +#define xmutex_free(m) xfree((char *)m) +#endif +#ifndef xthread_have_id +#define xthread_have_id(id) id +#endif +#ifndef xthread_clear_id +#define xthread_clear_id(id) id = 0 +#endif +#ifndef xthread_equal +#define xthread_equal(id1,id2) ((id1) == (id2)) +#endif +/* aids understood by some debuggers */ +#ifndef xthread_set_name +#define xthread_set_name(t,str) +#endif +#ifndef xmutex_set_name +#define xmutex_set_name(m,str) +#endif +#ifndef xcondition_set_name +#define xcondition_set_name(cv,str) +#endif + +#endif /* _XTHREADS_H_ */ |