summaryrefslogtreecommitdiffstats
path: root/private/crt32/h/os2dll.h
blob: f18229052574e63cdcb08ac06f193ccf6c32cfcb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
/***
*os2dll.h - DLL/Multi-thread include
*
*	Copyright (c) 1987-1993, Microsoft Corporation. All rights reserved.
*
*Purpose:
*
*Revision History:
*	10-27-87  JCR	Module created.
*	11-13-87  SKS	Added _HEAP_LOCK
*	12-15-87  JCR	Added _EXIT_LOCK
*	01-07-88  BCM	Added _SIGNAL_LOCK; upped MAXTHREADID from 16 to 32
*	02-01-88  JCR	Added _dll_mlock/_dll_munlock macros
*	05-02-88  JCR	Added _BHEAP_LOCK
*	06-17-88  JCR	Corrected prototypes for special mthread debug routines
*	08-15-88  JCR	_check_lock now returns int, not void
*	08-22-88  GJF	Modified to also work for the 386 (small model only)
*	06-05-89  JCR	386 mthread support
*	06-09-89  JCR	386: Added values to _tiddata struc (for _beginthread)
*	07-13-89  JCR	386: Added _LOCKTAB_LOCK
*	08-17-89  GJF	Cleanup, now specific to OS/2 2.0 (i.e., 386 flat model)
*	10-30-89  GJF	Fixed copyright
*	01-02-90  JCR	Moved a bunch of definitions from os2dll.inc
*	04-06-90  GJF	Added _INC_OS2DLL stuff and #include <cruntime.h>. Made
*			all function _CALLTYPE2 (for now).
*	04-10-90  GJF	Added prototypes for _[un]lockexit().
*	08-16-90  SBM	Made _terrno and _tdoserrno int, not unsigned
*	09-14-90  GJF	Added _pxcptacttab, _pxcptinfoptr and _fpecode fields
*			to _tiddata struct.
*	10-09-90  GJF	Thread ids are of type unsigned long.
*	12-06-90  SRW	Added _OSFHND_LOCK
*	06-04-91  GJF	Win32 version of multi-thread types and prototypes.
*	08-15-91  GJF	Made _tdoserrno an unsigned long for Win32.
*	08-20-91  JCR	C++ and ANSI naming
*	09-29-91  GJF	Conditionally added prototypes for _getptd_lk
*			and  _getptd1_lk for Win32 under DEBUG.
*	10-03-91  JCR	Added _cvtbuf to _tiddata structure
*	02-17-92  GJF	For Win32, replaced _NFILE_ with _NHANDLE_ and
*			_NSTREAM_.
*	03-06-92  GJF	For Win32, made _[un]mlock_[fh|stream]() macros
*			directly call _[un]lock().
*	03-17-92  GJF	Dropped _namebuf field from _tiddata structure for
*			Win32.
*	08-05-92  GJF	Function calling type and variable type macros.
*	12-03-91  ETC	Added _wtoken to _tiddata, added intl LOCK's;
*			added definition of wchar_t (needed for _wtoken).
*	08-14-92  KRS	Port ETC's _wtoken change from other tree.
*	08-21-92  GJF	Merged 08-05-92 and 08-14-92 versions.
*	12-03-92  KRS	Added _mtoken field for MTHREAD _mbstok().
*	01-21-93  GJF	Removed support for C6-386's _cdecl.
*	02-25-93  GJF	Purged Cruiser support and many outdated definitions
*			and declarations.
*	12-14-93  SKS	Add _freeptd(), which frees per-thread CRT data
*
****/

#ifndef _INC_OS2DLL

#ifdef __cplusplus
extern "C" {
#endif

#include <cruntime.h>

/*
 * Conditional macro definition for function calling type and variable type
 * qualifiers.
 */
#if   ( (_MSC_VER >= 800) && (_M_IX86 >= 300) )

/*
 * Definitions for MS C8-32 (386/486) compiler
 */
#define _CRTAPI1 __cdecl
#define _CRTAPI2 __cdecl

#else

/*
 * Other compilers (e.g., MIPS)
 */
#define _CRTAPI1
#define _CRTAPI2

#endif


/*
 * Define the number of supported handles and streams. The definitions
 * here must exactly match those in internal.h (for _NHANDLE_) and stdio.h
 * (for _NSTREAM_).
 */
#ifdef MTHREAD
#define _NHANDLE_	256
#define _NSTREAM_	40
#else
#define _NHANDLE_	64
#define _NSTREAM_	20
#endif


/* Lock symbols */

/* ---- do not change lock #1 without changing emulator ---- */
#define _SIGNAL_LOCK	1	/* lock for signal() & emulator SignalAddress */
				/* emulator uses \math\include\os2dll.inc     */

#define _IOB_SCAN_LOCK	2	/* _iob[] table lock			*/
#define _TMPNAM_LOCK	3	/* lock global tempnam variables	*/
#define _INPUT_LOCK	4	/* lock for _input() routine		*/
#define _OUTPUT_LOCK	5	/* lock for _output() routine		*/
#define _CSCANF_LOCK	6	/* lock for _cscanf() routine		*/
#define _CPRINTF_LOCK	7	/* lock for _cprintf() routine		*/
#define _CONIO_LOCK	8	/* lock for conio routines		*/
#define _HEAP_LOCK	9	/* lock for heap allocator routines	*/
#define _BHEAP_LOCK	10	/* lock for based heap routines 	*/
#define _TIME_LOCK	11	/* lock for time functions		*/
#define _ENV_LOCK	12	/* lock for environment variables	*/
#define _EXIT_LOCK1	13	/* lock #1 for exit code		*/
#define _EXIT_LOCK2	14	/* lock #2 for exit code		*/
#define _THREADDATA_LOCK 15	/* lock for thread data table		*/
#define _POPEN_LOCK	16	/* lock for _popen/_pclose database	*/
#define _LOCKTAB_LOCK   17      /* lock to protect semaphore lock table */
#define _OSFHND_LOCK    18      /* lock to protect _osfhnd array        */
#define _SETLOCALE_LOCK 19      /* lock for locale handles, etc.        */
#define _LC_COLLATE_LOCK 20     /* lock for LC_COLLATE locale           */
#define _LC_CTYPE_LOCK  21      /* lock for LC_CTYPE locale             */
#define _LC_MONETARY_LOCK 22    /* lock for LC_MONETARY locale          */
#define _LC_NUMERIC_LOCK 23     /* lock for LC_NUMERIC locale           */
#define _LC_TIME_LOCK   24      /* lock for LC_TIME locale              */

#define _STREAM_LOCKS   25      /* Table of stream locks                */

#ifdef	_WIN32_
#define _LAST_STREAM_LOCK  (_STREAM_LOCKS+_NSTREAM_-1)	/* Last stream lock */
#else
#define _LAST_STREAM_LOCK  (_STREAM_LOCKS+_NFILE_-1)	/* Last stream lock */
#endif

#define _FH_LOCKS	   (_LAST_STREAM_LOCK+1)	/* Table of fh locks */

#ifdef	_WIN32_
#define _LAST_FH_LOCK	   (_FH_LOCKS+_NHANDLE_-1)	/* Last fh lock      */
#else
#define _LAST_FH_LOCK	   (_FH_LOCKS+_NFILE_-1)	/* Last fh lock      */
#endif

#define _TOTAL_LOCKS	   (_LAST_FH_LOCK+1)		/* Total number of locks */

#define _LOCK_BIT_INTS	   (_TOTAL_LOCKS/(sizeof(unsigned)*8))+1   /* # of ints to hold lock bits */


/* Multi-thread macros and prototypes */

#ifdef MTHREAD


/* need wchar_t for _wtoken field in _tiddata */
#ifndef _WCHAR_T_DEFINED
typedef unsigned short wchar_t;
#define _WCHAR_T_DEFINED
#endif


extern unsigned long _CRTAPI1 __threadid(void);
#define _threadid	(__threadid())
extern unsigned long _CRTAPI1 __threadhandle(void);
#define _threadhandle	(__threadhandle())


/* Structure for each thread's data */

struct _tiddata {
	unsigned long	_tid;		/* thread ID */
	unsigned long	_thandle;	/* thread handle */

	int		_terrno;	/* errno value */
	unsigned long	_tdoserrno;	/* _doserrno value */
	unsigned int	_fpds;		/* Floating Point data segment */
	unsigned long	_holdrand;	/* rand() seed value */
	char *		_token; 	/* ptr to strtok() token */
	wchar_t *	_wtoken; 	/* ptr to wcstok() token */
#ifdef _MBCS
	unsigned char *	_mtoken; 	/* ptr to _mbstok() token */
#endif

	/* following pointers get malloc'd at runtime */
	char *		_errmsg;	/* ptr to strerror()/_strerror() buff */
	char *		_namebuf0;	/* ptr to tmpnam() buffer */
	char *		_namebuf1;	/* ptr to tmpfile() buffer */
	char *		_asctimebuf;	/* ptr to asctime() buffer */
	void *		_gmtimebuf;	/* ptr to gmtime() structure */
	char *		_cvtbuf;	/* ptr to ecvt()/fcvt buffer */

	/* following fields are needed by _beginthread code */
	void *		_initaddr;	/* initial user thread address */
	void *		_initarg;	/* initial user thread argument */

	/* following three fields are needed to support signal handling and
	 * runtime errors */
	void *		_pxcptacttab;	/* ptr to exception-action table */
	void *		_tpxcptinfoptrs; /* ptr to exception info pointers */
	int		_tfpecode;	/* float point exception code */
	};

typedef struct _tiddata * _ptiddata;

/*
 * Declaration of TLS index used in storing pointers to per-thread data
 * structures.
 */
extern unsigned long __tlsindex;


/* macros */

#define _lock_fh(fh)			_lock(fh+_FH_LOCKS)
#define _lock_str(s)			_lock(s+_STREAM_LOCKS)
#define _lock_fh_check(fh,flag) 	if (flag) _lock_fh(fh)
#define _mlock(l)			_lock(l)
#define _munlock(l)			_unlock(l)
#define _unlock_fh(fh)			_unlock(fh+_FH_LOCKS)
#define _unlock_str(s)			_unlock(s+_STREAM_LOCKS)
#define _unlock_fh_check(fh,flag)	if (flag) _unlock_fh(fh)


/* multi-thread routines */

void _CRTAPI1 _lock(int);
void _CRTAPI1 _lockexit(void);
void _CRTAPI1 _unlock(int);
void _CRTAPI1 _unlockexit(void);

_ptiddata _CRTAPI1 _getptd(void);  /* return address of per-thread CRT data */
void _CRTAPI1 _freeptd(_ptiddata); /* free up the per-thread CRT data blocks */


#else	/* not MTHREAD */


/* macros */
#define _lock_fh(fh)
#define _lock_str(s)
#define _lock_fh_check(fh,flag)
#define _mlock(l)
#define _munlock(l)
#define _unlock_fh(fh)
#define _unlock_str(s)
#define _unlock_fh_check(fh,flag)


#endif	/* MTHREAD */


#ifdef __cplusplus
}
#endif

#define _INC_OS2DLL
#endif	/* _INC_OS2DLL */