[fpc-devel] Why FreeBSD sem_init() works different to Linux?
Jonas Maebe
jonas.maebe at elis.ugent.be
Fri Feb 8 16:02:49 CET 2013
On 07 Feb 2013, at 16:52, Ewald wrote:
> Altough I still
> don't see how you can make these calls atomic then (without the
> barrier)?
On x86, it is impossible to perform an atomic access without a
(partial) memory barrier that affects all memory (due to the behaviour
of the "lock" prefix). On other architectures, the instructions for
atomic accesses may only lock the cacheline or memory page containing
the value to be atomically modified. I.e., they are only a barrier for
that cacheline/page, not for the entire memory.
Or not even that: older SPARC architectures only had a test-and-set
instruction, which only supported switching between 0 and 1. So
basically you had to use a single global lock variable, which you
locked using this instruction, then you modified the "atomic value"
using regular instructions, and then unlocked the global lock again.
So any atomic update conflicted with any other atomic update,
regardless of where the values were located, and there was no memory
barrier whatsoever (except for this one lock variable). And it only
worked if all code in the entire program made use of the same global
lock variable. It's similar for older ARM CPUs.
Jonas
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20130208/5033f988/attachment.html>
More information about the fpc-devel
mailing list