Delphi XE10的IDE,作为编译型语言pascal的最主要的集成开发环境,其编译的程序代码在运行时,本质是在执行其编译时就已经解释(Compile)好并将解释好的二进制代码链接(Build)到可执行的DLL或EXE,而其编译过程(或者说其解释和链接)的起点,则在原则单元system.pas,delphi XE10将其列入源码的运行时刻库RTL的系统sys目录下:source\rtl\sys。现对system.pas的逻辑亦即delphi XE10的IDE编译逻辑,诠释如下
以下简要以序号的序数,描述delphi XE10的IDE编译逻辑的过程:
001、描述代码的类别PUREPASCAL和X86ASMRTL
{$IF defined(CPUX86) and defined(ASSEMBLER)}
{$DEFINE X86ASMRTL} //:如果编译环境是X86或汇编,则调用X86或ASM的运行时刻库编译(比如,Win32 API、汇编ASM)
{$ELSE}
{$DEFINE PUREPASCAL} //:否则,使用纯pascal语言
{$ENDIF}
002、描述栈、表、PC映射、MACOS及Linux等的异常全局处理标识符
{$IFNDEF PC_MAPPED_EXCEPTIONS}
{$IF defined(ANDROID)}
{$DEFINE ZCX_BASED_EXCEPTIONS}
{$ELSEIF defined(MACOS)}
{$IF defined(CPUARM32)}
{$DEFINE SJLJ_BASED_EXCEPTIONS}
{$ELSEIF defined(CPUARM64)}
{$DEFINE ZCX_BASED_EXCEPTIONS_MACOS}
{$ELSEIF defined(CPUX64)}
{$DEFINE ZCX_BASED_EXCEPTIONS_MACOS}
{$ENDIF}
{$ELSEIF defined(MSWINDOWS)}
{$IFDEF EXTERNALLINKER}
{$DEFINE ZCX_BASED_EXCEPTIONS}
{$ELSE}
{$IF defined(CPUX86)}
{$DEFINE STACK_BASED_EXCEPTIONS}
{$ELSEIF defined(CPUX64)}
{$DEFINE TABLE_BASED_EXCEPTIONS}
{$ELSE}
{$MESSAGE ERROR 'Unknown platform'}
{$ENDIF}
{$ENDIF !EXTERNALLINKER}
{$ELSEIF defined(LINUX)}
{$IFDEF EXTERNALLINKER}
{$DEFINE ZCX_BASED_EXCEPTIONS}
{$ELSE}
{$DEFINE PC_MAPPED_EXCEPTIONS}
{$ENDIF}
{$ELSE}
{$MESSAGE ERROR 'Unknown platform'}
{$ENDIF}
{$ENDIF !PC_MAPPED_EXCEPTIONS}
003、对扩展的六类不同位长的字节数组(10BYTES、16BYTES、12BYTES、10BYTES、8BYTES)及算术运算(ARITH)的环境和架构的全局处理标识符的约定
EXTENDEDHAS10BYTES
EXTENDEDIS16BYTES 比如: {$IF SizeOf(Extended) = 16}
EXTENDEDIS12BYTES
EXTENDEDIS10BYTES
EXTENDEDIS8BYTES
如果是纯pascal,则:{$DEFINE 下述}
ARITH_PUREPASCAL_EXT80 比如:{$IFDEF CPUX86}
ARITH_PUREPASCAL_EXT64 {$IFDEF CPUX64}
ARITH_USE_LIBM {$IFDEF LINUX}
ARITH_USE_LIBM {$IFDEF CPUARM}
如果是非纯pascal,则:{$DEFINE 下述}
ARITH_X32_FPU 比如:{$IFDEF CPUX86 and ASSEMBLER}
ARITH_PUREPASCAL_EXT80
ARITH_USE_LIBM
ARITH_X64_SSE
ARITH_PUREPASCAL_EXT64
//:以上具体约定细节,详见其源码103-176行次
004、对编译器版本(运行时刻库版本级别)的描述约定
内部使用:RTLVersion和Embedded,比如:{$IF RTLVersion >= 16.2} ... {$ENDIF}
const
RTLVersion = 34.00;
{$HPPEMIT '#define RTLVersionC 3400'}
{$IF (Defined(NEXTGEN) or defined(ANDROID)) and Defined(EMBEDDED)}
Embedded = True;
{$ENDIF}
外部引用:CompilerVersion,比如:{$IF CompilerVersion >= 34} //34 为 Delphi10.4,
005、约定代码的License的描述
const
GPL = True; //General Public License (GPL) :GNU组织进行管理
006、对.hpp/.obj的兼容描述
数据类型
Type
007、很有用的类型的别名的约定Useful alias types
type
{$NODEFINE Int8} // We map 'Shortint' to 'Int8' for C++ above
Int8 = ShortInt;
Int16 = SmallInt;
Int32 = Integer;
IntPtr = NativeInt;
UInt8 = Byte;
UInt16 = Word;
UInt32 = Cardinal;
UIntPtr = NativeUInt;
{$IFDEF MACOS} {mactypes.h}
{$EXTERNALSYM UInt8}
{$EXTERNALSYM UInt16}
{$EXTERNALSYM UInt32}
{$ENDIF}
Float32 = Single;
Float64 = Double;
// 内部使用的别名Internal Aliases:
{$IFDEF NEXTGEN} //:如果定义了下一代
_ShortStr = _ShortString;
_AnsiStr = _AnsiString;
_AnsiChr = _AnsiChar;
_WideStr = _WideString;
_PAnsiChr = _PAnsiChar;
UTF8Char = _AnsiChar;
PUTF8Char = _PAnsiChar;
{$ELSE}
_ShortStr = ShortString;
_AnsiStr = AnsiString;
_AnsiChr = AnsiChar;
_WideStr = WideString;
_PAnsiChr = PAnsiChar;
UTF8Char = AnsiChar;
PUTF8Char = PAnsiChar;
{$ENDIF}
MarshaledString = PWideChar; //:编组或封装的字符串(即多字节字符串)
MarshaledAString = _PAnsiChr; //:编组或封装的字符(即多字节字符)
{$NODEFINE MarshaledString } //弃用
{$NODEFINE MarshaledAString } //弃用
{$NODEFINE _ShortStr } //弃用
{$NODEFINE _WideStr } //弃用
{$NODEFINE _AnsiStr } //弃用
{$NODEFINE _AnsiChr } //弃用
{$NODEFINE _PAnsiChr } //弃用
008、常量-变量类型的编码及序数约定
16进制常量标识符 16进制序数 10进制常量标识符 10进制序数
varEmpty = $0000; { vt_empty 0 }
varNull = $0001; { vt_null 1 }
varSmallint = $0002; { vt_i2 2 }
varInteger = $0003; { vt_i4 3 }
varSingle = $0004; { vt_r4 4 }
varDouble = $0005; { vt_r8 5 }
varCurrency = $0006; { vt_cy 6 }
varDate = $0007; { vt_date 7 }
varOleStr = $0008; { vt_bstr 8 }
varDispatch = $0009; { vt_dispatch 9 }
varError = $000A; { vt_error 10 }
varBoolean = $000B; { vt_bool 11 }
varVariant = $000C; { vt_variant 12 }
varUnknown = $000D; { vt_unknown 13 }
//varDecimal = $000E; { vt_decimal 14 } {UNSUPPORTED as of v6.x code base}
//varUndef0F = $000F; { undefined 15 } {UNSUPPORTED per Microsoft}
varShortInt = $0010; { vt_i1 16 }
varByte = $0011; { vt_ui1 17 }
varWord = $0012; { vt_ui2 18 }
varLongWord = $0013 { vt_ui4 19 } {deprecated 'use varUInt32'} ;
varUInt32 = $0013; { vt_ui4 19 }
varInt64 = $0014; { vt_i8 20 }
varUInt64 = $0015; { vt_ui8 21 }
varRecord = $0024; { VT_RECORD 36 }
{ if adding new items, update Variants' varLast, BaseTypeMap and OpTypeMap }
varStrArg = $0048; { vt_clsid 72 }
varObject = $0049; { 73 }
varUStrArg = $004A; { 74 }
varString = $0100; { Pascal string 256 } {not OLE compatible }
varAny = $0101; { Corba any 257 } {not OLE compatible }
varUString = $0102; { Unicode string 258 } {not OLE compatible }
// custom types range from $110 (272) to $7FF (2047)
varTypeMask = $0FFF;
varArray = $2000;
varByRef = $4000;
009、常量-TVarRec.VType values可变记录的变量类型值的编码及序数约定
vtInteger = 0;
vtBoolean = 1;
vtChar = 2;
vtExtended = 3;
vtString = 4{$IFDEF NEXTGEN} deprecated 'Type not supported' {$ENDIF NEXTGEN};
vtPointer = 5;
vtPChar = 6;
vtObject = 7;
vtClass = 8;
vtWideChar = 9;
vtPWideChar = 10;
vtAnsiString = 11;
vtCurrency = 12;
vtVariant = 13;
vtInterface = 14;
vtWideString = 15;
vtInt64 = 16;
vtUnicodeString = 17;
{$IFDEF AUTOREFCOUNT}
vmtArcOffset = 2 * SizeOf(Pointer);
{$ELSE}
vmtArcOffset = 0;
{$ENDIF}
{$IFDEF CPP_ABI_SUPPORT}
CPP_ABI_ADJUST = 3 * SizeOf(Pointer);
{$ELSE !CPP_ABI_SUPPORT}
CPP_ABI_ADJUST = 0;
{$ENDIF !CPP_ABI_SUPPORT}
010、常量-虚拟方法表入口Virtual method table entries
{$IF defined(CPU64BITS)}
vmtSelfPtr = -176 - vmtArcOffset - CPP_ABI_ADJUST;
vmtIntfTable = -168 - vmtArcOffset - CPP_ABI_ADJUST;
vmtAutoTable = -160 - vmtArcOffset - CPP_ABI_ADJUST;
vmtInitTable = -152 - vmtArcOffset - CPP_ABI_ADJUST;
vmtTypeInfo = -144 - vmtArcOffset - CPP_ABI_ADJUST;
vmtFieldTable = -136 - vmtArcOffset - CPP_ABI_ADJUST;
vmtMethodTable = -128 - vmtArcOffset - CPP_ABI_ADJUST;
vmtDynamicTable = -120 - vmtArcOffset - CPP_ABI_ADJUST;
vmtClassName = -112 - vmtArcOffset - CPP_ABI_ADJUST;
vmtInstanceSize = -104 - vmtArcOffset - CPP_ABI_ADJUST;
vmtParent = -96 - vmtArcOffset - CPP_ABI_ADJUST;
{$IFDEF AUTOREFCOUNT}
vmtObjAddRef = -104 - CPP_ABI_ADJUST deprecated 'Use VMTOFFSET in asm code';
vmtObjRelease = -96 - CPP_ABI_ADJUST deprecated 'Use VMTOFFSET in asm code';
{$ENDIF}
vmtEquals = -88 - CPP_ABI_ADJUST deprecated 'Use VMTOFFSET in asm code';
vmtGetHashCode = -80 - CPP_ABI_ADJUST deprecated 'Use VMTOFFSET in asm code';
vmtToString = -72 - CPP_ABI_ADJUST deprecated 'Use VMTOFFSET in asm code';
vmtSafeCallException = -64 - CPP_ABI_ADJUST deprecated 'Use VMTOFFSET in asm code';
vmtAfterConstruction = -56 - CPP_ABI_ADJUST deprecated 'Use VMTOFFSET in asm code';
vmtBeforeDestruction = -48 - CPP_ABI_ADJUST deprecated 'Use VMTOFFSET in asm code';
vmtDispatch = -40 - CPP_ABI_ADJUST deprecated 'Use VMTOFFSET in asm code';
vmtDefaultHandler = -32 - CPP_ABI_ADJUST deprecated 'Use VMTOFFSET in asm code';
vmtNewInstance = -24 - CPP_ABI_ADJUST deprecated 'Use VMTOFFSET in asm code';
vmtFreeInstance = -16 - CPP_ABI_ADJUST deprecated 'Use VMTOFFSET in asm code';
vmtDestroy = -8 - CPP_ABI_ADJUST deprecated 'Use VMTOFFSET in asm code';
vmtQueryInterface = 0 deprecated 'Use VMTOFFSET in asm code';
vmtAddRef = 8 deprecated 'Use VMTOFFSET in asm code';
vmtRelease = 16 deprecated 'Use VMTOFFSET in asm code';
vmtCreateObject = 24 deprecated 'Use VMTOFFSET in asm code';
{$ELSE !CPU64BITS}
vmtSelfPtr = -88 - vmtArcOffset - CPP_ABI_ADJUST;
vmtIntfTable = -84 - vmtArcOffset - CPP_ABI_ADJUST;
vmtAutoTable = -80 - vmtArcOffset - CPP_ABI_ADJUST;
vmtInitTable = -76 - vmtArcOffset - CPP_ABI_ADJUST;
vmtTypeInfo = -72 - vmtArcOffset - CPP_ABI_ADJUST;
vmtFieldTable = -68 - vmtArcOffset - CPP_ABI_ADJUST;
vmtMethodTable = -64 - vmtArcOffset - CPP_ABI_ADJUST;
vmtDynamicTable = -60 - vmtArcOffset - CPP_ABI_ADJUST;
vmtClassName = -56 - vmtArcOffset - CPP_ABI_ADJUST;
vmtInstanceSize = -52 - vmtArcOffset - CPP_ABI_ADJUST;
vmtParent = -48 - vmtArcOffset - CPP_ABI_ADJUST;
{$IFDEF AUTOREFCOUNT}
vmtObjAddRef = -52 - CPP_ABI_ADJUST deprecated 'Use VMTOFFSET in asm code';
vmtObjRelease = -48 - CPP_ABI_ADJUST deprecated 'Use VMTOFFSET in asm code';
{$ENDIF}
vmtEquals = -44 - CPP_ABI_ADJUST deprecated 'Use VMTOFFSET in asm code';
vmtGetHashCode = -40 - CPP_ABI_ADJUST deprecated 'Use VMTOFFSET in asm code';
vmtToString = -36 - CPP_ABI_ADJUST deprecated 'Use VMTOFFSET in asm code';
vmtSafeCallException = -32 - CPP_ABI_ADJUST deprecated 'Use VMTOFFSET in asm code';
vmtAfterConstruction = -28 - CPP_ABI_ADJUST deprecated 'Use VMTOFFSET in asm code';
vmtBeforeDestruction = -24 - CPP_ABI_ADJUST deprecated 'Use VMTOFFSET in asm code';
vmtDispatch = -20 - CPP_ABI_ADJUST deprecated 'Use VMTOFFSET in asm code';
vmtDefaultHandler = -16 - CPP_ABI_ADJUST deprecated 'Use VMTOFFSET in asm code';
vmtNewInstance = -12 - CPP_ABI_ADJUST deprecated 'Use VMTOFFSET in asm code';
vmtFreeInstance = -8 - CPP_ABI_ADJUST deprecated 'Use VMTOFFSET in asm code';
vmtDestroy = -4 - CPP_ABI_ADJUST deprecated 'Use VMTOFFSET in asm code';
vmtQueryInterface = 0 deprecated 'Use VMTOFFSET in asm code';
vmtAddRef = 4 deprecated 'Use VMTOFFSET in asm code';
vmtRelease = 8 deprecated 'Use VMTOFFSET in asm code';
vmtCreateObject = 12 deprecated 'Use VMTOFFSET in asm code';
{$ENDIF !CPU64BITS}
011、常量-隐藏对象字段信息Hidden TObject field info
hfFieldSize = SizeOf(Pointer);
hfMonitorOffset = 0;
012、运行时类(Type)信息的可见性RTTI Visibility
type
TVisibilityClasses = set of (vcPrivate, vcProtected, vcPublic, vcPublished);
const
//这些常量表示编译器中内置的默认设置。对于类,这些设置通常从TObject继承
DefaultMethodRttiVisibility = [vcPublic, vcPublished]; //:方法的可见性,需要(或继承后)公布Public或发布Published出来
DefaultFieldRttiVisibility = [vcPrivate..vcPublished]; //:字段的可见性,私有或受保护或Public或Published,或继承后公布Public或发布Published出来
DefaultPropertyRttiVisibility = [vcPublic, vcPublished]; //:属性的可见性,需要(或继承后)公布Public或发布Published出来
013、底级别的几个系统类
TArray<T> = array of T; // : 对泛型动态数组的描述方法约定
TObject = class; // : 系统级别的对象SYSTEM_HPP_DEFINES_OBJECTS
TClass = class of TObject; // : TObject的别名: 系统级别的对象SYSTEM_HPP_DEFINES_OBJECTS
HRESULT // : 外部模块的整型表达的约定
{$IFDEF LONGINT64}
HRESULT = type Int32;
{$EXTERNALSYM HRESULT}
{$ELSEIF defined(EXTERNALLINKER)}
HRESULT = type CppLongInt;
{$EXTERNALSYM HRESULT} { long }
{$ELSE}
HRESULT = type LongInt; { from wtypes.h }
{$EXTERNALSYM HRESULT} {$OBJTYPENAME HRESULT 'Bl' 'Gl'} { long }
{$ENDIF}
TGUID全局唯一标识符的记录及其指针:
PGUID = ^TGUID;
TGUID = record
D1: Cardinal;
D2: Word;
D3: Word;
D4: array[0..7] of Byte;
class operator Equal(const Left, Right: TGUID): Boolean; inline;
class operator NotEqual(const Left, Right: TGUID): Boolean; inline;
class function Empty: TGUID; static;
class function Create(const Data; BigEndian: Boolean = False): TGUID; overload; static;
class function Create(const Data: array of Byte; AStartIndex: Cardinal; BigEndian: Boolean = False): TGUID; overload; static;
function IsEmpty: Boolean;
end;
TInterfaceEntry接口的入口的封装记录及其指针:
PInterfaceEntry = ^TInterfaceEntry;
TInterfaceEntry = packed record
IID: TGUID;
VTable: Pointer;
IOffset: Integer;
{$IF defined(CPU64BITS)}
_Filler: UInt32;
{$ENDIF}
ImplGetter: NativeUInt;
end;
TInterfaceTable接口表的封装记录及其指针:
PInterfaceTable = ^TInterfaceTable;
TInterfaceTable = packed record
EntryCount: Integer;
{$IF defined(CPU64BITS)}
_Filler: UInt32;
{$ENDIF}
Entries: array[0..9999{EntryCount - 1}] of TInterfaceEntry;
{Intfs: array[0..EntryCount - 1] of PPTypeInfo;}
end;
TMethod方法(的代码及数据)记录及其指针:
PMethod = ^TMethod;
TMethod = record
Code, Data: Pointer;
public
class operator Equal(const Left, Right: TMethod): Boolean; inline;
class operator NotEqual(const Left, Right: TMethod): Boolean; inline;
class operator GreaterThan(const Left, Right: TMethod): Boolean; inline;
class operator GreaterThanOrEqual(const Left, Right: TMethod): Boolean; inline;
class operator LessThan(const Left, Right: TMethod): Boolean; inline;
class operator LessThanOrEqual(const Left, Right: TMethod): Boolean; inline;
end;
消息及其传递机制:
TObject.Dispatch接受任何数据类型作为其消息参数。在对象的消息方法中,数据的前2个字节作为要搜索的消息id(MsgID)。TDispatchMessage是这样一种结构,其中包含消息id(MsgID)的字段。比如:
TDispatchMessage = record
MsgID: Word;
end;
对象的祖先类(TObject)的描述:
TObject = class
public
constructor Create;
procedure Free;
procedure DisposeOf; {$IFNDEF AUTOREFCOUNT} inline; {$ENDIF}
class function InitInstance(Instance: Pointer): TObject {$IFDEF AUTOREFCOUNT} unsafe {$ENDIF};
procedure CleanupInstance;
function ClassType: TClass; inline;
class function ClassName: string;
class function ClassNameIs(const Name: string): Boolean;
class function ClassParent: TClass;
class function ClassInfo: Pointer; inline;
class function InstanceSize: Integer; inline;
class function InheritsFrom(AClass: TClass): Boolean;
class function MethodAddress(const Name: _ShortStr): Pointer; overload;
class function MethodAddress(const Name: string): Pointer; overload;
class function MethodName(Address: Pointer): string;
class function QualifiedClassName: string;
function FieldAddress(const Name: _ShortStr): Pointer; overload;
function FieldAddress(const Name: string): Pointer; overload;
function GetInterface(const IID: TGUID; out Obj): Boolean;
class function GetInterfaceEntry(const IID: TGUID): PInterfaceEntry;
class function GetInterfaceTable: PInterfaceTable; inline;
class function UnitName: string;
class function UnitScope: string;
{$IFDEF AUTOREFCOUNT}
function __ObjAddRef: Integer; virtual;
function __ObjRelease: Integer; virtual;
{$ENDIF}
function Equals(Obj: TObject): Boolean; virtual;
function GetHashCode: Integer; virtual;
function ToString: string; virtual;
function SafeCallException(ExceptObject: TObject;
ExceptAddr: Pointer): HResult; virtual;
procedure AfterConstruction; virtual;
procedure BeforeDestruction; virtual;
procedure Dispatch(var Message); virtual;
procedure DefaultHandler(var Message); virtual;
class function NewInstance: TObject {$IFDEF AUTOREFCOUNT} unsafe {$ENDIF}; virtual;
procedure FreeInstance; virtual;
{$IFDEF AUTOREFCOUNT}
protected
{$ENDIF}
destructor Destroy; virtual;
{$IFDEF CPP_ABI_SUPPORT}
procedure CPP_ABI_1; virtual;
procedure CPP_ABI_2; virtual;
procedure CPP_ABI_3; virtual;
{$ENDIF !CPP_ABI_SUPPORT}
protected
function GetDisposed: Boolean; inline;
procedure CheckDisposed; {$IFNDEF AUTOREFCOUNT} inline; {$ENDIF}
{$IFDEF AUTOREFCOUNT}
private const
objDestroyingFlag = Integer($80000000);
objDisposedFlag = Integer($40000000);
protected
[Volatile] FRefCount: Integer;
class procedure __MarkDestroying(const Obj); static; inline;
class function __SetDisposed(const Obj): Boolean; static; inline;
public
property RefCount: Integer read FRefCount;
{$ENDIF AUTOREFCOUNT}
property Disposed: Boolean read GetDisposed;
end;
类或对象的属性的基类(RTTI单元中)的描述:
TCustomAttribute = class(TObject)
end;
类或对象的其它几类继承属性的描述:
WeakAttribute = class(TCustomAttribute);
UnsafeAttribute = class(TCustomAttribute);
RefAttribute = class(TCustomAttribute);
VolatileAttribute = class(TCustomAttribute);
StoredAttribute = class(TCustomAttribute);
HPPGENAttribute = class(TCustomAttribute);
只能在类或对象的内部使用(比如设计时等)继承属性的描述:
HFAAttribute = class(TCustomAttribute);
AlignAttribute = class(TCustomAttribute);
014、就开始说线程啦:
{$IFDEF NEXTGEN}
CheckForCyclesProc = procedure (const Obj: TObject); //:线程内部的自旋匿名过程
{$ENDIF NEXTGEN}
{$IF Defined(MSWINDOWS)}
TThreadID = LongWord; //:识别线程的唯一标志:长字(无符号)
{$ENDIF}
{$IFDEF POSIX}
TThreadID = NativeUInt; //:识别线程的唯一标志:无符号整型
{$ENDIF}
PPMonitor = ^PMonitor;
PMonitor = ^TMonitor;
TMonitor = record //:实例化对象的线程安全监视器记录
//......
public
class procedure SetSpinCount(const AObject: TObject; ASpinCount: Integer); static;
class procedure Enter(const AObject: TObject); overload; static; inline;
class function Enter(const AObject: TObject; Timeout: Cardinal): Boolean; overload; static;
class procedure Exit(const AObject: TObject); overload; static;
class function TryEnter(const AObject: TObject): Boolean; overload; static;
class function Wait(const AObject: TObject; Timeout: Cardinal): Boolean; overload; static;
class function Wait(const AObject, ALock: TObject; Timeout: Cardinal): Boolean; overload; static;
class procedure Pulse(const AObject: TObject); overload; static;
class procedure PulseAll(const AObject: TObject); overload; static;
class property DefaultSpinCount: Integer read FDefaultSpinCount write SetDefaultSpinCount;
end;
线程等待相关的无限大(Cardinal的序数的高位)的无符号常量整数:
const
INFINITE = Cardinal($FFFFFFFF); {$EXTERNALSYM INFINITE}
线程安全相关的几个重要方法:
function MonitorEnter(const AObject: TObject; Timeout: Cardinal = INFINITE): Boolean; inline;
function MonitorTryEnter(const AObject: TObject): Boolean; inline;
procedure MonitorExit(const AObject: TObject); inline;
function MonitorWait(const AObject: TObject; Timeout: Cardinal): Boolean; inline; overload;
function MonitorWait(const AObject, ALock: TObject; Timeout: Cardinal): Boolean; inline; overload;
procedure MonitorPulse(const AObject: TObject); inline;
procedure MonitorPulseAll(const AObject: TObject); inline;
// Note: MemoryBarrier is now standard function.
//procedure MemoryBarrier;
procedure YieldProcessor; {$EXTERNALSYM YieldProcessor }
// : 现在讲到第947行了 ,先休息休息,接下来又讲!