|
@@ -12,6 +12,7 @@
|
|
|
|
|
|
**********************************************************************}
|
|
**********************************************************************}
|
|
{$mode objfpc}
|
|
{$mode objfpc}
|
|
|
|
+{$modeswitch advancedrecords}
|
|
{$h+}
|
|
{$h+}
|
|
|
|
|
|
{$IF DEFINED(WINCE) or DEFINED(AIX)}
|
|
{$IF DEFINED(WINCE) or DEFINED(AIX)}
|
|
@@ -75,6 +76,14 @@ type
|
|
procedure Release;virtual;
|
|
procedure Release;virtual;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+ { TLockGuard }
|
|
|
|
+ generic TLockGuard<T:TSynchroObject> = record
|
|
|
|
+ obj: T;
|
|
|
|
+ class operator Initialize(var hdl: TLockGuard);
|
|
|
|
+ class operator Finalize(var hdl: TLockGuard);
|
|
|
|
+ procedure Init(AObj: T);
|
|
|
|
+ end;
|
|
|
|
+
|
|
TCriticalSection = class(TSynchroObject)
|
|
TCriticalSection = class(TSynchroObject)
|
|
private
|
|
private
|
|
CriticalSection : TRTLCriticalSection;
|
|
CriticalSection : TRTLCriticalSection;
|
|
@@ -87,6 +96,8 @@ type
|
|
constructor Create;
|
|
constructor Create;
|
|
destructor Destroy;override;
|
|
destructor Destroy;override;
|
|
end;
|
|
end;
|
|
|
|
+ TCriticalSectionGuard = specialize TLockGuard<TCriticalSection>;
|
|
|
|
+
|
|
THandleObject= class;
|
|
THandleObject= class;
|
|
THandleObjectArray = array of THandleObject;
|
|
THandleObjectArray = array of THandleObject;
|
|
|
|
|
|
@@ -192,6 +203,7 @@ type
|
|
function Release(aCount: Integer): Integer; reintroduce; overload;
|
|
function Release(aCount: Integer): Integer; reintroduce; overload;
|
|
function WaitFor(aTimeout: Cardinal = INFINITE): TWaitResult; override;
|
|
function WaitFor(aTimeout: Cardinal = INFINITE): TWaitResult; override;
|
|
end;
|
|
end;
|
|
|
|
+ TSemaphoreGuard = specialize TLockGuard<TSemaphore>;
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
|
|
|
|
{$IFNDEF NO_MUTEX_SUPPORT}
|
|
{$IFNDEF NO_MUTEX_SUPPORT}
|
|
@@ -209,10 +221,9 @@ type
|
|
procedure Acquire; override;
|
|
procedure Acquire; override;
|
|
procedure Release; override;
|
|
procedure Release; override;
|
|
end;
|
|
end;
|
|
|
|
+ TMutexGuard = specialize TLockGuard<TMutex>;
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
implementation
|
|
implementation
|
|
|
|
|
|
{$ifdef MSWindows}
|
|
{$ifdef MSWindows}
|
|
@@ -1007,4 +1018,25 @@ begin
|
|
end;
|
|
end;
|
|
{$ENDIF NO_MUTEX_SUPPORT}
|
|
{$ENDIF NO_MUTEX_SUPPORT}
|
|
|
|
|
|
|
|
+{ TLockGuard }
|
|
|
|
+
|
|
|
|
+class operator TLockGuard.Initialize(var hdl: TLockGuard);
|
|
|
|
+begin
|
|
|
|
+ hdl.obj := nil;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+class operator TLockGuard.Finalize(var hdl: TLockGuard);
|
|
|
|
+begin
|
|
|
|
+ if (hdl.obj=nil) then
|
|
|
|
+ exit;
|
|
|
|
+ hdl.obj.Release();
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+procedure TLockGuard.Init(AObj:T);
|
|
|
|
+begin
|
|
|
|
+ self.obj := AObj;
|
|
|
|
+ self.obj.Acquire();
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+
|
|
end.
|
|
end.
|