<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Verdana
}
--></style>
</head>
<body class='hmmessage'>
(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=stopSpelling>
From: jay.krell@cornell.edu<BR>To: hosking@cs.purdue.edu; m3devel@elegosoft.com<BR>Subject: ThreadBase/RunThread<BR>Date: Sun, 8 Nov 2009 23:05:27 +0000<BR><BR>
<STYLE>
.ExternalClass .ecxhmmessage P
{padding:0px;}
.ExternalClass body.ecxhmmessage
{font-size:10pt;font-family:Verdana;}
</STYLE>
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>                                      </body>
</html>