[M3devel] Self() locking slots almost unnecessary -- if only we had "MemoryBarrier".
Tony Hosking
hosking at cs.purdue.edu
Mon Nov 9 03:54:06 CET 2009
It would be nice to use CAS and friends (load-linked/store-
conditional) but they are not portable. It would require target-
dependencies.
On 8 Nov 2009, at 19:44, Jay K wrote:
> I don't know. I just look at all code overly critically..including
> for overly coarse grained locking (which includes some vs. none).
> I guess the argument could be that the critical section -- the part
> of code that executes under the lock -- is very short, so it can't
> make much of a difference.
>
> Writing the global with an "InterlockedExchange" might be good.
>
> Maybe we should add this as a portably available interface?
> "This" being MemoryBarrier and/or well, er, um, I guess you already
> did, the IA64 stuff, which is similar to the Win32 stuff.
> I should update the NT/x86 backend for that stuff and then we can
> move on and use them.
>
> - Jay
>
>
> From: hosking at cs.purdue.edu
> To: jay.krell at cornell.edu
> Date: Sun, 8 Nov 2009 19:39:00 -0500
> CC: m3devel at elegosoft.com
> Subject: Re: [M3devel] Self() locking slots almost unnecessary -- if
> only we had "MemoryBarrier".
>
> Not portably. Different memory models will behave differently. For
> safety we need the lock. But, seriously, how much contention will
> there be?
>
> On 8 Nov 2009, at 19:35, Jay K wrote:
>
> Self() doesn't have to lock slots AS LONG AS in AssignSlot:
>
> SUBARRAY (new_slots^, 0, n) := slots^;
> slots := new_slots;
>
> occurs in the order written.
> That SUBARRAY() := finishes before slots := runs.
> Aggressively compilers/processors need not execute these in the
> order written.
>
> Do we have a way to guarantee that?
>
> Something like:
> SUBARRAY (new_slots^, 0, n) := slots^;
> > MemoryBarrier();
> slots := new_slots;
>
> ?
>
> MemoryBarrier on Windows is implemented as one "special" instruction
> -- for x86, AMD64, and IA64.
> Those implementations are portable to any OS running those
> architectures.
> Though they aren't expressed in a portable form (x86 inline assembly
> and C compiler intrinsincs).
> In particular:
>
> winnt.h:
> amd64:
> #define MemoryBarrier __faststorefence
>
> x86:
> FORCEINLINE
> VOID
> MemoryBarrier (
> VOID
> )
> {
> LONG Barrier;
> __asm {
> xchg Barrier, eax
> }
> }
>
> ia64:
> #define MemoryBarrier __mf
>
>
> - Jay
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20091108/b69fbae6/attachment-0002.html>
More information about the M3devel
mailing list