Hi,
I initially posted this in the fpc-pascal list, but I think fpc-devel is maybe more appropriate, because the pthreads include files might need amendment.
I'm trying to get tiOPF to compile under FreeBSD. It works under Linux and Windows without problems.
I got compiler errors using FPC 2.6.0 under FreeBSD, saying that the compiler couldn't decide which version of the sem_* methods to use.
I had code like this in tiOPF:
{$IFDEF MSWINDOWS}
FSemaphore: THandle;
{$ENDIF MSWINDOWS}
{$IFDEF UNIX}
FSemaphore: TSemaphore;
{$ENDIF UNIX}
...
procedure TtiPool.CreatePoolSemaphore;
begin
{$IFDEF MSWINDOWS}
if FSemaphore 0 then
CloseHandle(FSemaphore);
FSemaphore := CreateSemaphore(nil, FMaxPoolSize, FMaxPoolSize, nil);
{$ENDIF MSWINDOWS}
{$IFDEF UNIX}
FillChar(FSemaphore, sizeof(FSemaphore), 0);
// pShared = 0 means, shared between the threads of a process
writeln('FMaxPoolSize = ', FMaxPoolSize);
if sem_init(@FSemaphore, 0, FMaxPoolSize) 0 then
raise EtiOPFInternalException.Create('Failed to initialize the
semaphore');
{$ENDIF UNIX}
end;Note the sem_init() call takes a pointer.
As you can see from the quoted code below, FreeBSD has two versions of the sem_* methods. The compiler couldn't decide which version to use:
Error: Can't determine which overloaded function to call
To get it to compiler under FreeBSD, I must change the sem_init() line too the following...
if sem_init(FSemaphore, 0, FMaxPoolSize) 0 then...but this breaks compiling under Linux again.
1) How do I get the tiOPF code to work under both Linux and FreeBSD using a single {$IFDEF UNIX}. I don't really want to introduce {$IFDEF LINUX} and {$IFDEF FREEBSD} in the code.
2) Why does FreeBSD have two versions of these methods and Linux only one? I had a look at the other pthr*.inc units. Linux and SunOS has a single version, BSD (which I believe is MacOSX too) and Haiku has two versions.
----------------[ pthrbsd.inc freebsd ]-------------------
function sem_init(__sem:Psem_t;
__pshared:cint;__value:dword):cint;cdecl; external;
function sem_destroy(__sem:Psem_t):cint;cdecl;external ;
function sem_close(__sem:Psem_t):cint;cdecl;external ;
function sem_unlink(__name:Pchar):cint;cdecl;external ;
function sem_wait(__sem:Psem_t):cint;cdecl;external ;
function sem_trywait(__sem:Psem_t):cint;cdecl;external ;
function sem_post(__sem:Psem_t):cint;cdecl;external ;
function sem_getvalue(__sem:Psem_t; __sval:Pcint):cint;cdecl;external;
function sem_init(var __sem: sem_t; __pshared:cint;
__value:dword):cint cdecl;external;
function sem_destroy(var __sem: sem_t):cint;cdecl;external;
function sem_close(var __sem: sem_t):cint;cdecl;external;
function sem_wait(var __sem: sem_t):cint;cdecl;external;
function sem_trywait(var __sem: sem_t):cint;cdecl;external;
function sem_post(var __sem: sem_t):cint;cdecl;external;
function sem_getvalue(var __sem: sem_t; var
__sval:cint):cint;cdecl;external;
--------------------[ end ]----------------------
-------------------[ pthrlinux.inc linux ]---------------------
function sem_init(__sem:Psem_t; __pshared:cint;
__value:dword):cint;cdecl;external libthreads;
function sem_destroy(__sem:Psem_t):cint;cdecl;external libthreads;
function sem_close(__sem:Psem_t):cint;cdecl;external libthreads;
function sem_unlink(__name:Pchar):cint;cdecl;external libthreads;
function sem_wait(__sem:Psem_t):cint;cdecl;external libthreads;
function sem_trywait(__sem:Psem_t):cint;cdecl;external libthreads;
function sem_post(__sem:Psem_t):cint;cdecl;external libthreads;
function sem_getvalue(__sem:Psem_t; __sval:pcint):cint;cdecl;external
libthreads;
function sem_timedwait(__sem: Psem_t; __abstime:
Ptimespec):cint;cdecl; external libthreads;
-------------------[ end ]-----------------------Attached is a small test project using snippets of code that tiOPF uses. The current version of this test project will compiler under FreeBSD, but will not compiler under Linux.
Regards,
- Graeme -
