[fpc-pascal] Re: Semaphore problems
Graeme Geldenhuys
graemeg.lists at gmail.com
Mon Jul 24 12:21:36 CEST 2006
Looking at my code, I might have initialized my semaphore incorrectly.
The Windows portion works, and I tried to port it to Linux as follows...
procedure TtiPool.CreatePoolSemaphore;
begin
{$IFDEF MSWINDOWS}
if FSemaphore <> 0 then
CloseHandle( FSemaphore ) ;
FSemaphore := CreateSemaphore( nil, FiMaxPoolSize, FiMaxPoolSize, nil );
{$ENDIF MSWINDOWS}
{$IFDEF LINUX}
sem_destroy( FSemaphore );
if sem_init(FSemaphore, 0, 1) <> 0 then
raise Exception.Create('Failed to create the semaphore');
{$ENDIF LINUX}
end;
Regards,
Graeme.
On 7/24/06, Graeme Geldenhuys <graemeg.lists at gmail.com> wrote:
> Hi,
>
> I am having troubles with porting Semaphores in a project under Linux.
> Under Windows everything works fine, but under Linux my app keeps
> freezing.
>
> The project is tiOPF v2 (TechInsite Object Persistent Framework).
> There is a class called TtiPool, that handles a pool of database
> connections.
>
> When I run the Unit Tests and create a single Lock and the Unlock it,
> all works fine. If I then iterrate that test by creating 10 locks and
> then call unlock 10 times, the Unit Tests freeze on the following line
> with the second iteration:
>
> if sem_wait(FSemaphore) <> 0 then
> raise EtiOPFInternalException.Create(cErrorTimedOutWaitingForSemaphore);
>
> * Under Linux, I am using the "pthreads" unit. What is the difference
> between the cthreads and pthreads unit?
> * The calls I am using from pthreads are:
> * sem_init() to create a semaphore
> * sem_wait() to lock the semaphore
> * sem_post() to unlock the semaphore
> All the above with a variable of type TSemaphore.
>
>
> Now, I have to admit, I don't know much about Semaphore's... Anybody
> know of some good documentation or tutorial on the net?
> Anything obvious I could be doing wrong?
>
> Regards,
> Graeme.
>
> --
> There's no place like 127.0.0.1
>
--
There's no place like 127.0.0.1
More information about the fpc-pascal
mailing list