mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 09:19:39 +01: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