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 */
|