home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tricks of the Windows Gam…ming Gurus (2nd Edition)
/
Disc2.iso
/
vc98
/
crt
/
src
/
mtdll.h
< prev
next >
Wrap
C/C++ Source or Header
|
1998-06-17
|
11KB
|
357 lines
/***
*mtdll.h - DLL/Multi-thread include
*
* Copyright (c) 1987-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
*
* [Internal]
*
****/
#if _MSC_VER > 1000
#pragma once
#endif /* _MSC_VER > 1000 */
#ifndef _INC_MTDLL
#define _INC_MTDLL
#ifndef _CRTBLD
/*
* This is an internal C runtime header file. It is used when building
* the C runtimes only. It is not to be used as a public header file.
*/
#error ERROR: Use of C runtime library internal header file.
#endif /* _CRTBLD */
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#include <cruntime.h>
/* Define _CRTIMP */
#ifndef _CRTIMP
#ifdef CRTDLL
#define _CRTIMP __declspec(dllexport)
#else /* CRTDLL */
#ifdef _DLL
#define _CRTIMP __declspec(dllimport)
#else /* _DLL */
#define _CRTIMP
#endif /* _DLL */
#endif /* CRTDLL */
#endif /* _CRTIMP */
/* Define __cdecl for non-Microsoft compilers */
#if (!defined (_MSC_VER) && !defined (__cdecl))
#define __cdecl
#endif /* (!defined (_MSC_VER) && !defined (__cdecl)) */
/*
* 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 _WIN32
#define _IOB_ENTRIES 20
#else /* _WIN32 */
/*
* 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 CRTDLL
#define _NHANDLE_ 512 /* *MUST* match the value under ifdef _DLL! */
#define _NSTREAM_ 128 /* *MUST* match the value under ifdef _DLL! */
#else /* CRTDLL */
#ifdef _DLL
#define _NHANDLE_ 512
#define _NSTREAM_ 128
#else /* _DLL */
#ifdef _MT
#define _NHANDLE_ 256
#define _NSTREAM_ 40
#else /* _MT */
#define _NHANDLE_ 64
#define _NSTREAM_ 20
#endif /* _MT */
#endif /* _DLL */
#endif /* CRTDLL */
#endif /* _WIN32 */
/* Lock symbols */
/* ---- do not change lock #1 without changing emulator ---- */
#define _SIGNAL_LOCK 1 /* lock for signal() & emulator SignalAddress */
/* emulator uses \math\include\mtdll.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 Obsolete */
#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 Obsolete */
/* #define _THREADDATA_LOCK 15 Obsolete */
#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 Obsolete */
/* #define _LC_CTYPE_LOCK 21 Obsolete */
/* #define _LC_MONETARY_LOCK 22 Obsolete */
/* #define _LC_NUMERIC_LOCK 23 Obsolete */
/* #define _LC_TIME_LOCK 24 Obsolete */
#define _MB_CP_LOCK 25 /* lock for multibyte code page */
#define _NLG_LOCK 26 /* lock for NLG notifications */
#define _TYPEINFO_LOCK 27 /* lock for type_info access */
#define _STREAM_LOCKS 28 /* Table of stream locks */
#ifdef _WIN32
#define _LAST_STREAM_LOCK (_STREAM_LOCKS+_IOB_ENTRIES-1) /* Last stream lock */
#else /* _WIN32 */
#define _LAST_STREAM_LOCK (_STREAM_LOCKS+_NSTREAM_-1) /* Last stream lock */
#endif /* _WIN32 */
#ifdef _WIN32
#define _TOTAL_LOCKS (_LAST_STREAM_LOCK+1)
#else /* _WIN32 */
#define _FH_LOCKS (_LAST_STREAM_LOCK+1) /* Table of fh locks */
#define _LAST_FH_LOCK (_FH_LOCKS+_NHANDLE_-1) /* Last fh lock */
#define _TOTAL_LOCKS (_LAST_FH_LOCK+1) /* Total number of locks */
#endif /* _WIN32 */
#define _LOCK_BIT_INTS (_TOTAL_LOCKS/(sizeof(unsigned)*8))+1 /* # of ints to hold lock bits */
#ifndef __assembler
/* Multi-thread macros and prototypes */
#if defined (_MT)
#ifdef _WIN32
/* need wchar_t for _wtoken field in _tiddata */
#ifndef _WCHAR_T_DEFINED
typedef unsigned short wchar_t;
#define _WCHAR_T_DEFINED
#endif /* _WCHAR_T_DEFINED */
#endif /* _WIN32 */
_CRTIMP extern unsigned long __cdecl __threadid(void);
#define _threadid (__threadid())
_CRTIMP extern unsigned long __cdecl __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 */
#ifdef _WIN32
wchar_t * _wtoken; /* ptr to wcstok() token */
#endif /* _WIN32 */
unsigned char * _mtoken; /* ptr to _mbstok() token */
/* following pointers get malloc'd at runtime */
char * _errmsg; /* ptr to strerror()/_strerror() buff */
char * _namebuf0; /* ptr to tmpnam() buffer */
#ifdef _WIN32
wchar_t * _wnamebuf0; /* ptr to _wtmpnam() buffer */
#endif /* _WIN32 */
char * _namebuf1; /* ptr to tmpfile() buffer */
#ifdef _WIN32
wchar_t * _wnamebuf1; /* ptr to _wtmpfile() buffer */
#endif /* _WIN32 */
char * _asctimebuf; /* ptr to asctime() buffer */
#ifdef _WIN32
wchar_t * _wasctimebuf; /* ptr to _wasctime() buffer */
#endif /* _WIN32 */
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 */
/* following field is needed by NLG routines */
unsigned long _NLG_dwCode;
/*
* Per-Thread data needed by C++ Exception Handling
*/
void * _terminate; /* terminate() routine */
void * _unexpected; /* unexpected() routine */
void * _translator; /* S.E. translator */
void * _curexception; /* current exception */
void * _curcontext; /* current exception context */
#if defined (_M_MRX000)
void * _pFrameInfoChain;
void * _pUnwindContext;
void * _pExitContext;
int _MipsPtdDelta;
int _MipsPtdEpsilon;
#elif defined (_M_PPC)
void * _pExitContext;
void * _pUnwindContext;
void * _pFrameInfoChain;
int _FrameInfo[6];
#endif /* defined (_M_PPC) */
};
typedef struct _tiddata * _ptiddata;
/*
* Declaration of TLS index used in storing pointers to per-thread data
* structures.
*/
extern unsigned long __tlsindex;
#ifdef _MT
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/*
* Flag indicating whether or not setlocale() is active. Its value is the
* number of setlocale() calls currently active.
*/
_CRTIMP extern int __setlc_active;
/*
* Flag indicating whether or not a function which references the locale
* without having locked it is active. Its value is the number of such
* functions.
*/
_CRTIMP extern int __unguarded_readlc_active;
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _MT */
/* macros */
#define _lock_fh(fh) _lock_fhandle(fh)
#define _lock_str(s) _lock_file(s)
#define _lock_str2(i,s) _lock_file2(i,s)
#define _lock_fh_check(fh,flag) if (flag) _lock_fhandle(fh)
#define _mlock(l) _lock(l)
#define _munlock(l) _unlock(l)
#define _unlock_fh(fh) _unlock_fhandle(fh)
#define _unlock_str(s) _unlock_file(s)
#define _unlock_str2(i,s) _unlock_file2(i,s)
#define _unlock_fh_check(fh,flag) if (flag) _unlock_fhandle(fh)
#define _lock_locale(llf) \
InterlockedIncrement( &__unguarded_readlc_active ); \
if ( __setlc_active ) { \
InterlockedDecrement( &__unguarded_readlc_active ); \
_lock( _SETLOCALE_LOCK ); \
llf = 1; \
} \
else \
llf = 0;
#define _unlock_locale(llf) \
if ( llf ) \
_unlock( _SETLOCALE_LOCK ); \
else \
InterlockedDecrement( &__unguarded_readlc_active );
/* multi-thread routines */
void __cdecl _lock(int);
void __cdecl _lock_file(void *);
void __cdecl _lock_file2(int, void *);
void __cdecl _lock_fhandle(int);
void __cdecl _lockexit(void);
void __cdecl _unlock(int);
void __cdecl _unlock_file(void *);
void __cdecl _unlock_file2(int, void *);
void __cdecl _unlock_fhandle(int);
void __cdecl _unlockexit(void);
_ptiddata __cdecl _getptd(void); /* return address of per-thread CRT data */
void __cdecl _freeptd(_ptiddata); /* free up a per-thread CRT data block */
void __cdecl _initptd(_ptiddata); /* initialize a per-thread CRT data block */
#else /* defined (_MT) */
/* macros */
#define _lock_fh(fh)
#define _lock_str(s)
#define _lock_str2(i,s)
#define _lock_fh_check(fh,flag)
#define _mlock(l)
#define _munlock(l)
#define _unlock_fh(fh)
#define _unlock_str(s)
#define _unlock_str2(i,s)
#define _unlock_fh_check(fh,flag)
#define _lock_locale(llf)
#define _unlock_locale(llf)
#endif /* defined (_MT) */
#endif /* __assembler */
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _INC_MTDLL */