326 lines
8.3 KiB
PHP
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
|