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