[fpc-pascal] Re: Semaphore problems
Graeme Geldenhuys
graemeg.lists at gmail.com
Mon Jul 24 16:27:03 CEST 2006
Hi Vinzent,
You got me one the right track, I think... :-)
I thought the counter in Semaphores get incremented, but as you stated
(and reading some Man Pages), they get decremented.
I then change my code from:
> > if sem_init(FSemaphore, 0, 1) <> 0 then
> > raise Exception.Create('Failed to create the semaphore');
to ...
> > if sem_init(FSemaphore, 0, FiMaxPoolSize) <> 0 then
> > raise Exception.Create('Failed to create the semaphore');
Which makes more sense now... FiMaxPoolSize is the maximum number of
requests being allow. Having it set to 1, I was only allowed 1, so
after the first Lock, the others ended in a deadlock type situation.
Hence the second iteration freezing the app.
> What I don't understand is why you don't use the "SyncObjs" unit where
> almost all the stuff someone ever needs is nicely laid out in a
> portable and object-oriented way.
I didn't write the original Windows code, just tried to port it as is
to FPC and get the Unit Tests to pass. I will speak to the original
author and see what he thinks of you idea. As long as the code can
still compile under Delphi and FPC, I am sure everything should be
fine.
> > > if sem_wait(FSemaphore) <> 0 then
> > > raise
> > > EtiOPFInternalException.Create(cErrorTimedOutWaitingForSemaphore);
>
> BTW, sem_wait() never returns anything else than zero, so checking is
> sort of useless here. There's sem_trywait() for that, if you really
> need to go so low-level.
I changed it to sem_trywait() which pretty made all my tiPool unit
tests pass. For some strange reason I still get a lock-up, but much
less now. Say once every 5 iterations of the complete test suite
where-as before it was every time on a specific test case. I will now
try and implement the timeout work-around as suggested in the IBM
article below.
I found the IBM article very handy to explain some information.
http://tinyurl.com/n8jq9
Thanks for you time!
Regards,
Graeme.
--
There's no place like 127.0.0.1
More information about the fpc-pascal
mailing list