4
#define VTHREAD_VERSION 20001201L
6
/* Header for the Vthread library.
7
** Note that the macro vt_threaded may be defined
8
** outside of vthread.h to suppress threading.
10
** Written by Kiem-Phong Vo
13
#include <ast_common.h>
16
/* ast doesn't do threads yet */
17
#if _PACKAGE_ast && !defined(vt_threaded)
21
#if !defined(vt_threaded) || (defined(vt_threaded) && vt_threaded == 1)
22
#define _may_use_threads 1
24
#define _may_use_threads 0
28
#if _may_use_threads && !defined(vt_threaded) && _hdr_pthread
31
typedef pthread_mutex_t _vtmtx_t;
32
typedef pthread_once_t _vtonce_t;
33
typedef pthread_t _vtself_t;
34
typedef pthread_t _vtid_t;
35
typedef pthread_attr_t _vtattr_t;
37
#if !defined(PTHREAD_ONCE_INIT) && defined(pthread_once_init)
38
#define PTHREAD_ONCE_INIT pthread_once_init
43
#if _may_use_threads && !defined(vt_threaded) && _WIN32
46
typedef CRITICAL_SECTION _vtmtx_t;
47
typedef int _vtonce_t;
48
typedef HANDLE _vtself_t;
49
typedef DWORD _vtid_t;
50
typedef SECURITY_ATTRIBUTES _vtattr_t;
57
/* common attributes for various structures */
58
#define VT_RUNNING 000000001 /* thread is running */
59
#define VT_SUSPENDED 000000002 /* thread is suspended */
60
#define VT_WAITED 000000004 /* thread has been waited */
61
#define VT_FREE 000010000 /* object can be freed */
62
#define VT_INIT 000020000 /* object was initialized */
63
#define VT_BITS 000030007 /* bits that we care about */
65
/* directives for vtset() */
66
#define VT_STACK 1 /* set stack size */
68
typedef struct _vtmutex_s Vtmutex_t;
69
typedef struct _vtonce_s Vtonce_t;
70
typedef struct _vthread_s Vthread_t;
87
extern Vthread_t* vtopen _ARG_((Vthread_t*, int));
88
extern int vtclose _ARG_((Vthread_t*));
89
extern int vtset _ARG_((Vthread_t*, int, Void_t*));
90
extern int vtrun _ARG_((Vthread_t*, void*(*)(void*), void*));
91
extern int vtkill _ARG_((Vthread_t*));
92
extern int vtwait _ARG_((Vthread_t*));
94
extern int vtonce _ARG_((Vtonce_t*, void(*)() ));
96
extern Vtmutex_t* vtmtxopen _ARG_((Vtmutex_t*, int));
97
extern int vtmtxclose _ARG_((Vtmutex_t*));
98
extern int vtmtxlock _ARG_((Vtmutex_t*));
99
extern int vtmtxtrylock _ARG_((Vtmutex_t*));
100
extern int vtmtxunlock _ARG_((Vtmutex_t*));
101
extern int vtmtxclrlock _ARG_((Vtmutex_t*));
103
extern Void_t* vtstatus _ARG_((Vthread_t*));
104
extern int vterror _ARG_((Vthread_t*));
105
extern int vtmtxerror _ARG_((Vtmutex_t*));
106
extern int vtonceerror _ARG_((Vtonce_t*));
112
/* mutex structure */
121
/* structure for states of thread */
123
{ _vtself_t self; /* self-handle */
124
_vtid_t id; /* thread id */
125
_vtattr_t attrs; /* attributes */
126
size_t stack; /* stack size */
127
int state; /* execution state */
128
int error; /* error status */
129
Void_t* exit; /* exit value */
132
/* structure for exactly once execution */
140
#define VTONCE_INITDATA {0, 0}
142
#define VTONCE_INITDATA {0, PTHREAD_ONCE_INIT }
145
#define vtstatus(vt) ((vt)->exit)
146
#define vterror(vt) ((vt)->error)
147
#define vtmtxerror(mtx) ((mtx)->error)
148
#define vtonceerror(once) ((once)->error)
150
#endif /*vt_threaded*/
152
/* fake structures and functions */
167
#define VTONCE_INITDATA {0}
169
#define vtopen(vt,flgs) ((Vthread_t*)0)
170
#define vtclose(vt) (-1)
171
#define vtkill(vt) (-1)
172
#define vtwait(vt) (-1)
173
#define vtrun(vt,fn,arg) (-1)
175
#define vtset(vt,t,v) (-1)
176
#define vtonce(on,fu) (-1)
178
#define vtmtxopen(mtx,flgs) ((Vtmutex_t*)0)
179
#define vtmtxclose(mtx) (-1)
180
#define vtmtxlock(mtx) (-1)
181
#define vtmtxtrylock(mtx) (-1)
182
#define vtmtxunlock(mtx) (-1)
183
#define vtmtxclrlock(mtx) (-1)
185
#define vtstatus(vt) ((Void_t*)0)
186
#define vterror(vt) (0)
187
#define vtmtxerror(mtx) (0)
188
#define vtonceerror(once) (0)
190
#endif /*!vt_threaded*/
192
#endif /*_VTHREAD_H*/