[M3devel] Self() locking slots almost unnecessary -- if only we had "MemoryBarrier".

Jay K jay.krell at cornell.edu
Mon Nov 9 01:35:01 CET 2009


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/20091109/6a9a13d6/attachment-0001.html>


More information about the M3devel mailing list