mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-16 02:49:21 +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
@ -853,24 +853,6 @@ begin
|
|||||||
end;
|
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;
|
function AInitThreads : Boolean;
|
||||||
begin
|
begin
|
||||||
{$ifdef DEBUG_MT}
|
{$ifdef DEBUG_MT}
|
||||||
@ -926,11 +908,6 @@ begin
|
|||||||
rtlEventResetEvent :=@intrtlEventResetEvent;
|
rtlEventResetEvent :=@intrtlEventResetEvent;
|
||||||
rtleventWaitForTimeout :=@intrtleventWaitForTimeout;
|
rtleventWaitForTimeout :=@intrtleventWaitForTimeout;
|
||||||
rtleventWaitFor :=@intrtleventWaitFor;
|
rtleventWaitFor :=@intrtleventWaitFor;
|
||||||
// semaphores
|
|
||||||
SemaphoreInit :=@ASemaphoreInit;
|
|
||||||
SemaphoreDestroy :=@ASemaphoreDestroy;
|
|
||||||
SemaphoreWait :=@ASemaphoreWait;
|
|
||||||
SemaphorePost :=@ASemaphorePost;
|
|
||||||
end;
|
end;
|
||||||
SetThreadManager(AThreadManager);
|
SetThreadManager(AThreadManager);
|
||||||
end;
|
end;
|
||||||
|
@ -330,26 +330,6 @@ begin
|
|||||||
currenttm.rtleventWaitForTimeout(state,timeout);
|
currenttm.rtleventWaitForTimeout(state,timeout);
|
||||||
end;
|
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.
|
ThreadManager which gives run-time error. Use if no thread support.
|
||||||
---------------------------------------------------------------------}
|
---------------------------------------------------------------------}
|
||||||
@ -513,28 +493,6 @@ begin
|
|||||||
end;
|
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
|
const
|
||||||
NoThreadManager : TThreadManager = (
|
NoThreadManager : TThreadManager = (
|
||||||
InitManager : Nil;
|
InitManager : Nil;
|
||||||
@ -573,10 +531,6 @@ const
|
|||||||
rtleventResetEvent : TRTLEventHandler(@NoThreadError);
|
rtleventResetEvent : TRTLEventHandler(@NoThreadError);
|
||||||
rtleventWaitFor : TRTLEventHandler(@NoThreadError);
|
rtleventWaitFor : TRTLEventHandler(@NoThreadError);
|
||||||
rtleventwaitfortimeout : TRTLEventHandlerTimeout(@NoThreadError);
|
rtleventwaitfortimeout : TRTLEventHandlerTimeout(@NoThreadError);
|
||||||
SemaphoreInit : TSempahoreInitHandler(@NoThreadError);
|
|
||||||
SemaphoreDestroy : TSemaphoreDestroyHandler(@NoThreadError);
|
|
||||||
SemaphorePost : TSemaphorePostHandler(@NoThreadError);
|
|
||||||
SemaphoreWait : TSemaphoreWaitHandler(@NoThreadError)
|
|
||||||
{$else EMBEDDED}
|
{$else EMBEDDED}
|
||||||
BeginThread : @NoBeginThread;
|
BeginThread : @NoBeginThread;
|
||||||
EndThread : @NoEndThread;
|
EndThread : @NoEndThread;
|
||||||
@ -609,10 +563,6 @@ const
|
|||||||
rtleventResetEvent : @NoRTLEvent;
|
rtleventResetEvent : @NoRTLEvent;
|
||||||
rtleventWaitFor : @NoRTLEvent;
|
rtleventWaitFor : @NoRTLEvent;
|
||||||
rtleventwaitfortimeout : @NoRTLEventWaitForTimeout;
|
rtleventwaitfortimeout : @NoRTLEventWaitForTimeout;
|
||||||
SemaphoreInit : @NoSemaphoreInit;
|
|
||||||
SemaphoreDestroy : @NoSemaphore;
|
|
||||||
SemaphorePost : @NoSemaphore;
|
|
||||||
SemaphoreWait : @NoSemaphoreWait
|
|
||||||
{$endif EMBEDDED}
|
{$endif EMBEDDED}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -98,11 +98,6 @@ type
|
|||||||
RTLEventResetEvent : TRTLEventHandler;
|
RTLEventResetEvent : TRTLEventHandler;
|
||||||
RTLEventWaitFor : TRTLEventHandler;
|
RTLEventWaitFor : TRTLEventHandler;
|
||||||
RTLEventWaitForTimeout : TRTLEventHandlerTimeout;
|
RTLEventWaitForTimeout : TRTLEventHandlerTimeout;
|
||||||
// semaphores stuff
|
|
||||||
SemaphoreInit : TSempahoreInitHandler;
|
|
||||||
SemaphoreDestroy : TSemaphoreDestroyHandler;
|
|
||||||
SemaphorePost : TSemaphorePostHandler;
|
|
||||||
SemaphoreWait : TSemaphoreWaitHandler;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{*****************************************************************************
|
{*****************************************************************************
|
||||||
@ -175,8 +170,3 @@ procedure RTLeventResetEvent(state:pRTLEvent);
|
|||||||
procedure RTLeventWaitFor(state:pRTLEvent);
|
procedure RTLeventWaitFor(state:pRTLEvent);
|
||||||
procedure RTLeventWaitFor(state:pRTLEvent;timeout : longint);
|
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
|
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
|
type
|
||||||
TPthreadCondition = pthread_cond_t;
|
TPthreadCondition = pthread_cond_t;
|
||||||
@ -1055,11 +871,6 @@ begin
|
|||||||
rtlEventResetEvent :=@intrtlEventResetEvent;
|
rtlEventResetEvent :=@intrtlEventResetEvent;
|
||||||
rtleventWaitForTimeout :=@intrtleventWaitForTimeout;
|
rtleventWaitForTimeout :=@intrtleventWaitForTimeout;
|
||||||
rtleventWaitFor :=@intrtleventWaitFor;
|
rtleventWaitFor :=@intrtleventWaitFor;
|
||||||
// semaphores
|
|
||||||
SemaphoreInit :=@cSemaphoreInit;
|
|
||||||
SemaphoreDestroy :=@cSemaphoreDestroy;
|
|
||||||
SemaphoreWait :=@cSemaphoreWait;
|
|
||||||
SemaphorePost :=@cSemaphorePost;
|
|
||||||
end;
|
end;
|
||||||
SetThreadManager(CThreadManager);
|
SetThreadManager(CThreadManager);
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user