On 28 Aug 2009, at 14:43, Graeme Geldenhuys wrote:

Graeme Geldenhuys wrote:

As I mentioned in the fpc-pascal mailing list. The current
implementation is wrong and is actually the equivalent of Delphi's
TSimpleRWSync class.

Regarding Florian's comment in the bug tracker. I was using Sleep(100)
which Florian says will slow down the class a lot.

Has anybody got a better solution to this? I guess dropping the Sleep
time even lower might not be the best solution either.

It would make things worse on some platforms, because with very low sleep times you don't even get a context switch on Mac OS X (the routine just spins in user space for a short while).

Any suggestions?

Add a flag that indicates that someone is interested in writing, block it on an rtlevent, and then
a) block new readers on some kind of barrier
b) when all current readers are finished, send the event to wake up the writer c) when the writer is finished, wake up the readers by upping the semaphore d) if other writers arrived in the mean time, they'll contend with the readers over the critical section

Of course, there is at least one small problem with the above scenario, and that is that the thread manager does not implement semaphores on all platforms (wich would be quite helpful to implement the barrier).

I'd suggest to implement it in a platform-dependent way and use the primitives offered by the standard libraries of every platform. It's not like this causes an extra dependency, so why re-implement (and debug) the whole thing in a generic and probably sub-optimal way?


Jonas
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to