From 67bd4775fdf82daa982bd00556a17f71e388e9df Mon Sep 17 00:00:00 2001 From: sergei Date: Tue, 20 Sep 2016 20:14:36 +0000 Subject: [PATCH] - 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 - --- rtl/amicommon/athreads.pp | 23 ----- rtl/inc/thread.inc | 50 ---------- rtl/inc/threadh.inc | 10 -- rtl/unix/cthreads.pp | 189 -------------------------------------- 4 files changed, 272 deletions(-) diff --git a/rtl/amicommon/athreads.pp b/rtl/amicommon/athreads.pp index eb344f17bd..f90888718e 100644 --- a/rtl/amicommon/athreads.pp +++ b/rtl/amicommon/athreads.pp @@ -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; diff --git a/rtl/inc/thread.inc b/rtl/inc/thread.inc index ecadbe8208..e12eaa1322 100644 --- a/rtl/inc/thread.inc +++ b/rtl/inc/thread.inc @@ -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} ); diff --git a/rtl/inc/threadh.inc b/rtl/inc/threadh.inc index 73ec23a8ab..34b6edd7b6 100644 --- a/rtl/inc/threadh.inc +++ b/rtl/inc/threadh.inc @@ -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); - diff --git a/rtl/unix/cthreads.pp b/rtl/unix/cthreads.pp index 2089f31099..d87d6e3f74 100644 --- a/rtl/unix/cthreads.pp +++ b/rtl/unix/cthreads.pp @@ -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;