<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Verdana
}
--></style>
</head>
<body class='hmmessage'>
Can we adapt:<BR>
 Solaris /usr/include/atomic.h <BR> windows.h Interlocked* <BR> <A href="http://gee.cs.oswego.edu/dl/jmm/cookbook.html">http://gee.cs.oswego.edu/dl/jmm/cookbook.html</A> <BR> <A href="http://gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html">http://gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html</A> <BR>
<BR> <BR>
into something in m3core? <BR>
Starting with the Atomic.i3 I just put in?<BR>
<BR>Probably each function should take some sort of void*<BR>that is a pthread_mutex_t or Win32 CRITICAL_SECTION<BR>
<BR>and the fallback would use it?<BR>
<BR>The hard part would be:<BR>  Well, maybe not much.<BR>  There is the matter of compilers we don't have ready access to and gcc < 4.<BR>  But we don't really support systems we don't have access to.<BR>  After the current release I will be look into more ports, including possibly<BR>    using other non-gcc compilers like on AIX, Irix, HP-UX.<BR>  But again, a fallback to use a lock might not be terrible.<BR>  If we have the systems, then we have the compiler, man pages, headers.<BR>  If we don't have them, then we don't support them.<BR>  The system is fairly portable but I'm not sure we deem it portable to systems<BR>   we don't have. A fine line maybe.<BR>  Besides, gcc is widespread AND we depend heavily on the gcc backend. It's not<BR>   like we can easily have a backend on a system that doesn't have a gcc frontend.<BR>
  gcc < 4 on OpenBSD is probably the tough one. I've had OpenBSD/x86, OpenBSD/amd64,<BR>
  OpenBSD/powerpc, OpenBSD/sparc64 installed recently (all put ppc probably still installed).<BR>
  I only know offhand that OpenBSD 4.5/x86 uses gcc 3.3.5.<BR>
 <BR>
<BR>I realize "lock free" programming is dangerous and maybe not very profitable.<BR>But I am still a moth drawn to the flame.<BR>
<BR> <BR>
Ok to reduce the locking now of pthread slots?<BR>
(actually I have to run for a day or a week..)<BR><BR>
 - Jay<BR><BR>
 <BR>
<HR id=stopSpelling>
From: jay.krell@cornell.edu<BR>To: hosking@cs.purdue.edu<BR>CC: m3devel@elegosoft.com<BR>Subject: RE: [M3devel] Self() locking slots almost unnecessary -- if only we had "MemoryBarrier".<BR>Date: Mon, 9 Nov 2009 04:23:49 +0000<BR><BR>
<STYLE>
.ExternalClass .ecxhmmessage P
{padding:0px;}
.ExternalClass body.ecxhmmessage
{font-size:10pt;font-family:Verdana;}
</STYLE>
How about a per thread never contented pthread_mutex_t?<BR>As a fallback.<BR>And add what we can as we do the research for others?<BR>Anything using gcc would probably be supported right away.<BR>Win32 would be supported.<BR>Leaving only SOLgnu for now but probably we can find out what to do there.<BR> <BR>Hm. a little bit of searching the web:<BR> <BR> <BR><A href="http://gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html">http://gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html</A><BR><A href="http://gee.cs.oswego.edu/dl/jmm/cookbook.html">http://gee.cs.oswego.edu/dl/jmm/cookbook.html</A><BR><BR>It looks like:<BR> <BR>#if defined(__sun)<BR>#Include <atomic.h><BR>void Atomic__MemoryBarrier(void)<BR>{<BR>  membar_producer();<BR>  membar_consumer();<BR>}<BR><BR>#elif defined(__GNUC__)<BR><BR>void Atomic__MemoryBarrier(void)<BR>{<BR>  __sync_synchronize();<BR>}<BR><BR>#elif defined(_WIN32)<BR><BR>void Atomic__MemoryBarrier(void)<BR>{<BR>  MemoryBarrier();<BR>}<BR> <BR>#else<BR> <BR>#error  or consider uncontended pthread_mutex?<BR> <BR> <BR>#endif<BR><BR>?<BR> <BR> - Jay<BR><BR> <BR>
<HR id=ecxstopSpelling>
CC: m3devel@elegosoft.com<BR>From: hosking@cs.purdue.edu<BR>To: jay.krell@cornell.edu<BR>Subject: Re: [M3devel] Self() locking slots almost unnecessary -- if only we had "MemoryBarrier".<BR>Date: Sun, 8 Nov 2009 21:54:06 -0500<BR><BR>
<DIV><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxApple-style-span>
<DIV style="WORD-WRAP: break-word"><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxApple-style-span>
<DIV style="WORD-WRAP: break-word"><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxApple-style-span>
<DIV><FONT class=ecxecxApple-style-span color=#0000ff face="'Gill Sans'"><SPAN style="FONT-SIZE: medium" class=ecxecxApple-style-span>It would be nice to use CAS and friends (load-linked/store-conditional) but they are not portable.  It would require target-dependencies.</SPAN></FONT></DIV></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></DIV></SPAN></DIV></SPAN></DIV><BR>
<DIV>
<DIV>On 8 Nov 2009, at 19:44, Jay K wrote:</DIV><BR class=ecxecxApple-interchange-newline>
<BLOCKQUOTE><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxApple-style-span>
<DIV style="FONT-FAMILY: Verdana; FONT-SIZE: 10pt" class=ecxecxhmmessage>I don't know. I just look at all code overly critically..including for overly coarse grained locking (which includes some vs. none).<BR>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.<BR> <BR>Writing the global with an "InterlockedExchange" might be good.<BR> <BR>Maybe we should add this as a portably available interface?<BR>"This" being MemoryBarrier and/or well, er, um, I guess you already did, the IA64 stuff, which is similar to the Win32 stuff.<BR>I should update the NT/x86 backend for that stuff and then we can move on and use them.<BR> <BR> - Jay<BR><BR> <BR>
<HR id=ecxecxstopSpelling>
From:<SPAN class=ecxecxApple-converted-space> </SPAN><A href="mailto:hosking@cs.purdue.edu">hosking@cs.purdue.edu</A><BR>To:<SPAN class=ecxecxApple-converted-space> </SPAN><A href="mailto:jay.krell@cornell.edu">jay.krell@cornell.edu</A><BR>Date: Sun, 8 Nov 2009 19:39:00 -0500<BR>CC:<SPAN class=ecxecxApple-converted-space> </SPAN><A href="mailto:m3devel@elegosoft.com">m3devel@elegosoft.com</A><BR>Subject: Re: [M3devel] Self() locking slots almost unnecessary -- if only we had "MemoryBarrier".<BR><BR>
<DIV><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxApple-style-span>
<DIV style="WORD-WRAP: break-word"><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxApple-style-span>
<DIV style="WORD-WRAP: break-word"><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxApple-style-span>
<DIV><SPAN style="FONT-SIZE: medium" class=ecxecxecxApple-style-span><FONT class=ecxecxecxApple-style-span color=#0000ff face="'Gill Sans'">Not portably.  Different memory models will behave differently.  For safety we need the lock.  But, seriously, how much contention will there be?</FONT></SPAN></DIV></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></DIV></SPAN></DIV></SPAN></DIV><BR>
<DIV>
<DIV>On 8 Nov 2009, at 19:35, Jay K wrote:</DIV><BR class=ecxecxecxApple-interchange-newline>
<BLOCKQUOTE><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxApple-style-span>
<DIV style="FONT-FAMILY: Verdana; FONT-SIZE: 10pt" class=ecxecxecxhmmessage>Self() doesn't have to lock slots AS LONG AS in AssignSlot:<BR> <BR>          SUBARRAY (new_slots^, 0, n) := slots^;<BR>          slots := new_slots;<BR><BR>occurs in the order written.<BR>That SUBARRAY() := finishes before slots := runs.<BR>Aggressively compilers/processors need not execute these in the order written.<BR> <BR>Do we have a way to guarantee that?<BR> <BR>Something like:<BR>          SUBARRAY (new_slots^, 0, n) := slots^;<BR>>        MemoryBarrier();<BR>          slots := new_slots;<BR><BR>?<BR> <BR>MemoryBarrier on Windows is implemented as one "special" instruction -- for x86, AMD64, and IA64.<BR>Those implementations are portable to any OS running those architectures.<BR>Though they aren't expressed in a portable form (x86 inline assembly and C compiler intrinsincs).<BR>In particular:<BR> <BR>winnt.h:<BR>amd64:<BR>#define MemoryBarrier __faststorefence<BR><BR>x86:<BR>FORCEINLINE<BR>VOID<BR>MemoryBarrier (<BR>    VOID<BR>    )<BR>{<BR>    LONG Barrier;<BR>    __asm {<BR>        xchg Barrier, eax<BR>    }<BR>}<BR><BR>ia64:<BR>#define MemoryBarrier           __mf<BR><BR> <BR> - Jay<BR> <BR></DIV></SPAN></BLOCKQUOTE></DIV><BR></DIV></SPAN><BR class=ecxecxApple-interchange-newline></BLOCKQUOTE></DIV><BR>                                        </body>
</html>