123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- {
- $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,Linux,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.1 2003-06-14 19:14:31 michael
- + Initial implementation
- }
|