1*b30d1939SAndy Fiddaman /*********************************************************************** 2*b30d1939SAndy Fiddaman * * 3*b30d1939SAndy Fiddaman * This software is part of the ast package * 4*b30d1939SAndy Fiddaman * Copyright (c) 1985-2011 AT&T Intellectual Property * 5*b30d1939SAndy Fiddaman * and is licensed under the * 6*b30d1939SAndy Fiddaman * Eclipse Public License, Version 1.0 * 7*b30d1939SAndy Fiddaman * by AT&T Intellectual Property * 8*b30d1939SAndy Fiddaman * * 9*b30d1939SAndy Fiddaman * A copy of the License is available at * 10*b30d1939SAndy Fiddaman * http://www.eclipse.org/org/documents/epl-v10.html * 11*b30d1939SAndy Fiddaman * (with md5 checksum b35adb5213ca9657e911e9befb180842) * 12*b30d1939SAndy Fiddaman * * 13*b30d1939SAndy Fiddaman * Information and Software Systems Research * 14*b30d1939SAndy Fiddaman * AT&T Research * 15*b30d1939SAndy Fiddaman * Florham Park NJ * 16*b30d1939SAndy Fiddaman * * 17*b30d1939SAndy Fiddaman * Glenn Fowler <gsf@research.att.com> * 18*b30d1939SAndy Fiddaman * David Korn <dgk@research.att.com> * 19*b30d1939SAndy Fiddaman * Phong Vo <kpv@research.att.com> * 20*b30d1939SAndy Fiddaman * * 21*b30d1939SAndy Fiddaman ***********************************************************************/ 22*b30d1939SAndy Fiddaman #ifndef _VTHREAD_H 23*b30d1939SAndy Fiddaman #define _VTHREAD_H 1 24*b30d1939SAndy Fiddaman 25*b30d1939SAndy Fiddaman #define VTHREAD_VERSION 20001201L 26*b30d1939SAndy Fiddaman 27*b30d1939SAndy Fiddaman /* Header for the Vthread library. 28*b30d1939SAndy Fiddaman ** Note that the macro vt_threaded may be defined 29*b30d1939SAndy Fiddaman ** outside of vthread.h to suppress threading. 30*b30d1939SAndy Fiddaman ** 31*b30d1939SAndy Fiddaman ** Written by Kiem-Phong Vo, kpv@research.att.com 32*b30d1939SAndy Fiddaman */ 33*b30d1939SAndy Fiddaman 34*b30d1939SAndy Fiddaman #include <ast_common.h> 35*b30d1939SAndy Fiddaman #include <errno.h> 36*b30d1939SAndy Fiddaman 37*b30d1939SAndy Fiddaman /* ast doesn't do threads yet */ 38*b30d1939SAndy Fiddaman #if _PACKAGE_ast && !defined(vt_threaded) 39*b30d1939SAndy Fiddaman #define vt_threaded 0 40*b30d1939SAndy Fiddaman #endif 41*b30d1939SAndy Fiddaman 42*b30d1939SAndy Fiddaman #if !defined(vt_threaded) || (defined(vt_threaded) && vt_threaded == 1) 43*b30d1939SAndy Fiddaman #define _may_use_threads 1 44*b30d1939SAndy Fiddaman #else 45*b30d1939SAndy Fiddaman #define _may_use_threads 0 46*b30d1939SAndy Fiddaman #endif 47*b30d1939SAndy Fiddaman #undef vt_threaded 48*b30d1939SAndy Fiddaman 49*b30d1939SAndy Fiddaman #if _may_use_threads && !defined(vt_threaded) && _hdr_pthread 50*b30d1939SAndy Fiddaman #define vt_threaded 1 51*b30d1939SAndy Fiddaman #include <pthread.h> 52*b30d1939SAndy Fiddaman typedef pthread_mutex_t _vtmtx_t; 53*b30d1939SAndy Fiddaman typedef pthread_once_t _vtonce_t; 54*b30d1939SAndy Fiddaman typedef pthread_t _vtself_t; 55*b30d1939SAndy Fiddaman typedef pthread_t _vtid_t; 56*b30d1939SAndy Fiddaman typedef pthread_attr_t _vtattr_t; 57*b30d1939SAndy Fiddaman 58*b30d1939SAndy Fiddaman #if !defined(PTHREAD_ONCE_INIT) && defined(pthread_once_init) 59*b30d1939SAndy Fiddaman #define PTHREAD_ONCE_INIT pthread_once_init 60*b30d1939SAndy Fiddaman #endif 61*b30d1939SAndy Fiddaman 62*b30d1939SAndy Fiddaman #endif 63*b30d1939SAndy Fiddaman 64*b30d1939SAndy Fiddaman #if _may_use_threads && !defined(vt_threaded) && _WIN32 65*b30d1939SAndy Fiddaman #define vt_threaded 1 66*b30d1939SAndy Fiddaman #include <windows.h> 67*b30d1939SAndy Fiddaman typedef CRITICAL_SECTION _vtmtx_t; 68*b30d1939SAndy Fiddaman typedef int _vtonce_t; 69*b30d1939SAndy Fiddaman typedef HANDLE _vtself_t; 70*b30d1939SAndy Fiddaman typedef DWORD _vtid_t; 71*b30d1939SAndy Fiddaman typedef SECURITY_ATTRIBUTES _vtattr_t; 72*b30d1939SAndy Fiddaman #endif 73*b30d1939SAndy Fiddaman 74*b30d1939SAndy Fiddaman #ifndef vt_threaded 75*b30d1939SAndy Fiddaman #define vt_threaded 0 76*b30d1939SAndy Fiddaman #endif 77*b30d1939SAndy Fiddaman 78*b30d1939SAndy Fiddaman /* common attributes for various structures */ 79*b30d1939SAndy Fiddaman #define VT_RUNNING 000000001 /* thread is running */ 80*b30d1939SAndy Fiddaman #define VT_SUSPENDED 000000002 /* thread is suspended */ 81*b30d1939SAndy Fiddaman #define VT_WAITED 000000004 /* thread has been waited */ 82*b30d1939SAndy Fiddaman #define VT_FREE 000010000 /* object can be freed */ 83*b30d1939SAndy Fiddaman #define VT_INIT 000020000 /* object was initialized */ 84*b30d1939SAndy Fiddaman #define VT_BITS 000030007 /* bits that we care about */ 85*b30d1939SAndy Fiddaman 86*b30d1939SAndy Fiddaman /* directives for vtset() */ 87*b30d1939SAndy Fiddaman #define VT_STACK 1 /* set stack size */ 88*b30d1939SAndy Fiddaman 89*b30d1939SAndy Fiddaman typedef struct _vtmutex_s Vtmutex_t; 90*b30d1939SAndy Fiddaman typedef struct _vtonce_s Vtonce_t; 91*b30d1939SAndy Fiddaman typedef struct _vthread_s Vthread_t; 92*b30d1939SAndy Fiddaman 93*b30d1939SAndy Fiddaman #ifndef EINVAL 94*b30d1939SAndy Fiddaman #define EINVAL 22 95*b30d1939SAndy Fiddaman #endif 96*b30d1939SAndy Fiddaman #ifndef EBUSY 97*b30d1939SAndy Fiddaman #define EBUSY 16 98*b30d1939SAndy Fiddaman #endif 99*b30d1939SAndy Fiddaman #ifndef EDEADLK 100*b30d1939SAndy Fiddaman #define EDEADLK 45 101*b30d1939SAndy Fiddaman #endif 102*b30d1939SAndy Fiddaman #ifndef EPERM 103*b30d1939SAndy Fiddaman #define EPERM 1 104*b30d1939SAndy Fiddaman #endif 105*b30d1939SAndy Fiddaman 106*b30d1939SAndy Fiddaman _BEGIN_EXTERNS_ 107*b30d1939SAndy Fiddaman 108*b30d1939SAndy Fiddaman extern Vthread_t* vtopen _ARG_((Vthread_t*, int)); 109*b30d1939SAndy Fiddaman extern int vtclose _ARG_((Vthread_t*)); 110*b30d1939SAndy Fiddaman extern int vtset _ARG_((Vthread_t*, int, Void_t*)); 111*b30d1939SAndy Fiddaman extern int vtrun _ARG_((Vthread_t*, void*(*)(void*), void*)); 112*b30d1939SAndy Fiddaman extern int vtkill _ARG_((Vthread_t*)); 113*b30d1939SAndy Fiddaman extern int vtwait _ARG_((Vthread_t*)); 114*b30d1939SAndy Fiddaman 115*b30d1939SAndy Fiddaman extern int vtonce _ARG_((Vtonce_t*, void(*)() )); 116*b30d1939SAndy Fiddaman 117*b30d1939SAndy Fiddaman extern Vtmutex_t* vtmtxopen _ARG_((Vtmutex_t*, int)); 118*b30d1939SAndy Fiddaman extern int vtmtxclose _ARG_((Vtmutex_t*)); 119*b30d1939SAndy Fiddaman extern int vtmtxlock _ARG_((Vtmutex_t*)); 120*b30d1939SAndy Fiddaman extern int vtmtxtrylock _ARG_((Vtmutex_t*)); 121*b30d1939SAndy Fiddaman extern int vtmtxunlock _ARG_((Vtmutex_t*)); 122*b30d1939SAndy Fiddaman extern int vtmtxclrlock _ARG_((Vtmutex_t*)); 123*b30d1939SAndy Fiddaman 124*b30d1939SAndy Fiddaman extern Void_t* vtstatus _ARG_((Vthread_t*)); 125*b30d1939SAndy Fiddaman extern int vterror _ARG_((Vthread_t*)); 126*b30d1939SAndy Fiddaman extern int vtmtxerror _ARG_((Vtmutex_t*)); 127*b30d1939SAndy Fiddaman extern int vtonceerror _ARG_((Vtonce_t*)); 128*b30d1939SAndy Fiddaman 129*b30d1939SAndy Fiddaman _END_EXTERNS_ 130*b30d1939SAndy Fiddaman 131*b30d1939SAndy Fiddaman #if vt_threaded 132*b30d1939SAndy Fiddaman 133*b30d1939SAndy Fiddaman /* mutex structure */ 134*b30d1939SAndy Fiddaman struct _vtmutex_s 135*b30d1939SAndy Fiddaman { _vtmtx_t lock; 136*b30d1939SAndy Fiddaman int count; 137*b30d1939SAndy Fiddaman _vtid_t owner; 138*b30d1939SAndy Fiddaman int state; 139*b30d1939SAndy Fiddaman int error; 140*b30d1939SAndy Fiddaman }; 141*b30d1939SAndy Fiddaman 142*b30d1939SAndy Fiddaman /* structure for states of thread */ 143*b30d1939SAndy Fiddaman struct _vthread_s 144*b30d1939SAndy Fiddaman { _vtself_t self; /* self-handle */ 145*b30d1939SAndy Fiddaman _vtid_t id; /* thread id */ 146*b30d1939SAndy Fiddaman _vtattr_t attrs; /* attributes */ 147*b30d1939SAndy Fiddaman size_t stack; /* stack size */ 148*b30d1939SAndy Fiddaman int state; /* execution state */ 149*b30d1939SAndy Fiddaman int error; /* error status */ 150*b30d1939SAndy Fiddaman Void_t* exit; /* exit value */ 151*b30d1939SAndy Fiddaman }; 152*b30d1939SAndy Fiddaman 153*b30d1939SAndy Fiddaman /* structure for exactly once execution */ 154*b30d1939SAndy Fiddaman struct _vtonce_s 155*b30d1939SAndy Fiddaman { int done; 156*b30d1939SAndy Fiddaman _vtonce_t once; 157*b30d1939SAndy Fiddaman int error; 158*b30d1939SAndy Fiddaman }; 159*b30d1939SAndy Fiddaman 160*b30d1939SAndy Fiddaman #if _WIN32 161*b30d1939SAndy Fiddaman #define VTONCE_INITDATA {0, 0} 162*b30d1939SAndy Fiddaman #else 163*b30d1939SAndy Fiddaman #define VTONCE_INITDATA {0, PTHREAD_ONCE_INIT } 164*b30d1939SAndy Fiddaman #endif 165*b30d1939SAndy Fiddaman 166*b30d1939SAndy Fiddaman #define vtstatus(vt) ((vt)->exit) 167*b30d1939SAndy Fiddaman #define vterror(vt) ((vt)->error) 168*b30d1939SAndy Fiddaman #define vtmtxerror(mtx) ((mtx)->error) 169*b30d1939SAndy Fiddaman #define vtonceerror(once) ((once)->error) 170*b30d1939SAndy Fiddaman 171*b30d1939SAndy Fiddaman #endif /*vt_threaded*/ 172*b30d1939SAndy Fiddaman 173*b30d1939SAndy Fiddaman /* fake structures and functions */ 174*b30d1939SAndy Fiddaman #if !vt_threaded 175*b30d1939SAndy Fiddaman struct _vtmutex_s 176*b30d1939SAndy Fiddaman { int error; 177*b30d1939SAndy Fiddaman }; 178*b30d1939SAndy Fiddaman struct _vtattr_s 179*b30d1939SAndy Fiddaman { int error; 180*b30d1939SAndy Fiddaman }; 181*b30d1939SAndy Fiddaman struct _vthread_s 182*b30d1939SAndy Fiddaman { int error; 183*b30d1939SAndy Fiddaman }; 184*b30d1939SAndy Fiddaman struct _vtonce_s 185*b30d1939SAndy Fiddaman { int error; 186*b30d1939SAndy Fiddaman }; 187*b30d1939SAndy Fiddaman 188*b30d1939SAndy Fiddaman typedef int _vtmtx_t; 189*b30d1939SAndy Fiddaman typedef int _vtonce_t; 190*b30d1939SAndy Fiddaman typedef int _vtself_t; 191*b30d1939SAndy Fiddaman typedef int _vtid_t; 192*b30d1939SAndy Fiddaman typedef int _vtattr_t; 193*b30d1939SAndy Fiddaman 194*b30d1939SAndy Fiddaman #define VTONCE_INITDATA {0} 195*b30d1939SAndy Fiddaman 196*b30d1939SAndy Fiddaman #define vtopen(vt,flgs) ((Vthread_t*)0) 197*b30d1939SAndy Fiddaman #define vtclose(vt) (-1) 198*b30d1939SAndy Fiddaman #define vtkill(vt) (-1) 199*b30d1939SAndy Fiddaman #define vtwait(vt) (-1) 200*b30d1939SAndy Fiddaman #define vtrun(vt,fn,arg) (-1) 201*b30d1939SAndy Fiddaman 202*b30d1939SAndy Fiddaman #define vtset(vt,t,v) (-1) 203*b30d1939SAndy Fiddaman #define vtonce(on,fu) (-1) 204*b30d1939SAndy Fiddaman 205*b30d1939SAndy Fiddaman #define vtmtxopen(mtx,flgs) ((Vtmutex_t*)0) 206*b30d1939SAndy Fiddaman #define vtmtxclose(mtx) (-1) 207*b30d1939SAndy Fiddaman #define vtmtxlock(mtx) (-1) 208*b30d1939SAndy Fiddaman #define vtmtxtrylock(mtx) (-1) 209*b30d1939SAndy Fiddaman #define vtmtxunlock(mtx) (-1) 210*b30d1939SAndy Fiddaman #define vtmtxclrlock(mtx) (-1) 211*b30d1939SAndy Fiddaman 212*b30d1939SAndy Fiddaman #define vtstatus(vt) ((Void_t*)0) 213*b30d1939SAndy Fiddaman #define vterror(vt) (0) 214*b30d1939SAndy Fiddaman #define vtmtxerror(mtx) (0) 215*b30d1939SAndy Fiddaman #define vtonceerror(once) (0) 216*b30d1939SAndy Fiddaman 217*b30d1939SAndy Fiddaman #endif /*!vt_threaded*/ 218*b30d1939SAndy Fiddaman 219*b30d1939SAndy Fiddaman #endif /*_VTHREAD_H*/ 220