123 lines
2.4 KiB
ObjectPascal
123 lines
2.4 KiB
ObjectPascal
|
{******************************************}
|
||
|
{ }
|
||
|
{ FastReport VCL }
|
||
|
{ LCLGTK2 Mutex }
|
||
|
{ }
|
||
|
{ Copyright (c) 1998-2021 }
|
||
|
{ by Fast Reports Inc. }
|
||
|
{ }
|
||
|
{******************************************}
|
||
|
|
||
|
unit frxMutex_Linux;
|
||
|
|
||
|
interface
|
||
|
|
||
|
uses
|
||
|
Classes, Unix, pthreads;
|
||
|
|
||
|
var
|
||
|
SemList: TList;
|
||
|
GlobMut: pthread_mutex_t;
|
||
|
|
||
|
type
|
||
|
|
||
|
{ TfrxSemafor }
|
||
|
|
||
|
TfrxSemafor = class
|
||
|
private
|
||
|
FMut: pthread_mutex_t;
|
||
|
FKey: String;
|
||
|
FCount: Integer;
|
||
|
public
|
||
|
constructor Create(skey: String);
|
||
|
destructor Destroy; override;
|
||
|
procedure Lock;
|
||
|
procedure Unlock;
|
||
|
|
||
|
property Key: String read FKey write FKey;
|
||
|
property Count: Integer read FCount write FCount;
|
||
|
end;
|
||
|
|
||
|
function CreatefrxSemafor(skey: String): TfrxSemafor;
|
||
|
procedure FreefrxSemafor(var sem: TfrxSemafor);
|
||
|
function FindInSemList(skey: String): Integer;
|
||
|
|
||
|
implementation
|
||
|
|
||
|
function CreatefrxSemafor(skey: String): TfrxSemafor;
|
||
|
var
|
||
|
i: Integer;
|
||
|
begin
|
||
|
pthread_mutex_lock(@GlobMut);
|
||
|
i := FindInSemList(skey);
|
||
|
if (i <> -1) then
|
||
|
begin
|
||
|
Result := TfrxSemafor(SemList.Items[i]);
|
||
|
Result.Count := Result.Count + 1;
|
||
|
end
|
||
|
else
|
||
|
begin
|
||
|
Result := TfrxSemafor.Create(skey);
|
||
|
SemList.Add(Result);
|
||
|
end;
|
||
|
pthread_mutex_unlock(@GlobMut);
|
||
|
end;
|
||
|
|
||
|
procedure FreefrxSemafor(var sem: TfrxSemafor);
|
||
|
begin
|
||
|
pthread_mutex_lock(@GlobMut);
|
||
|
sem.Count := sem.Count - 1;
|
||
|
if (sem.Count = 0) then
|
||
|
begin
|
||
|
sem.Free;
|
||
|
SemList.Delete(FindInSemList(sem.Key));
|
||
|
end;
|
||
|
sem := nil;
|
||
|
pthread_mutex_unlock(@GlobMut);
|
||
|
end;
|
||
|
|
||
|
function FindInSemList(skey: String): Integer;
|
||
|
var
|
||
|
i: Integer;
|
||
|
begin
|
||
|
Result := -1;
|
||
|
for i := 0 to SemList.Count - 1 do
|
||
|
if (TfrxSemafor(SemList.Items[i]).Key = skey) then
|
||
|
begin
|
||
|
Result := i;
|
||
|
break;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
constructor TfrxSemafor.Create(skey: String);
|
||
|
begin
|
||
|
pthread_mutex_init(@FMut, nil);
|
||
|
FCount := 1;
|
||
|
FKey := skey;
|
||
|
end;
|
||
|
|
||
|
destructor TfrxSemafor.Destroy;
|
||
|
begin
|
||
|
pthread_mutex_destroy(@FMut);
|
||
|
inherited;
|
||
|
end;
|
||
|
|
||
|
procedure TfrxSemafor.Lock;
|
||
|
begin
|
||
|
pthread_mutex_lock(@FMut);
|
||
|
end;
|
||
|
|
||
|
procedure TfrxSemafor.Unlock;
|
||
|
begin
|
||
|
pthread_mutex_unlock(@FMut);
|
||
|
end;
|
||
|
|
||
|
initialization
|
||
|
pthread_mutex_init(@GlobMut, nil);
|
||
|
SemList := TList.Create;
|
||
|
|
||
|
finalization
|
||
|
pthread_mutex_destroy(@GlobMut);
|
||
|
SemList.Free;
|
||
|
end.
|