<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>I err on the side of simplicity, until there is an obvious need for adding complexity.  In this case, I concur with Olaf that the most we would need is a simple link-time switch.</div><div><br><div> <span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><div style="word-wrap: break-word; -khtml-nbsp-mode: space; -khtml-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><div><font class="Apple-style-span" color="#0000FF"><font class="Apple-style-span" face="Gill Sans"><span class="Apple-style-span" style="color: rgb(0, 0, 255); font-family: Gill Sans; "><span class="Apple-style-span" style="color: rgb(0, 0, 255); font-family: Gill Sans; ">Antony Hosking</span></span></font></font><font class="Apple-style-span" face="Gill Sans"><span class="Apple-style-span" style="font-family: Gill Sans; "><span class="Apple-style-span" style="font-family: Gill Sans; "> | </span></span><span class="Apple-style-span" style="font-family: Gill Sans; "><span class="Apple-style-span" style="font-family: Gill Sans; ">Associate Professor</span></span><span class="Apple-style-span" style="font-family: Gill Sans; "><span class="Apple-style-span" style="font-family: Gill Sans; "> | Computer Science | Purdue University</span></span></font></div><div><font class="Apple-style-span" face="GillSans-Light"><span class="Apple-style-span" style="font-family: GillSans-Light; ">305 N. University Street | West Lafayette | IN 47907 | USA</span></font></div><div><font class="Apple-style-span" color="#0000FF" face="Gill Sans"><span class="Apple-style-span" style="color: rgb(0, 0, 255); font-family: Gill Sans; "><span class="Apple-style-span" style="color: rgb(0, 0, 255); font-family: Gill Sans; ">Office</span></span></font><font class="Apple-style-span" face="GillSans-Light"><span class="Apple-style-span" style="font-family: GillSans-Light; "><span class="Apple-style-span" style="font-family: GillSans-Light; "> +1 765 494 6001 | </span></span></font><font class="Apple-style-span" color="#0000FF" face="Gill Sans"><span class="Apple-style-span" style="color: rgb(0, 0, 255); font-family: Gill Sans; "><span class="Apple-style-span" style="color: rgb(0, 0, 255); font-family: Gill Sans; ">Mobile</span></span></font><font class="Apple-style-span" face="GillSans-Light"><span class="Apple-style-span" style="font-family: GillSans-Light; "><span class="Apple-style-span" style="font-family: GillSans-Light; "> +1 765 427 5484</span></span></font></div><div><font class="Apple-style-span" face="GillSans-Light"><br class="khtml-block-placeholder"></font></div></span></span></span></span></span></span></span><br class="Apple-interchange-newline"></span></div></span> </div><br><div><div>On 9 Jan 2009, at 00:38, Olaf Wagner wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div>As I noted earlier, I think that a link-time choice between<br>(M3) user and system (kernel/p) threads would be completely<br>satisfactory. Default could be pthreads/system threads, and<br>cm3 -uthreads or cm3 -m3threads could substitute the old but<br>efficient M3 implementation (with proper getcontext/makecontext<br>for all target platforms ;-).<br><br>Olaf<br><br>Quoting Tony Hosking <<a href="mailto:hosking@cs.purdue.edu">hosking@cs.purdue.edu</a>>:<br><br><blockquote type="cite">On 8 Jan 2009, at 14:10, Jay wrote:<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><blockquote type="cite">Olaf understood the point (I think). :)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Some programs, people say, and I believe, run "better" (faster,   without running out of address space) with user threads instead of   kernel threads.<br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Is this still true for modern kernel thread systems?<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><blockquote type="cite">On systems that have both.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">A good example might be a program that needs lots of threads and   therefore small stacks, and the kernel threads, due to code below   the Modula-3 runtime, might force fairly large stacks. (Such a   program might have to adjust thread size differently for different   threads, and only call into the underlying system on threads with   larger stacks.)<br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">In a systems programming language like Modula-3 shouldn't threads have<br></blockquote><blockquote type="cite">a relationship to the system?<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><blockquote type="cite">It might be nice for such programs to be able to mandate or request   (two slightly different things) that the user thread library be  used  by them, even if the platform's default is to use kernel  threads.<br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">This will need to be a link-time distinction.  I would hate to have<br></blockquote><blockquote type="cite">both kernel and user thread code live in the same compiled run-time<br></blockquote><blockquote type="cite">system.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><blockquote type="cite">The only minor detail then is, how to express the request, and the   precise meaning.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">It is a request or a mandate?<br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">I see no problem with factoring out the threads subsystem as a<br></blockquote><blockquote type="cite">separate library and linking accordingly.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><blockquote type="cite">As well, if the issue is address space, sholud there a "built in"   way to only make the request on 32bit platforms, or should uses   manually say if equal (WORD_SIZE, "32BITS")?<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Is it a boolean or an enum?<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Cygwin might conceivably get pthreads support (Cygwin has it, but   Modula-3/Cygwin does not).<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Therefore, is the choice among "posix" threads, "pthreads" and "NT"   threads?<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Or just user vs. kernel?<br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">I would argue for user vs. kernel.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><blockquote type="cite">I think the "important" part here is easy to implement.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">But again..<br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">And managing the state-space explosion that multiple choices might<br></blockquote><blockquote type="cite">entail.  I would like to avoid that.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><blockquote type="cite">The easier straightforward implementation always links both pieces   of code in and makes a choice early in startup as to which to use,   either setting a boolean, or an enum, or a pointer to a record of   function pointers. This means that people that don't care to ever   use user threads pay a small price, in code bloat and probably in a   few extra instructions per certain functions. This is probably ok.<br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">I am not so sure, since it would entail some fairly low-level and<br></blockquote><blockquote type="cite">expensive decisions that would best instead be done at link-time.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><blockquote type="cite">However if that was not ok, the choice could be made at link time   and only be supported for standalone programs.<br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Actually, for non-standalone (dynamically-linked) code we could make<br></blockquote><blockquote type="cite">the choice at dynamic load time using the OS's support for dynamic<br></blockquote><blockquote type="cite">library choice.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">I note that Solaris (but not Solaris Modula-3) currently lets<br></blockquote><blockquote type="cite">dynamically linked C programs choose among 3 different threads<br></blockquote><blockquote type="cite">implementations dynamically.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">- Jay<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">CC: <a href="mailto:wagner@elegosoft.com">wagner@elegosoft.com</a>; <a href="mailto:m3devel@elegosoft.com">m3devel@elegosoft.com</a><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">From: <a href="mailto:hosking@cs.purdue.edu">hosking@cs.purdue.edu</a><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">To: <a href="mailto:jay.krell@cornell.edu">jay.krell@cornell.edu</a><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Subject: Re: [M3devel] dynamic chose between user/kernel threads?<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Date: Thu, 8 Jan 2009 13:51:15 +1100<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Jay, perhaps you can provide some context and motivation for your   proposals.  I am unable to evaluate your proposals in the form of a   simple laundry-list.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">On 8 Jan 2009, at 01:34, Jay wrote:<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">I looked into this a bit..and I think it's actually pretty easy.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">It hardly churns the code even.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">I have other things I want to do first.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">In the meantime, specify the directive?<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">There are actually a large number of subtle options.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Can I ask for any of n libraries -- NT, pthreads, user threads?<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">setjmp vs. context? Or is it just a boolean, user vs. kernel?<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Is the option to "favor" or "require" a certain library?<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Can I set it on libraries or only programs?<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">What if the requests clash?<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Is it "Favor" or "Require"?<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Is it a function call or setting a global variable?<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">I favor function call, but TARGET, WORD_SIZE, BUILD_DIR establish   the other precedent,<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">and either can work.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Is it flags in the moduleinfo like incgc, gengc, or separate data that<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">there is just one of in RTLinker? Probably separate data, unless it   is allowed in libraries.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">What are the names of the libraries?<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">"posix" and "pthreads"  ?<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> "user" and "kernel" ?<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> "true" and "false" (or vice versa) ?<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Should NT implement user threads, using fibers?<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Presumably it works with both standalone and shared/dynamic programs.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Presumably it is ok to always bloat up m3core.dll with both libraries.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Presumably it is ok to have everyone pay a teeny tiny perf.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> That is, there is a microscopic dispatching layer, that everyone<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> ends up going through, not chosing to link in one library or the  other.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">And as part of this, whenever it happens, can we bump up the minimum<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">bootstrap to a version that includes  SchedulerPosix.DoesWaitPidYield()?<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Or does it become VAR Scheduler.UsingKerneThreads?<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(no, it should be a function; but naming matter remains).<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(ie. as I said, the decision currently is baked into m3core.dll, but<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">now it is also baked into sysutils.dll, but these should change  together;<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">m3core.dll should manage the knowledge).<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">- Jay<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">Date: Sat, 3 Jan 2009 01:12:27 +0100<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">From: <a href="mailto:wagner@elegosoft.com">wagner@elegosoft.com</a><br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">To: <a href="mailto:m3devel@elegosoft.com">m3devel@elegosoft.com</a><br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">Subject: Re: [M3devel] dynamic chose between user/kernel threads?<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">An option to cm3 or a quake directive to use in the m3makefiles<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">would suffice in my opinion (and be a great improvement).<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">Olaf<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">Quoting Jay <<a href="mailto:jay.krell@cornell.edu">jay.krell@cornell.edu</a>>:<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">><br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">> Should the user/kernel thread chose be available:<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">><br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">><br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">> On the command line to a Modula-3 executable (or even an  executable<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">> where main is in another language, but which static or dynamic<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">> Modula-3 libs are used)?<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">><br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">><br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">> Via a quake directive when building programs?<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">><br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">><br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">> You know, imagine you have a bunch of Modula-3 programs and some  but<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">> not all use a very large number of threads and benefit from<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">> userthreads.<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">><br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">><br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">> Currently the chose is locked into m3core when it is built.<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">><br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">><br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">> - Jay<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">--<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">Olaf<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><br><br><br>-- <br>Olaf Wagner -- elego Software Solutions GmbH<br>               Gustav-Meyer-Allee 25 / Gebäude 12, 13355 Berlin, Germany<br>phone: +49 30 23 45 86 96  mobile: +49 177 2345 869  fax: +49 30 23 45 86 95<br>   <a href="http://www.elegosoft.com">http://www.elegosoft.com</a> | Geschäftsführer: Olaf Wagner | Sitz: Berlin<br>Handelregister: Amtsgericht Charlottenburg HRB 77719 | USt-IdNr: DE163214194<br><br></div></blockquote></div><br></div></body></html>