mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-18 10:11:29 +02:00
+ Fixed 1.1 build of syncobjs
This commit is contained in:
parent
cee0f217ec
commit
b12bbefdcf
192
fcl/linux/syncobjs.pp
Normal file
192
fcl/linux/syncobjs.pp
Normal file
@ -0,0 +1,192 @@
|
||||
{
|
||||
$Id$
|
||||
This file is part of the Free Component Library (FCL)
|
||||
Copyright (c) 1998 by Florian Klaempfl
|
||||
member of the Free Pascal development team
|
||||
|
||||
See the file COPYING.FPC, included in this distribution,
|
||||
for details about the copyright.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
**********************************************************************}
|
||||
{$mode objfpc}
|
||||
{$h+}
|
||||
unit syncobjs;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
pthreads,
|
||||
{$ifdef ver1_0}
|
||||
Linux,
|
||||
{$else}
|
||||
unix,
|
||||
{$endif}
|
||||
sysutils;
|
||||
|
||||
type
|
||||
PSecurityAttributes = Pointer;
|
||||
TEventHandle = THandle;
|
||||
TRTLCriticalSection = TPthreadMutex;
|
||||
|
||||
{$I syncobh.inc}
|
||||
|
||||
implementation
|
||||
|
||||
{ ---------------------------------------------------------------------
|
||||
Some wrappers around PThreads.
|
||||
---------------------------------------------------------------------}
|
||||
|
||||
function InitializeCriticalSection(var lpCriticalSection: TRTLCriticalSection): Integer;
|
||||
|
||||
var
|
||||
MAttr : TMutexAttribute;
|
||||
|
||||
begin
|
||||
Result:=pthread_mutexattr_init(@MAttr);
|
||||
if Result=0 then
|
||||
try
|
||||
Result:=pthread_mutexattr_settype(@MAttr, PTHREAD_MUTEX_RECURSIVE);
|
||||
if Result=0 then
|
||||
Result:=pthread_mutex_init(@lpCriticalSection,@MAttr);
|
||||
finally
|
||||
pthread_mutexattr_destroy(@MAttr);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
function EnterCriticalSection(var lpCriticalSection: TRTLCriticalSection) : Integer;
|
||||
|
||||
begin
|
||||
Result:=pthread_mutex_lock(@lpCriticalSection);
|
||||
end;
|
||||
|
||||
function LeaveCriticalSection (var lpCriticalSection: TRTLCriticalSection) : Integer;
|
||||
begin
|
||||
Result:=pthread_mutex_unlock(@lpCriticalSection);
|
||||
end;
|
||||
|
||||
function DeleteCriticalSection(var lpCriticalSection: TRTLCriticalSection) : Integer;
|
||||
begin
|
||||
Result:=pthread_mutex_destroy(@lpCriticalSection);
|
||||
end;
|
||||
|
||||
{ ---------------------------------------------------------------------
|
||||
Real syncobjs implementation
|
||||
---------------------------------------------------------------------}
|
||||
|
||||
{$I syncob.inc}
|
||||
|
||||
|
||||
procedure TCriticalSection.Acquire;
|
||||
|
||||
begin
|
||||
EnterCriticalSection(CriticalSection);
|
||||
end;
|
||||
|
||||
procedure TCriticalSection.Release;
|
||||
|
||||
begin
|
||||
LeaveCriticalSection(CriticalSection);
|
||||
end;
|
||||
|
||||
constructor TCriticalSection.Create;
|
||||
|
||||
begin
|
||||
Inherited Create;
|
||||
InitializeCriticalSection(CriticalSection);
|
||||
end;
|
||||
|
||||
destructor TCriticalSection.Destroy;
|
||||
|
||||
begin
|
||||
DeleteCriticalSection(CriticalSection);
|
||||
end;
|
||||
|
||||
destructor THandleObject.destroy;
|
||||
|
||||
begin
|
||||
end;
|
||||
|
||||
constructor TEventObject.Create(EventAttributes : PSecurityAttributes;
|
||||
AManualReset,InitialState : Boolean;const Name : string);
|
||||
|
||||
begin
|
||||
FManualReset:=AManualReset;
|
||||
FSem:=New(PSemaphore);
|
||||
FEventSection:=TCriticalSection.Create;
|
||||
sem_init(FSem,ord(False),Ord(InitialState));
|
||||
end;
|
||||
|
||||
destructor TEventObject.destroy;
|
||||
|
||||
begin
|
||||
sem_destroy(FSem);
|
||||
end;
|
||||
|
||||
procedure TEventObject.ResetEvent;
|
||||
|
||||
begin
|
||||
While sem_trywait(FSem)=0 do
|
||||
;
|
||||
end;
|
||||
|
||||
procedure TEventObject.SetEvent;
|
||||
|
||||
Var
|
||||
Value : Longint;
|
||||
|
||||
begin
|
||||
FEventSection.Enter;
|
||||
Try
|
||||
sem_getvalue(FSem,@Value);
|
||||
if Value=0 then
|
||||
sem_post(FSem);
|
||||
finally
|
||||
FEventSection.Leave;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
function TEventObject.WaitFor(Timeout : Cardinal) : TWaitResult;
|
||||
|
||||
begin
|
||||
If TimeOut<>Cardinal($FFFFFFFF) then
|
||||
result:=wrError
|
||||
else
|
||||
begin
|
||||
sem_wait(FSem);
|
||||
result:=wrSignaled;
|
||||
if FManualReset then
|
||||
begin
|
||||
FEventSection.Enter;
|
||||
Try
|
||||
resetevent;
|
||||
sem_post(FSem);
|
||||
Finally
|
||||
FEventSection.Leave;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
constructor TSimpleEvent.Create;
|
||||
|
||||
begin
|
||||
inherited Create(nil, True, False, '');
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.2 2002-08-17 02:23:35 michael
|
||||
+ Fixed 1.1 build of syncobjs
|
||||
|
||||
Revision 1.1 2003/06/14 19:14:31 michael
|
||||
+ Initial implementation
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user