<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Verdana
}
--></style>
</head>
<body class='hmmessage'>
ok, understood now.<BR>
 <BR>
 - Jay<BR><BR> <BR>
<HR id=stopSpelling>
From: hosking@cs.purdue.edu<BR>To: jay.krell@cornell.edu<BR>Date: Sun, 8 Nov 2009 19:09:55 -0500<BR>CC: m3devel@elegosoft.com<BR>Subject: Re: [M3devel] ThreadBase/RunThread<BR><BR>NO!  You cannot have traced T in untraced Activation.  The collector can't find the T that way.  What if T moves?
<DIV>
<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=ecxApple-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=ecxApple-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=ecxApple-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=ecxApple-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=ecxApple-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=ecxApple-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=ecxApple-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=ecxApple-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=ecxApple-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=ecxApple-style-span>
<DIV><SPAN style="FONT-SIZE: medium" class=ecxApple-style-span><FONT class=ecxApple-style-span color=#0000ff face="'Gill Sans'"><BR></FONT></SPAN></DIV></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></DIV></SPAN></DIV></SPAN></DIV>
<DIV>
<DIV>On 8 Nov 2009, at 18:24, Jay K wrote:</DIV><BR class=ecxApple-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=ecxApple-style-span>
<DIV style="FONT-FAMILY: Verdana; FONT-SIZE: 10pt" class=ecxhmmessage>(truncated)<BR> <BR>Oh, I think I get it:<BR> <BR>Index: ThreadPThread.m3<BR>===================================================================<BR>RCS file: /usr/cvs/cm3/m3-libs/m3core/src/thread/PTHREAD/ThreadPThread.m3,v<BR>retrieving revision 1.167<BR>diff -u -r1.167 ThreadPThread.m3<BR>--- ThreadPThread.m3    8 Nov 2009 23:09:21 -0000       1.167<BR>+++ ThreadPThread.m3    8 Nov 2009 23:21:38 -0000<BR>@@ -53,6 +53,8 @@<BR>   Activation = UNTRACED REF RECORD<BR>     mutex: pthread_mutex_t := NIL;<BR>+    self: T; (* reference traced part *)<BR>+<BR>     (* a place to park while waiting *)<BR>     cond: pthread_cond_t := NIL;<BR>@@ -428,6 +430,7 @@<BR>       pthread_cond_delete(cond);<BR>       RTE.Raise(RTE.T.OutOfMemory);<BR>     END;<BR>+    act.self := t;<BR>     act.mutex := mutex;<BR>     act.cond := cond;<BR>     RTHeapRep.RegisterFinalCleanup (t, CleanThread);<BR>@@ -465,6 +468,16 @@<BR>       self := slots [me.slot];<BR>     WITH r = pthread_mutex_unlock_slots() DO <*ASSERT r=0*> END;<BR>+    RTIO.PutAddr(me);<BR>+    RTIO.PutText("\n");<BR>+    RTIO.PutAddr(LOOPHOLE(self, ADDRESS));<BR>+    RTIO.PutText("\n");<BR>+    RTIO.PutAddr(LOOPHOLE(me.self, ADDRESS));<BR>+    RTIO.Flush();<BR>+<BR>+    <*ASSERT me.self # NIL *><BR>+    <*ASSERT me.self = self *><BR>+<BR>     (* Run the user-level code. *)<BR>     IF perfOn THEN PerfRunning() END;<BR>     self.result := self.closure.apply();<BR> <BR><BR>Doesn't work. Untraced memory can't contain traced pointers, because the traced part can get moved and the untraced thing won't get updated. Right? Using an integer is a "workaround".<BR> <BR>Furthermore we need all this roundabout stuff because the GC can't see thread locals.<BR> <BR>OK.<BR> - Jay<BR><BR> <BR>
<HR id=ecxstopSpelling>
From:<SPAN class=ecxApple-converted-space> </SPAN><A href="mailto:jay.krell@cornell.edu">jay.krell@cornell.edu</A><BR>To:<SPAN class=ecxApple-converted-space> </SPAN><A href="mailto:hosking@cs.purdue.edu">hosking@cs.purdue.edu</A>;<SPAN class=ecxApple-converted-space> </SPAN><A href="mailto:m3devel@elegosoft.com">m3devel@elegosoft.com</A><BR>Subject: ThreadBase/RunThread<BR>Date: Sun, 8 Nov 2009 23:05:27 +0000<BR><BR>ThreadBase/RunThread -- something seems a little off to me here.<BR> <BR> <BR>I merged the functions.<BR>Stuff is supposed to work asif there is arbitrary inlining.<BR> At least until/unless we get a pragma to mark a function as not inlinable or a direct language feature analogous to "volatile" to preserve locals -- currently inserting try does it but that's an implementation detail I think.<BR> <BR> <BR>However, I wonder, in taking the address of "xx", isn't ThreadBase a bit..gambling?<BR>You know, the traced references might be before or after xx in the stack, so xx might not cover it.<BR> <BR> <BR>The code is safe because the only traced reference is "self" which also is reachable via slots.<BR> <BR> <BR>In particular I'm trying to link Activation<=>T and introduce allThreadsTraced analogous to allThreads -- a global list of all threads, covering their traced part.<BR>That way AssignSlots/FreeSlots and the slots lock would go away.<BR>Removing locks seems like a good thing in general.<BR>Overall space consumption wouldn't be much different, I'd trade an array of pointers, one pointer per thread, for two pointers embedded in each thread plus a global pointer. But the ability to fetch Self() faster or RunThread to block on less or no locking would be good -- not that Self() is used much anymore.<BR> <BR> <BR>I keep seeing strange failures and I wonder if taking away the slots reference leaves me with insufficient reference.<BR>Or maybe I'm breaking it some other way.<BR> <BR>I tried building up allThreadsTraced earlier, while stackbase isn't settable, and have code watch for stackbase = NIL but still no luck.<BR> <BR> <BR>I'll try more later...<BR> <BR> <BR> - Jay<BR></DIV></SPAN></BLOCKQUOTE></DIV><BR></DIV>                                        </body>
</html>