NT4/private/fp32/inc/i386/os2dll.inc
2020-09-30 17:12:29 +02:00

326 lines
8.3 KiB
PHP

;***
;os2dll.inc - DynaLib/Multi-thread parameter definitions
;
; Copyright (c) 1987-1991, Microsoft Corporation. All rights reserved.
;
;Purpose:
;
;Revision History:
; 10-22-87 JCR Module created
; 11-13-87 SKS Added _HEAP_LOCK
; 11-16-87 JCR Added _mlock/_munlock macros
; 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-03-88 JCR Added _BHEAP_LOCK
; 08-03-88 JCR Bumped maximum file count to 256
; 08-09-88 GJF Added _lock_str/_unlock_str macros
; 08-12-88 JCR 386 version
; 06-02-89 JCR 386 mthread support
; 06-09-89 JCR 386: Added values to _tiddata struc (for _beginthread)
; 07-11-89 JCR 386mt: Corrected _DEBUG_LOCK_SIZE value
; 07-13-89 JCR 386: Added _LOCKTAB_LOCK and some macros
; 09-14-90 GJF Added __pxcptacttab, __pxcptinfoptr and __fpecode
; fields to _tiddata struc.
; 10-03-91 JCR Added _cvtbuf to _tiddata structure
;
;*******************************************************************************
_NFILE_ = 256 ;maximum number of streams
;Lock table offsets
;------------------
;[NOTE: These values must coincide with the values in os2dll.h.]
;[NOTE: do not change _SIGNAL_LOCK without changing emulator's os2dll.inc.]
_SIGNAL_LOCK equ 1 ; lock for signal() and emulator SignalAddress
; emulator uses \math\include\os2dll.inc
_IOB_SCAN_LOCK equ 2 ; _iob[] table lock
_TMPNAM_LOCK equ 3 ; lock global tempnam variables
_INPUT_LOCK equ 4 ; lock for _input() routine
_OUTPUT_LOCK equ 5 ; lock for _output() routine
_CSCANF_LOCK equ 6 ; lock for _cscanf() routine
_CPRINTF_LOCK equ 7 ; lock for _cprintf() routine
_CONIO_LOCK equ 8 ; lock for conio routines
_HEAP_LOCK equ 9 ; lock for heap allocator routines
_BHEAP_LOCK equ 10 ; lock for based heap routines
_TIME_LOCK equ 11 ; lock for time functions
_ENV_LOCK equ 12 ; lock for environment variables
_EXIT_LOCK1 equ 13 ; lock #1 for exit code
_EXIT_LOCK2 equ 14 ; lock #2 for exit code
_THREADDATA_LOCK equ 15 ; lock for thread data table
_POPEN_LOCK equ 16 ; lock for _popen/_pclose database
_SSCANF_LOCK equ 17 ; lock for sscanf() iob
_SPRINTF_LOCK equ 18 ; lock for sprintf() iob
_VSPRINTF_LOCK equ 19 ; lock for vsprintf() iob
_LOCKTAB_LOCK equ 20 ; lock to protect semaphore lock table
_OSFHND_LOCK equ 21 ; lock to protect _osfhnd array
_STREAM_LOCKS equ 21 ; Table of stream locks
_LAST_STREAM_LOCK equ (_STREAM_LOCKS+_NFILE_-1) ; Last stream lock
_FH_LOCKS equ (_LAST_STREAM_LOCK+1) ; Table of fh locks
_LAST_FH_LOCK equ (_FH_LOCKS+_NFILE_-1) ; Last fh lock
_TOTAL_LOCKS equ _LAST_FH_LOCK+1 ; Total number of locks
_LOCK_BIT_INTS equ (_TOTAL_LOCKS/(ISIZE*8))+1; # of ints to hold lock bits
;*** THE FH-LOCK TABLE SHOULD REALLY BASED ON __nfile NOT _NFILE_ ***
IFDEF DEBUG
;General multi-thread values
;---------------------------
MAXTHREADID EQU 32 ; max thread id supported
THREADINTS EQU (MAXTHREADID/(ISIZE*8)) ; # of ints to hold thread bits
;Semaphore debugging lock structure
;----------------------------------
debug_lock struc
% holder DINT THREADINTS dup (0) ;bit set for thread holding lock
% waiters DINT THREADINTS dup (0) ;bit(s) set for threads waiting
% lockcnt DINT 0 ;total # of times lock has been aquired
% collcnt DINT 0 ;total # of lock collisions
debug_lock ends
DEBUG_LOCK_SIZE EQU (2*(THREADINTS*ISIZE))+(2*ISIZE) ;size of debug_lock struct
ENDIF
; Tid Table Definitions
; ---------------------
IFDEF MTHREAD
; Structure for each thread's data
; [NOTE: Tid structure and data must agree with os2dll.h. In addition,
; startup depends on __stkhqq being the third entry in the structure.]
_tiddata struc
% __terrno DINT 0 ; errno value
% __tdoserrno DINT 0 ; _doserrno value
% __stkhqq DINT 0 ; stack limit
% __fpds DINT 0 ; Floating Point data segment
% __holdrand DLONG 0 ; rand() seed value
% __token DDPTR 0 ; * to strtok() token
;following pointers get malloc'd at runtime
% __errmsg DDPTR 0 ; * to strerror()/_strerror() buffer
% __namebuf DDPTR 0 ; * to tmpfile() buffer
% __asctimebuf DDPTR 0 ; * to asctime() buffer
% __gmtimebuf DDPTR 0 ; * to gmtime() structure
% __cvtbuf DDPTR 0 ; * to ecvt()/fcvt() buffer
;following three values needed by _beginthread code
% __initaddr DCPTR 0 ; initial user thread address
% __initarg DDPTR 0 ; initial user thread argument
% __initstksz DINT 0 ; initial stack size (specified by user)
;following three fields are needed to support signal handling and
;runtime errors
% __pxcptacttab DDPTR 0 ; * to exception-action table
% __tpxcptinfoptrs DDPTR 0 ; * to exception info pointers
% __tfpecode DINT 0 ; * float point exception code
_tiddata ends
_TIDDATASIZE = (size _tiddata) ; size of _tiddata entry (bytes)
_TIDSHIFT = 6 ; # of bits to shift to get _TIDSIZE
_TIDSIZE = (1 shl _TIDSHIFT) ; # of bytes in each tid entry (rounded
; to next power of two).
_TID_INCSIZE equ 1000h ; grow thread table a page at a time
_TIDTABGROW = (_TID_INCSIZE/_TIDSIZE) ; table increment (# of tid's per page)
; (must be power of 2!!!)
_TIDTABMASK = (NOT (_TIDTABGROW -1)) ; mask off grow bits
_TID_MAXTID = 1024 ; max # of tids supported
_TID_REGSIZE = (_TID_MAXTID * _TIDSIZE) ; size of tid table region
.ERRE (_TIDSIZE GE _TIDDATASIZE) ; make sure _TIDSIZE >= _TIDDATASIZE
.ERRE ((_TIDSIZE SHR 1) LT _TIDDATASIZE); make sure _TIDSIZE/2 < _TIDDATASIZE
.ERRE (_TIDTABGROW GE 1) ; must be at least 1 !!!
.ERRE (_TID_MAXTID GE _TIDTABGROW) ; make sure _TID_MAXTID >= _TIDTABGROW
ENDIF ;MTHREAD
;Declarations
;------------
;Multi-thread Macros
;-------------------
;_mlock -- Aquire a lock
;Arg = lock number
IFDEF MTHREAD
_mlock MACRO locknum
push locknum
call _lock
add rsp,ISIZE
ENDM
ELSE
_mlock MACRO locknum
ENDM
ENDIF
;_munlock -- Release a lock
;Arg = lock number
IFDEF MTHREAD
_munlock MACRO locknum
push locknum
call _unlock
add rsp,ISIZE
ENDM
ELSE
_munlock MACRO locknum
ENDM
ENDIF
;_mwait -- Wait for a lock but don't aquire it
;Arg = lock number
IFDEF MTHREAD
_mwait MACRO locknum
push locknum
call _waitlock
add rsp,ISIZE
ENDM
ELSE
_mwait MACRO locknum
ENDM
ENDIF
;_lock_fh -- Lock file handle
;Arg = file handle
IFDEF MTHREAD
_lock_fh MACRO fh
push fh
call _lock_file
add rsp,ISIZE
ENDM
ELSE
_lock_fh MACRO fh
ENDM
ENDIF
;_unlock_fh -- Unlock file handle
;Arg = register containing file handle
IFDEF MTHREAD
_unlock_fh MACRO fh
push fh
call _unlock_file
add rsp,ISIZE
ENDM
ELSE
_unlock_fh MACRO fh
ENDM
ENDIF
;_unlock_fh_check -- Unlock file handle if flag is set
;Args: reg = register to use in the macro (e.g., ax)
; file = file handle (e.g., bx or [fh])
; flag = lock/unlock flag (e.g., [lock_flag])
; (0 = no lock/unlock operation)
IFDEF MTHREAD
_unlock_fh_check MACRO reg,file,flag
LOCAL no_unlock ;; local label
mov reg,flag ;; get lock flag
or reg,reg ;; test it
jz no_unlock ;; 0 = no lock/unlock
push file ;; unlock file
call _unlock_file
add rsp,ISIZE
no_unlock:
ENDM
ELSE
_unlock_fh_check MACRO reg,file,flag
ENDM
ENDIF
;_lock_fh_check -- Lock file handle if flag is set
;Args: reg = register to use in the macro (e.g., ax)
; file = file handle (e.g., bx or [fh])
; flag = lock/unlock flag (e.g., [lock_flag])
; (0 = no lock/unlock operation)
IFDEF MTHREAD
_lock_fh_check MACRO reg,file,flag
LOCAL no_lock ;; local label
mov reg,flag ;; get lock flag
or reg,reg ;; test it
jz no_unlock ;; 0 = no lock/unlock
push file ;; lock the file
call _lock_file
add rsp,ISIZE
no_lock:
ENDM
ELSE
_lock_fh_check MACRO reg,file,flag
ENDM
ENDIF
;_lock_str -- Acquire stream lock
;Arg: str = index of stream in _iob[]
IFDEF MTHREAD
_lock_str MACRO str
push str
call _lock_stream
add rsp,ISIZE
ENDM
ELSE
_lock_str MACRO str
ENDM
ENDIF
;_unlock_str -- Unlock stream
;Arg: str = index of stream in _iob[]
IFDEF MTHREAD
_unlock_str MACRO str
push str
call _unlock_stream
add rsp,ISIZE
ENDM
ELSE
_unlock_str MACRO str
ENDM
ENDIF
;_dll_mlock -- Aquire a lock (set/clear DS)
;Arg = lock number
IFDEF _LOAD_DGROUP
IFDEF MTHREAD
_dll_mlock MACRO locknum
push locknum
call _dll_lock
add rsp,ISIZE
ENDM
ELSE
_dll_mlock MACRO locknum
ENDM
ENDIF
ENDIF
;_dll_munlock -- Release a lock (set/clear DS)
;Arg = lock number
IFDEF _LOAD_DGROUP
IFDEF MTHREAD
_dll_munlock MACRO locknum
push locknum
call _dll_unlock
add rsp,ISIZE
ENDM
ELSE
_dll_munlock MACRO locknum
ENDM
ENDIF
ENDIF