<html>
<head>
<style>
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Verdana
}
</style>
</head>
<body class='hmmessage'>
I was able to easily build this alternate library, just by creating one small m3makefile and optionally editing one other very little.<BR>
I wasn't able to find a way to get it used, other than maybe shipping it on top of the "real" m3core.<BR>
A compiler hack that knows to replace package "m3core" with "m3coreuserthreads" may be appropriate.<BR>
 I can look into that.<BR>
But I still don't know why not function pointers.<BR>
Plenty else to do in the meantime (Cygwin/pthreads, portability, a bunch of ports..).<BR>
 <BR>
 - Jay<BR><BR><BR>

<HR id=stopSpelling>
<BR>
From: jay.krell@cornell.edu<BR>To: hosking@cs.purdue.edu<BR>CC: m3devel@elegosoft.com<BR>Subject: RE: [M3devel] how to switch between user and kernel threads..<BR>Date: Thu, 15 Jan 2009 04:15:43 +0000<BR><BR>
<STYLE>
.ExternalClass .EC_hmmessage P
{padding:0px;}
.ExternalClass body.EC_hmmessage
{font-size:10pt;font-family:Verdana;}
</STYLE>
That would't affected here.<BR>  All the calls within ThreadPThread to within ThreadPThread would remain direct and inlinable.<BR>  They would be to the "ThreadPThread" interface, and not the "Thread" interface, would be my intent.<BR> <BR>How about across modules?<BR>  I expect any call from outside ThreadPThread to within ThreadPThread to never be inlined, at least not when dynamic linking and with static linking (or within the package/library) not unless there is "whole program optimization" aka "link time code generation" with static linking, which does exist out there.<BR> <BR> - Jay<BR><BR><BR><BR>

<HR id=EC_stopSpelling>
<BR>
<BR>From: hosking@cs.purdue.edu<BR>To: jay.krell@cornell.edu<BR>Date: Thu, 15 Jan 2009 14:18:16 +1100<BR>CC: m3devel@elegosoft.com<BR>Subject: Re: [M3devel] how to switch between user and kernel threads..<BR><BR>We do get inlining within modules by virtue of the gcc-backend at -O3.<BR><BR>
<DIV>
<DIV><BR></DIV>
<DIV>
<DIV>
<DIV>
<DIV>On 15 Jan 2009, at 14:03, Jay wrote:</DIV><BR class=EC_EC_Apple-interchange-newline>
<BLOCKQUOTE><SPAN class=EC_EC_Apple-style-span style="WORD-SPACING: 0px; FONT: 12px Helvetica; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate">
<DIV class=EC_EC_hmmessage style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">The installer?<BR>I thought the granularity was at the time of linking an executable.<BR>I personally thought a command line parameter would be reasonable.<BR> <BR> <BR>Why not function pointers?<BR>It is a simple straightforward method to implement.<BR>It should add one instruction per call.<BR>It does reduce inlinability but I'm sure we aren't getting any such such inlinability anyway.<BR>Dynamic linking already kills inlinability, as does separate compilation of modules in most systems.<BR> <BR> <BR>I'm not sure how the types work out in such a scheme, but probably assuming Thread.T is already a reference type, it can become ADDRESS and then loopholed to ThreadPosix.T or ThreadPThread.T.<BR> <BR> <BR>Function pointers are also the easiest method to build. I'm not sure what the others are.<BR>I can try making m3-libs/m3coreuserthreads that contains only m3makefiles.<BR>Probably it can say:<BR>LibraryName = "m3coreuserthreads"<BR>include_dir("../m3core/m3makefile")<BR> <BR> <BR>and m3core/m3makefile can say<BR>if not defined("LibraryName")<BR>  LibraryName = "m3core"<BR>end<BR>Library(LibraryName)<BR> <BR> <BR>If that works, not bad.<BR> <BR> <BR>And then cm3 or the config file can translate m3core to m3coreuserthreads at some point.<BR> <BR> <BR> - Jay<BR><BR><BR>
<HR id=EC_EC_stopSpelling>
<BR>From:<SPAN class=EC_EC_Apple-converted-space> </SPAN><A href="mailto:hosking@cs.purdue.edu">hosking@cs.purdue.edu</A><BR>To:<SPAN class=EC_EC_Apple-converted-space> </SPAN><A href="mailto:jay.krell@cornell.edu">jay.krell@cornell.edu</A><BR>Date: Thu, 15 Jan 2009 11:31:17 +1100<BR>CC:<SPAN class=EC_EC_Apple-converted-space> </SPAN><A href="mailto:m3devel@elegosoft.com">m3devel@elegosoft.com</A><BR>Subject: Re: [M3devel] how to switch between user and kernel threads..<BR><BR><BR>
<DIV>No function pointers please.  Let the installer decide whether to use native or user threads.</DIV>
<DIV>
<DIV>
<DIV><SPAN class=EC_EC_EC_Apple-style-span style="WORD-SPACING: 0px; FONT: 12px Helvetica; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate">
<DIV style="WORD-WRAP: break-word"><SPAN class=EC_EC_EC_Apple-style-span style="WORD-SPACING: 0px; FONT: 12px Helvetica; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate"><SPAN class=EC_EC_EC_Apple-style-span style="WORD-SPACING: 0px; FONT: 12px Helvetica; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate"><SPAN class=EC_EC_EC_Apple-style-span style="WORD-SPACING: 0px; FONT: 12px Helvetica; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate"><SPAN class=EC_EC_EC_Apple-style-span style="WORD-SPACING: 0px; FONT: 12px Helvetica; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate"><SPAN class=EC_EC_EC_Apple-style-span style="WORD-SPACING: 0px; FONT: 12px Helvetica; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate"><SPAN class=EC_EC_EC_Apple-style-span style="WORD-SPACING: 0px; FONT: 12px Helvetica; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate"><SPAN class=EC_EC_EC_Apple-style-span style="WORD-SPACING: 0px; FONT: 12px Helvetica; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate"><SPAN class=EC_EC_EC_Apple-style-span style="WORD-SPACING: 0px; FONT: 12px Helvetica; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate">
<DIV><BR></DIV></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></DIV></SPAN></DIV>
<DIV>
<DIV>On 15 Jan 2009, at 08:30, Jay wrote:</DIV><BR class=EC_EC_EC_Apple-interchange-newline>
<BLOCKQUOTE><SPAN class=EC_EC_EC_Apple-style-span style="WORD-SPACING: 0px; FONT: 12px Helvetica; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate">
<DIV class=EC_EC_EC_hmmessage style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">I'll wait.<BR>So, build two different m3core.lib/a/so/dylib?<BR>m3core and m3coreuserthreads<BR> <BR>Compile both thread directories, if the platform supports it, and<BR>call quake make_lib twice with slightly different parameters?<BR>An m3core specific hack in the config file or cm3?<BR>Easy enough in the config file.<BR>Very m3core specific.<BR>I suppose you could argue that quake isn't a generic build system,<BR>but it is Modula-3's build system, and that m3core is really special.<BR> <BR>The result btw, would likely be no change at all to any *.i3 or *.m3 file.<BR> <BR>I still think function pointers are the way to go.<BR>Even with function pointers, the changes to *.i3 and *.m3 would be very minor.<BR>Just the export list would vary.<BR>And new *.i3 files introduced.<BR> <BR> - Jay<BR><BR><BR>
<HR id=EC_EC_EC_stopSpelling>
<BR>From:<SPAN class=EC_EC_EC_Apple-converted-space> </SPAN><A href="mailto:hosking@cs.purdue.edu">hosking@cs.purdue.edu</A><BR>To:<SPAN class=EC_EC_EC_Apple-converted-space> </SPAN><A href="mailto:jay.krell@cornell.edu">jay.krell@cornell.edu</A><BR>Date: Wed, 14 Jan 2009 21:31:22 +1100<BR>CC:<SPAN class=EC_EC_EC_Apple-converted-space> </SPAN><A href="mailto:m3devel@elegosoft.com">m3devel@elegosoft.com</A><BR>Subject: Re: [M3devel] how to switch between user and kernel threads..<BR><BR>I don't want dynamic switching.  A link-time switch is just fine.<BR>
<DIV><BR></DIV>
<DIV>Also, please don't go messing about with this right now -- I have changes pending for the threads system that will be harder to integrate if you change with it further. 
<DIV>
<DIV><SPAN class=EC_EC_EC_EC_Apple-style-span style="WORD-SPACING: 0px; FONT: 12px Helvetica; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate">
<DIV style="WORD-WRAP: break-word"><SPAN class=EC_EC_EC_EC_Apple-style-span style="WORD-SPACING: 0px; FONT: 12px Helvetica; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate"><SPAN class=EC_EC_EC_EC_Apple-style-span style="WORD-SPACING: 0px; FONT: 12px Helvetica; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate"><SPAN class=EC_EC_EC_EC_Apple-style-span style="WORD-SPACING: 0px; FONT: 12px Helvetica; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate"><SPAN class=EC_EC_EC_EC_Apple-style-span style="WORD-SPACING: 0px; FONT: 12px Helvetica; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate"><SPAN class=EC_EC_EC_EC_Apple-style-span style="WORD-SPACING: 0px; FONT: 12px Helvetica; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate"><SPAN class=EC_EC_EC_EC_Apple-style-span style="WORD-SPACING: 0px; FONT: 12px Helvetica; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate"><SPAN class=EC_EC_EC_EC_Apple-style-span style="WORD-SPACING: 0px; FONT: 12px Helvetica; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate"><SPAN class=EC_EC_EC_EC_Apple-style-span style="WORD-SPACING: 0px; FONT: 12px Helvetica; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate">
<DIV><BR></DIV></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></DIV></SPAN></DIV>
<DIV>
<DIV>On 14 Jan 2009, at 20:14, Jay wrote:</DIV><BR class=EC_EC_EC_EC_Apple-interchange-newline>
<BLOCKQUOTE><SPAN class=EC_EC_EC_EC_Apple-style-span style="WORD-SPACING: 0px; FONT: 12px Helvetica; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate">
<DIV class=EC_EC_EC_EC_hmmessage style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">Are people really against using function pointers for this?<BR>Either changing the interface to have function pointer variables (I'm not sure Modula-3 allows this, but in C you can fairly transparently replace functions with function pointers; client code just keeps working; it breaks down in C++ with overloading), or having a set of functions that just call/jump through function pointers? There would be no if, no conditional branches.<BR> <BR>Dynamic linking on Windows always goes through function pointers already.<BR> So while yes it adds another instruction, it is already never getting inlined.<BR>Don't other platforms do that too?<BR>Or they patch every call site?<BR> <BR>I'm not sure otherwise of a simple method.<BR>Easiest might be to have a parallel directory structure to m3core, with just m3core files.<BR>That would wastefully rebuild all of m3core a second time, for just a small amount of variation.<BR> <BR>I think function pointers are the way to go here.<BR> <BR> - Jay<BR><BR><BR><BR><BR><BR></DIV></SPAN></BLOCKQUOTE></DIV><BR></DIV></DIV></DIV></SPAN><BR class=EC_EC_EC_Apple-interchange-newline></BLOCKQUOTE></DIV><BR></DIV></DIV></DIV></SPAN><BR class=EC_EC_Apple-interchange-newline></BLOCKQUOTE></DIV><BR></DIV></DIV></DIV></body>
</html>