mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-15 17:59:45 +02:00
- Cleaned out thread manager semaphore support which was ever implemented only for Unix, and not used since r28965. This also reverts changes to System unit interface introduced in r27665.
git-svn-id: trunk@34542 -
This commit is contained in:
parent
507088d097
commit
67bd4775fd
rtl
@ -853,24 +853,6 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
function ASemaphoreInit: Pointer;
|
||||
begin
|
||||
result:=nil;
|
||||
end;
|
||||
|
||||
procedure ASemaphoreDestroy(const FSem: Pointer);
|
||||
begin
|
||||
end;
|
||||
|
||||
procedure ASemaphoreWait(const FSem: Pointer);
|
||||
begin
|
||||
end;
|
||||
|
||||
procedure ASemaphorePost(const FSem: Pointer);
|
||||
begin
|
||||
end;
|
||||
|
||||
|
||||
function AInitThreads : Boolean;
|
||||
begin
|
||||
{$ifdef DEBUG_MT}
|
||||
@ -926,11 +908,6 @@ begin
|
||||
rtlEventResetEvent :=@intrtlEventResetEvent;
|
||||
rtleventWaitForTimeout :=@intrtleventWaitForTimeout;
|
||||
rtleventWaitFor :=@intrtleventWaitFor;
|
||||
// semaphores
|
||||
SemaphoreInit :=@ASemaphoreInit;
|
||||
SemaphoreDestroy :=@ASemaphoreDestroy;
|
||||
SemaphoreWait :=@ASemaphoreWait;
|
||||
SemaphorePost :=@ASemaphorePost;
|
||||
end;
|
||||
SetThreadManager(AThreadManager);
|
||||
end;
|
||||
|
@ -330,26 +330,6 @@ begin
|
||||
currenttm.rtleventWaitForTimeout(state,timeout);
|
||||
end;
|
||||
|
||||
function SemaphoreInit: pointer;
|
||||
begin
|
||||
result:=currenttm.SemaphoreInit();
|
||||
end;
|
||||
|
||||
procedure SemaphoreDestroy(const sem: pointer);
|
||||
begin
|
||||
currenttm.SemaphoreDestroy(sem);
|
||||
end;
|
||||
|
||||
procedure SemaphoreWait(const sem: pointer);
|
||||
begin
|
||||
currenttm.SemaphoreWait(sem);
|
||||
end;
|
||||
|
||||
procedure SemaphorePost(const sem: pointer);
|
||||
begin
|
||||
currenttm.SemaphorePost(sem);
|
||||
end;
|
||||
|
||||
{ ---------------------------------------------------------------------
|
||||
ThreadManager which gives run-time error. Use if no thread support.
|
||||
---------------------------------------------------------------------}
|
||||
@ -513,28 +493,6 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
function NoSemaphoreInit: Pointer;
|
||||
begin
|
||||
if IsMultiThread then
|
||||
NoThreadError
|
||||
else
|
||||
ThreadingAlreadyUsed:=true;
|
||||
result:=nil;
|
||||
end;
|
||||
|
||||
procedure NoSemaphoreWait(const FSem: Pointer);
|
||||
begin
|
||||
NoThreadError;
|
||||
end;
|
||||
|
||||
procedure NoSemaphore(const FSem: Pointer);
|
||||
begin
|
||||
if IsMultiThread then
|
||||
NoThreadError
|
||||
else
|
||||
ThreadingAlreadyUsed:=true;
|
||||
end;
|
||||
|
||||
const
|
||||
NoThreadManager : TThreadManager = (
|
||||
InitManager : Nil;
|
||||
@ -573,10 +531,6 @@ const
|
||||
rtleventResetEvent : TRTLEventHandler(@NoThreadError);
|
||||
rtleventWaitFor : TRTLEventHandler(@NoThreadError);
|
||||
rtleventwaitfortimeout : TRTLEventHandlerTimeout(@NoThreadError);
|
||||
SemaphoreInit : TSempahoreInitHandler(@NoThreadError);
|
||||
SemaphoreDestroy : TSemaphoreDestroyHandler(@NoThreadError);
|
||||
SemaphorePost : TSemaphorePostHandler(@NoThreadError);
|
||||
SemaphoreWait : TSemaphoreWaitHandler(@NoThreadError)
|
||||
{$else EMBEDDED}
|
||||
BeginThread : @NoBeginThread;
|
||||
EndThread : @NoEndThread;
|
||||
@ -609,10 +563,6 @@ const
|
||||
rtleventResetEvent : @NoRTLEvent;
|
||||
rtleventWaitFor : @NoRTLEvent;
|
||||
rtleventwaitfortimeout : @NoRTLEventWaitForTimeout;
|
||||
SemaphoreInit : @NoSemaphoreInit;
|
||||
SemaphoreDestroy : @NoSemaphore;
|
||||
SemaphorePost : @NoSemaphore;
|
||||
SemaphoreWait : @NoSemaphoreWait
|
||||
{$endif EMBEDDED}
|
||||
);
|
||||
|
||||
|
@ -98,11 +98,6 @@ type
|
||||
RTLEventResetEvent : TRTLEventHandler;
|
||||
RTLEventWaitFor : TRTLEventHandler;
|
||||
RTLEventWaitForTimeout : TRTLEventHandlerTimeout;
|
||||
// semaphores stuff
|
||||
SemaphoreInit : TSempahoreInitHandler;
|
||||
SemaphoreDestroy : TSemaphoreDestroyHandler;
|
||||
SemaphorePost : TSemaphorePostHandler;
|
||||
SemaphoreWait : TSemaphoreWaitHandler;
|
||||
end;
|
||||
|
||||
{*****************************************************************************
|
||||
@ -175,8 +170,3 @@ procedure RTLeventResetEvent(state:pRTLEvent);
|
||||
procedure RTLeventWaitFor(state:pRTLEvent);
|
||||
procedure RTLeventWaitFor(state:pRTLEvent;timeout : longint);
|
||||
|
||||
function SemaphoreInit: Pointer;
|
||||
procedure SemaphoreDestroy(const sem: Pointer);
|
||||
procedure SemaphoreWait(const sem: Pointer);
|
||||
procedure SemaphorePost(const sem: Pointer);
|
||||
|
||||
|
@ -531,190 +531,6 @@ Type PINTRTLEvent = ^TINTRTLEvent;
|
||||
Semaphore routines
|
||||
*****************************************************************************}
|
||||
|
||||
procedure cSemaphoreWait(const FSem: Pointer);
|
||||
var
|
||||
res: cint;
|
||||
err: cint;
|
||||
{$if not defined(has_sem_init) and not defined(has_sem_open)}
|
||||
b: byte;
|
||||
{$endif}
|
||||
begin
|
||||
{$if defined(has_sem_init) or defined(has_sem_open)}
|
||||
repeat
|
||||
res:=sem_wait(PSemaphore(FSem));
|
||||
err:=fpgetCerrno;
|
||||
until (res<>-1) or (err<>ESysEINTR);
|
||||
{$else}
|
||||
repeat
|
||||
res:=fpread(PFilDes(FSem)^[0], b, 1);
|
||||
err:=fpgeterrno;
|
||||
until (res<>-1) or ((err<>ESysEINTR) and (err<>ESysEAgain));
|
||||
{$endif}
|
||||
end;
|
||||
|
||||
{$if defined(has_sem_timedwait)}
|
||||
|
||||
function cSemaphoreTimedWait(const FSem: Pointer; const Timeout: ttimespec): cint;
|
||||
var
|
||||
res: cint;
|
||||
err: cint;
|
||||
begin
|
||||
repeat
|
||||
res:=sem_timedwait(PSemaphore(FSem), @Timeout);
|
||||
if res=0 then exit(0);
|
||||
err:=fpgetCerrno;
|
||||
until err<>ESysEINTR;
|
||||
result:=err;
|
||||
end;
|
||||
|
||||
{$endif}
|
||||
|
||||
procedure cSemaphorePost(const FSem: Pointer);
|
||||
{$if defined(has_sem_init) or defined(has_sem_open)}
|
||||
begin
|
||||
sem_post(PSemaphore(FSem));
|
||||
end;
|
||||
{$else}
|
||||
var
|
||||
writeres: cint;
|
||||
err: cint;
|
||||
b : byte;
|
||||
begin
|
||||
b:=0;
|
||||
repeat
|
||||
writeres:=fpwrite(PFilDes(FSem)^[1], b, 1);
|
||||
err:=fpgeterrno;
|
||||
until (writeres<>-1) or ((err<>ESysEINTR) and (err<>ESysEAgain));
|
||||
end;
|
||||
{$endif}
|
||||
|
||||
|
||||
function cSemaphoreTryWait(const FSem: pointer): TTryWaitResult;
|
||||
var
|
||||
res: cint;
|
||||
err: cint;
|
||||
{$if defined(has_sem_init) or defined(has_sem_open)}
|
||||
begin
|
||||
repeat
|
||||
res:=sem_trywait(FSem);
|
||||
err:=fpgetCerrno;
|
||||
until (res<>-1) or (err<>ESysEINTR);
|
||||
if (res=0) then
|
||||
result:=tw_semwasunlocked
|
||||
else if (err=ESysEAgain) then
|
||||
result:=tw_semwaslocked
|
||||
else
|
||||
result:=tw_error;
|
||||
{$else has_sem_init or has_sem_open}
|
||||
var
|
||||
fds: TFDSet;
|
||||
tv : timeval;
|
||||
begin
|
||||
tv.tv_sec:=0;
|
||||
tv.tv_usec:=0;
|
||||
fpFD_ZERO(fds);
|
||||
fpFD_SET(PFilDes(FSem)^[0],fds);
|
||||
repeat
|
||||
res:=fpselect(PFilDes(FSem)^[0]+1,@fds,nil,nil,@tv);
|
||||
err:=fpgeterrno;
|
||||
until (res>=0) or ((res=-1) and (err<>ESysEIntr));
|
||||
if (res>0) then
|
||||
begin
|
||||
cSemaphoreWait(FSem);
|
||||
result:=tw_semwasunlocked
|
||||
end
|
||||
else if (res=0) then
|
||||
result:=tw_semwaslocked
|
||||
else
|
||||
result:=tw_error;
|
||||
{$endif has_sem_init or has_sem_open}
|
||||
end;
|
||||
|
||||
|
||||
|
||||
|
||||
{$if defined(has_sem_open) and not defined(has_sem_init)}
|
||||
function cIntSemaphoreOpen(const name: pchar; initvalue: boolean): Pointer;
|
||||
var
|
||||
err: cint;
|
||||
begin
|
||||
repeat
|
||||
cIntSemaphoreOpen := sem_open(name,O_CREAT,0,ord(initvalue));
|
||||
err:=fpgetCerrno;
|
||||
until (ptrint(cIntSemaphoreOpen) <> SEM_FAILED) or (err <> ESysEINTR);
|
||||
if (ptrint(cIntSemaphoreOpen) <> SEM_FAILED) then
|
||||
{ immediately unlink so the semaphore will be destroyed when the }
|
||||
{ the process exits }
|
||||
sem_unlink(name)
|
||||
else
|
||||
{ 0 is a valid for sem_open on some platforms; pointer(-1) shouldn't
|
||||
be valid anywhere, even for sem_init }
|
||||
cIntSemaphoreOpen:=pointer(-1);
|
||||
end;
|
||||
{$endif}
|
||||
|
||||
|
||||
function cIntSemaphoreInit(initvalue: boolean): Pointer;
|
||||
{$if defined(has_sem_open) and not defined(has_sem_init)}
|
||||
var
|
||||
tid: string[31];
|
||||
semname: string[63];
|
||||
{$endif}
|
||||
begin
|
||||
{$ifdef has_sem_init}
|
||||
cIntSemaphoreInit := GetMem(SizeOf(TSemaphore));
|
||||
if sem_init(PSemaphore(cIntSemaphoreInit), 0, ord(initvalue)) <> 0 then
|
||||
begin
|
||||
FreeMem(cIntSemaphoreInit);
|
||||
{ 0 is a valid for sem_open on some platforms; pointer(-1) shouldn't
|
||||
be valid anywhere, even for sem_init }
|
||||
cIntSemaphoreInit:=pointer(-1);
|
||||
end;
|
||||
{$else}
|
||||
{$ifdef has_sem_open}
|
||||
{ avoid a potential temporary nameclash with another process/thread }
|
||||
str(fpGetPid,semname);
|
||||
str(ptruint(pthread_self()),tid);
|
||||
semname:='/FPC'+semname+'T'+tid+#0;
|
||||
cIntSemaphoreInit:=cIntSemaphoreOpen(@semname[1],initvalue);
|
||||
{$else}
|
||||
cIntSemaphoreInit := GetMem(SizeOf(TFilDes));
|
||||
if (fppipe(PFilDes(cIntSemaphoreInit)^) <> 0) then
|
||||
begin
|
||||
FreeMem(cIntSemaphoreInit);
|
||||
{ 0 is a valid for sem_open on some platforms; pointer(-1) shouldn't
|
||||
be valid anywhere, even for sem_init }
|
||||
cIntSemaphoreInit:=pointer(-1);
|
||||
end
|
||||
else if initvalue then
|
||||
cSemaphorePost(cIntSemaphoreInit);
|
||||
{$endif}
|
||||
{$endif}
|
||||
end;
|
||||
|
||||
|
||||
function cSemaphoreInit: Pointer;
|
||||
begin
|
||||
cSemaphoreInit:=cIntSemaphoreInit(false);
|
||||
end;
|
||||
|
||||
|
||||
procedure cSemaphoreDestroy(const FSem: Pointer);
|
||||
begin
|
||||
{$ifdef has_sem_init}
|
||||
sem_destroy(PSemaphore(FSem));
|
||||
FreeMem(FSem);
|
||||
{$else}
|
||||
{$ifdef has_sem_open}
|
||||
sem_close(PSemaphore(FSem));
|
||||
{$else has_sem_init}
|
||||
fpclose(PFilDes(FSem)^[0]);
|
||||
fpclose(PFilDes(FSem)^[1]);
|
||||
FreeMem(FSem);
|
||||
{$endif}
|
||||
{$endif}
|
||||
end;
|
||||
|
||||
|
||||
type
|
||||
TPthreadCondition = pthread_cond_t;
|
||||
@ -1055,11 +871,6 @@ begin
|
||||
rtlEventResetEvent :=@intrtlEventResetEvent;
|
||||
rtleventWaitForTimeout :=@intrtleventWaitForTimeout;
|
||||
rtleventWaitFor :=@intrtleventWaitFor;
|
||||
// semaphores
|
||||
SemaphoreInit :=@cSemaphoreInit;
|
||||
SemaphoreDestroy :=@cSemaphoreDestroy;
|
||||
SemaphoreWait :=@cSemaphoreWait;
|
||||
SemaphorePost :=@cSemaphorePost;
|
||||
end;
|
||||
SetThreadManager(CThreadManager);
|
||||
end;
|
||||
|
Loading…
Reference in New Issue
Block a user