<table cellspacing="0" cellpadding="0" border="0" ><tr><td valign="top" style="font: inherit;">Hi all:<br>since there was just that interface in *nix platforms, then it must be called like that , but another name will be just create SchedulerCM3, thus suggests SchedulerPosix would be called rather than nothing suffixing it SchedulerSRC and the other one Scheduler alone be the default like to say SchedulerCM3 AS Scheduler  so to switch to SchedulerSRC AS Scheduler provided that both are implementation ready so one can select SchedulerCM3 as SchedulerSRC or Scheduler so one name comes after each rep rather than changing every other place each time, even of Internal Nodes as in m3tk which specifies its members as  SRC_NODE <: AST_NODE then something like CM3_NODE likiwise subtyped if so should be created to hold the extensions (can somebody name them WIDECHAR, LONGINT, LONGCARD, what else am I missing if so?),  like we could come up with
 something cleaner than just put all there.<br><br>I will try to se a proposal for that.<br>Thanks in advance<br><br>--- El <b>mar, 19/4/11, Jay K <i><jay.krell@cornell.edu></i></b> escribió:<br><blockquote style="border-left: 2px solid rgb(16, 16, 255); margin-left: 5px; padding-left: 5px;"><br>De: Jay K <jay.krell@cornell.edu><br>Asunto: Re: [M3devel] 5.8.6 LINUXLIBC6 breakage, kernel 2.6.23, glibc-2.6-4<br>Para: "Mika Nystrom" <mika@async.caltech.edu><br>CC: "m3devel" <m3devel@elegosoft.com><br>Fecha: martes, 19 de abril, 2011 13:50<br><br><div id="yiv2026680239">

<style><!--
#yiv2026680239 .yiv2026680239hmmessage P
{
margin:0px;padding:0px;}
#yiv2026680239 .yiv2026680239hmmessage
{
font-size:10pt;font-family:Tahoma;}
--></style>
It's easy enough for us to support either name.<br><br> - Jay<br><br><br>> To: jay.krell@cornell.edu<br>> Date: Tue, 19 Apr 2011 08:29:24 -0700<br>> From: mika@async.caltech.edu<br>> CC: m3devel@elegosoft.com<br>> Subject: Re: [M3devel] 5.8.6 LINUXLIBC6 breakage, kernel 2.6.23, glibc-2.6-4<br>> <br>> Never explained this clearly before.  Thanks, Jay.<br>> <br>> I suppose the reason CVSup forks and does work is to save copying<br>> overhead because the two forked processes can share read-only pages<br>> without any copying?<br>> <br>> I remember that the last time I looked at this my reaction was "fork()<br>> is not part of Modula-3 : people who use it are on their own".  In a sense<br>> this is still true as FreeBSD simply will not work with -pthread.  <br>> <br>> I'm afraid that, however, that removing -pthread didn't fix my Linux<br>> lockup problems.  Turns out the library I was having trouble
 with is<br>> a PostgreSQL library written by Critical Mass.  To fix it, I wrote a<br>> program using m3tk and some Scheme code that will take any M3 interface<br>> and wrap every routine in that interface in the following code structure:<br>> <br>> PROCEDURE PQconnectPoll(VALUE conn : PQ.PGconn_star) : PQ.PostgresPollingStatusType =<br>>   BEGIN<br>>     SchedulerIndirection.DisableSwitching();<br>>     TRY<br>>       RETURN PQ.PQconnectPoll(conn)<br>>     FINALLY<br>>       SchedulerIndirection.EnableSwitching()<br>>     END<br>>   END PQconnectPoll;<br>> <br>> which then gave rise to my previous bug report about BasicCTypes, which<br>> m3tk cannot process a.t.m., owing to LONGINT breakage.<br>> <br>> Also I have to call "SchedulerIndirection" since the routines to turn<br>> off switching are named differently on CM3 (Scheduler.DisableSwitching)<br>> and PM3
 (SchedulerPosix.DisableSwitching).... this just seems gratuitous<br>> to me but oh well I must have a dozen of these CM3/PM3 differences to deal<br>> with, what's another one?<br>> <br>>      Mika<br>> <br>> Jay K writes:<br>> >--_9d99325a-59cc-496a-9b87-3881dbf2b655_<br>> >Content-Type: text/plain; charset="iso-8859-1"<br>> >Content-Transfer-Encoding: quoted-printable<br>> ><br>> ><br>> >Previously: user threads: all threads survived fork()<br>> >Previously: pthreads: only the thread calling fork() survived fork()<br>> >Now: user threads and pthreads: only the thread calling fork() survives for=<br>> >k()<br>> >This must be how pthreads behave=2C and this makes user threads and pthread=<br>> >s consistent.<br>> ><br>> >This change depends on pthread_atfork=2C for pthreads and user threads.<br>> >It only really matters to the rare "fork + do more work"
 program=2C such as=<br>> > cvsupd.<br>> >Most programs either never fork=2C or exec almost immediately after fork.<br>> ><br>> ><br>> >pthread_atfork offers a good model.<br>> >A sort of "distributed" model.<br>> >You don't have to go and change all the calls to fork().<br>> >Each module with a need to do something before/after fork=2C calls the cent=<br>> >ral pthread_atfork=2C<br>> >and fork and pthread_atfork cooperate to do what is needed.<br>> ><br>> ><br>> >No function pointer is needed.<br>> >Instead move the code to m3core/thread.<br>> ><br>> ><br>> >If you really must not use -pthread=2C then you must implement pthread_atfo=<br>> >rk functionality<br>> >yourself and have all fork() calls go through your own fork() wrapper that =<br>> >cooperates<br>> >with your pthread_atfork replacement.<br>> >There is no free
 lunch -- there is a downside to this approach=2C as plain =<br>> >fork() calls<br>> >are ok and correct if pthread_atfork is used=2C but now become incorrect.<br>> >Pick your poison:<br>> >  user thread/pthread inconsistency<br>> >  cvsupd incompatibility with pthreads=20<br>> >  user threads using pthread_atfork/-pthread=20<br>> >  fork() calls having to go through a wrapper (ok -- you could miss this an=<br>> >d=20<br>> >   not likely notice -- only fork() calls in fork+do-more-work programs nee=<br>> >d the wrapper).=20<br>> ><br>> ><br>> >(Most of this has been explained multiple times=2C but people only pay atte=<br>> >ntion<br>> >when they think it affects them. I'm guilty of the same thing.)<br>> ><br>> ><br>> > - Jay<br>> ><br>> ><br>> >> To: jay.krell@cornell.edu<br>> >> Date: Mon=2C 18 Apr 2011 19:30:58
 -0700<br>> >> From: mika@async.caltech.edu<br>> >> CC: m3devel@elegosoft.com<br>> >> Subject: Re: [M3devel] 5.8.6 LINUXLIBC6 breakage=2C kernel 2.6.23=2C glib=<br>> >c-2.6-4<br>> >>=20<br>> >>=20<br>> >> If you or Tony could describe roughly what you think needs to be done<br>> >> I'd be happy to look into it.<br>> >>=20<br>> >> The basic problem is that a decision that's made/described in<br>> >> m3core/thread/m3makefile needs to someone find its way to controlling<br>> >> what C code gets compiled elsewhere in the system.  Or maybe there should<br>> >> be an indirection into the thread library to pick up pthread_atfork (or n=<br>> >ot).<br>> >>=20<br>> >> But then again you still haven't explained why you made the user threads =<br>> >use<br>> >> pthread_atfork.  I just remove it from my
 installations=2C but then again=<br>> > I'm<br>> >> not trying to run CVSup so I don't know if it breaks that program to do s=<br>> >o.<br>> >>=20<br>> >>      Mika<br>> >>=20<br>> >> Jay K writes:<br>> >> >--_3dd397d4-ac1d-4148-a9ff-059d27dd794a_<br>> >> >Content-Type: text/plain=3B charset=3D"iso-8859-1"<br>> >> >Content-Transfer-Encoding: quoted-printable<br>> >> ><br>> >> ><br>> >> >> The following code from RTProcessC.c ensures that it is neeeded on eve=<br>> >ry =3D<br>> >> >Unix except<br>> >> >> > /* NOTE: Even userthreads now depends<br>> >> >> > * on availability of pthreads.<br>> >> >> > * This can be fixed if need be.<br>> >> >> > */<br>> >> ><br>> >> >=3D20<br>> >> >Ok=3D2C "we" should
 probably go ahead and fix that.<br>> >> >I'll try to=3D2C but no promises=3D2C sorry.<br>> >> >=3D20<br>> >> > - Jay<br>> >> >=3D20<br>> >> >> From: hosking@cs.purdue.edu<br>> >> >> Date: Mon=3D2C 18 Apr 2011 18:11:26 -0400<br>> >> >> To: mika@async.caltech.edu<br>> >> >> CC: m3devel@elegosoft.com<br>> >> >> Subject: Re: [M3devel] 5.8.6 LINUXLIBC6 breakage=3D2C kernel 2.6.23=3D=<br>> >2C glib=3D<br>> >> >c-2.6-4<br>> >> >>=3D20<br>> >> >> Probably unnecessary=3D2C given that I think there is another entry po=<br>> >int t=3D<br>> >> >o forking a process (I forget where) in the thread-specific portion of m=<br>> >3co=3D<br>> >> >re. In which case the necessary work might be done there?<br>> >> >>=3D20<br>> >> >> On Apr
 18=3D2C 2011=3D2C at 2:45 PM=3D2C Mika Nystrom wrote:<br>> >> >>=3D20<br>> >> >> > Tony Hosking writes:<br>> >> >> > ...<br>> >> >> >> pthread_atfork should not be needed under user threads.<br>> >> >> > ...<br>> >> >> >=3D20<br>> >> >> > The following code from RTProcessC.c ensures that it is neeeded on e=<br>> >ver=3D<br>> >> >y Unix except<br>> >> >> > FreeBSD before 6. The comment is from the checked-in source file.<br>> >> >> >=3D20<br>> >> >> > /* NOTE: Even userthreads now depends<br>> >> >> > * on availability of pthreads.<br>> >> >> > * This can be fixed if need be.<br>> >> >> > */<br>> >> >> >=3D20<br>> >> >> > INTEGER<br>> >> >> >
 __cdecl<br>> >> >> > RTProcess__RegisterForkHandlers(<br>> >> >> > ForkHandler prepare=3D2C<br>> >> >> > ForkHandler parent=3D2C<br>> >> >> > ForkHandler child)<br>> >> >> > {<br>> >> >> > /* FreeBSD < 6 lacks pthread_atfork. Would be good to use autoconf.<br>> >> >> > * VMS lacks pthread_atfork? Would be good to use autoconf.<br>> >> >> > * Win32 lacks pthread_atfork and fork. OK.<br>> >> >> > *<br>> >> >> > * As well=3D2C for all Posix systems=3D2C we could implement<br>> >> >> > * atfork ourselves=3D2C as long as we provide a fork()<br>> >> >> > * wrapper that code uses.<br>> >> >> > */<br>> >> >> > #if defined(_WIN32) \<br>> >> >> > || defined(__vms) \<br>> >> >>
 > || (defined(__FreeBSD__) /* && (__FreeBSD__ < 6)*/ )<br>> >> >> > return 0=3D3B<br>> >> >> > #else<br>> >> >> > while (1)<br>> >> >> > {<br>> >> >> > int i =3D3D pthread_atfork(prepare=3D2C parent=3D2C child)=3D3B<br>> >> >> > if (i !=3D3D EAGAIN)<br>> >> >> > return i=3D3B<br>> >> >> > sleep(0)=3D3B<br>> >> >> > }<br>> >> >> > #endif<br>> >> >> > }<br>> >> >>=3D20<br>> >> >                                         =3D<br>> >> ><br>> >> >--_3dd397d4-ac1d-4148-a9ff-059d27dd794a_<br>> >> >Content-Type: text/html=3B charset=3D"iso-8859-1"<br>> >> >Content-Transfer-Encoding: quoted-printable<br>> >> ><br>> >> ><html><br>> >> ><head><br>> >>
 ><style><!--<br>> >> >.hmmessage P<br>> >> >{<br>> >> >margin:0px=3D3B<br>> >> >padding:0px<br>> >> >}<br>> >> >body.hmmessage<br>> >> >{<br>> >> >font-size: 10pt=3D3B<br>> >> >font-family:Tahoma<br>> >> >}<br>> >> >--></style><br>> >> ></head><br>> >> ><body class=3D3D'hmmessage'><br>> >> >&gt=3D3B The following code from RTProcessC.c ensures that it is neeeded=<br>> > on e=3D<br>> >> >very Unix except<BR>&gt=3D3B &gt=3D3B /* NOTE: Even userthreads now depe=<br>> >nds<BR>=3D<br>> >> >&gt=3D3B &gt=3D3B * on availability of pthreads.<BR>&gt=3D3B &gt=3D3B * =<br>> >This can be=3D<br>> >> > fixed if need be.<BR>&gt=3D3B &gt=3D3B
 */<BR><BR><br>> >> >&nbsp=3D3B<BR><br>> >> >Ok=3D2C "we" should probably go ahead and fix that.<BR><br>> >> >I'll try to=3D2C but no&nbsp=3D3Bpromises=3D2C sorry.<BR><br>> >> >&nbsp=3D3B<BR><br>> >> >&nbsp=3D3B- Jay<BR>&nbsp=3D3B<BR><br>> >> >&gt=3D3B From: hosking@cs.purdue.edu<BR>&gt=3D3B Date: Mon=3D2C 18 Apr 2=<br>> >011 18:11=3D<br>> >> >:26 -0400<BR>&gt=3D3B To: mika@async.caltech.edu<BR>&gt=3D3B CC: m3devel=<br>> >@elegos=3D<br>> >> >oft.com<BR>&gt=3D3B Subject: Re: [M3devel] 5.8.6 LINUXLIBC6 breakage=3D2=<br>> >C kerne=3D<br>> >> >l 2.6.23=3D2C glibc-2.6-4<BR>&gt=3D3B <BR>&gt=3D3B Probably unnecessary=<br>> >=3D2C given =3D<br>> >> >that I think there is another entry point
 to forking a process (I forget=<br>> > wh=3D<br>> >> >ere) in the thread-specific portion of m3core. In which case the necessa=<br>> >ry =3D<br>> >> >work might be done there?<BR>&gt=3D3B <BR>&gt=3D3B On Apr 18=3D2C 2011=<br>> >=3D2C at 2:45=3D<br>> >> > PM=3D2C Mika Nystrom wrote:<BR>&gt=3D3B <BR>&gt=3D3B &gt=3D3B Tony Hosk=<br>> >ing writes:=3D<br>> >> ><BR>&gt=3D3B &gt=3D3B ...<BR>&gt=3D3B &gt=3D3B&gt=3D3B pthread_atfork sh=<br>> >ould not be n=3D<br>> >> >eeded under user threads.<BR>&gt=3D3B &gt=3D3B ...<BR>&gt=3D3B &gt=3D3B =<br>> ><BR>&gt=3D3B =3D<br>> >> >&gt=3D3B The following code from RTProcessC.c ensures that it is neeeded=<br>> > on e=3D<br>> >> >very Unix except<BR>&gt=3D3B &gt=3D3B
 FreeBSD before 6. The comment is f=<br>> >rom the=3D<br>> >> > checked-in source file.<BR>&gt=3D3B &gt=3D3B <BR>&gt=3D3B &gt=3D3B /* N=<br>> >OTE: Even u=3D<br>> >> >serthreads now depends<BR>&gt=3D3B &gt=3D3B * on availability of pthread=<br>> >s.<BR>&=3D<br>> >> >gt=3D3B &gt=3D3B * This can be fixed if need be.<BR>&gt=3D3B &gt=3D3B */=<br>> ><BR>&gt=3D3B =3D<br>> >> >&gt=3D3B <BR>&gt=3D3B &gt=3D3B INTEGER<BR>&gt=3D3B &gt=3D3B __cdecl<BR>&=<br>> >gt=3D3B &gt=3D3B =3D<br>> >> >RTProcess__RegisterForkHandlers(<BR>&gt=3D3B &gt=3D3B ForkHandler prepar=<br>> >e=3D2C<BR=3D<br>> >> >>&gt=3D3B &gt=3D3B ForkHandler parent=3D2C<BR>&gt=3D3B &gt=3D3B ForkHand=<br>> >ler
 child)<BR=3D<br>> >> >>&gt=3D3B &gt=3D3B {<BR>&gt=3D3B &gt=3D3B /* FreeBSD &lt=3D3B 6 lacks pt=<br>> >hread_atfork.=3D<br>> >> > Would be good to use autoconf.<BR>&gt=3D3B &gt=3D3B * VMS lacks pthread=<br>> >_atfork=3D<br>> >> >? Would be good to use autoconf.<BR>&gt=3D3B &gt=3D3B * Win32 lacks pthr=<br>> >ead_atf=3D<br>> >> >ork and fork. OK.<BR>&gt=3D3B &gt=3D3B *<BR>&gt=3D3B &gt=3D3B * As well=<br>> >=3D2C for all =3D<br>> >> >Posix systems=3D2C we could implement<BR>&gt=3D3B &gt=3D3B * atfork ours=<br>> >elves=3D2C =3D<br>> >> >as long as we provide a fork()<BR>&gt=3D3B &gt=3D3B * wrapper that code =<br>> >uses.<B=3D<br>> >> >R>&gt=3D3B &gt=3D3B */<BR>&gt=3D3B &gt=3D3B #if defined(_WIN32)
 \<BR>&gt=<br>> >=3D3B &gt=3D3B =3D<br>> >> >|| defined(__vms) \<BR>&gt=3D3B &gt=3D3B || (defined(__FreeBSD__) /* &am=<br>> >p=3D3B&am=3D<br>> >> >p=3D3B (__FreeBSD__ &lt=3D3B 6)*/ )<BR>&gt=3D3B &gt=3D3B return 0=3D3B<B=<br>> >R>&gt=3D3B &gt=3D<br>> >> >=3D3B #else<BR>&gt=3D3B &gt=3D3B while (1)<BR>&gt=3D3B &gt=3D3B {<BR>&gt=<br>> >=3D3B &gt=3D3B in=3D<br>> >> >t i =3D3D pthread_atfork(prepare=3D2C parent=3D2C child)=3D3B<BR>&gt=3D3=<br>> >B &gt=3D3B if (=3D<br>> >> >i !=3D3D EAGAIN)<BR>&gt=3D3B &gt=3D3B return i=3D3B<BR>&gt=3D3B &gt=3D3B=<br>> > sleep(0)=3D3B<BR=3D<br>> >> >>&gt=3D3B &gt=3D3B }<BR>&gt=3D3B &gt=3D3B #endif<BR>&gt=3D3B &gt=3D3B }<=<br>>
 >BR>&gt=3D3B <BR> =3D<br>> >> >                                        </body><br>> >> ></html>=3D<br>> >> ><br>> >> >--_3dd397d4-ac1d-4148-a9ff-059d27dd794a_--<br>> >                                          =<br>> ><br>> >--_9d99325a-59cc-496a-9b87-3881dbf2b655_<br>> >Content-Type: text/html; charset="iso-8859-1"<br>> >Content-Transfer-Encoding: quoted-printable<br>> ><br>> ><html><br>> ><head><br>> ><style><!--<br>> >.hmmessage P<br>> >{<br>> >margin:0px=3B<br>> >padding:0px<br>> >}<br>> >body.hmmessage<br>> >{<br>> >font-size: 10pt=3B<br>> >font-family:Tahoma<br>> >}<br>> >--></style><br>> ></head><br>> ><body class=3D'hmmessage'><br>> >Previously: user threads: all threads survived fork()<br>Previously: pthrea=<br>> >ds: only the thread
 calling fork() survived fork()<br>Now: user threads and=<br>> > pthreads: only the thread calling fork() survives fork()<br>This must be h=<br>> >ow pthreads behave=2C and this makes user threads and pthreads consistent.<=<br>> >br><br>> >This change depends on pthread_atfork=2C for pthreads and user threads.<br>=<br>> >It only really matters to the rare "fork + do more work" program=2C such as=<br>> > cvsupd.<br>Most programs either never fork=2C or exec almost immediately a=<br>> >fter fork.<br><br><br>pthread_atfork offers a good model.<br>A sort of "dis=<br>> >tributed" model.<br>You don't have to go and change all the calls to fork()=<br>> >.<br>Each module with a need to do something before/after fork=2C calls the=<br>> > central pthread_atfork=2C<br>and fork and pthread_atfork cooperate to do w=<br>> >hat is
 needed.<br><br><br>No function pointer is needed.<br>Instead move th=<br>> >e code to m3core/thread.<br><br><br>If you really must not use -pthread=2C =<br>> >then you must implement pthread_atfork functionality<br>yourself and have a=<br>> >ll fork() calls go through your own fork() wrapper that cooperates<br>with =<br>> >your pthread_atfork replacement.<br>There is no free lunch -- there is a do=<br>> >wnside to this approach=2C as plain fork() calls<br>are ok and correct if p=<br>> >thread_atfork is used=2C but now become incorrect.<br>Pick your poison:<br>=<br>> >&nbsp=3B user thread/pthread inconsistency<br>&nbsp=3B cvsupd incompatibili=<br>> >ty with pthreads <br>&nbsp=3B user threads using pthread_atfork/-pthread <b=<br>> >r>&nbsp=3B fork() calls having to go through a wrapper (ok --
 you could mis=<br>> >s this and <br>&nbsp=3B&nbsp=3B not likely notice -- only fork() calls in f=<br>> >ork+do-more-work programs need the wrapper). <br><br><br>(Most of this has =<br>> >been explained multiple times=2C but people only pay attention<br>when they=<br>> > think it affects them. I'm guilty of the same thing.)<br><br><br>&nbsp=3B-=<br>> > Jay<br><br><br>&gt=3B To: jay.krell@cornell.edu<br>&gt=3B Date: Mon=2C 18 =<br>> >Apr 2011 19:30:58 -0700<br>&gt=3B From: mika@async.caltech.edu<br>&gt=3B CC=<br>> >: m3devel@elegosoft.com<br>&gt=3B Subject: Re: [M3devel] 5.8.6 LINUXLIBC6 b=<br>> >reakage=2C kernel 2.6.23=2C glibc-2.6-4<br>&gt=3B <br>&gt=3B <br>&gt=3B If =<br>> >you or Tony could describe roughly what you think needs to be
 done<br>&gt=<br>> >=3B I'd be happy to look into it.<br>&gt=3B <br>&gt=3B The basic problem is=<br>> > that a decision that's made/described in<br>&gt=3B m3core/thread/m3makefil=<br>> >e needs to someone find its way to controlling<br>&gt=3B what C code gets c=<br>> >ompiled elsewhere in the system.  Or maybe there should<br>&gt=3B be an ind=<br>> >irection into the thread library to pick up pthread_atfork (or not).<br>&gt=<br>> >=3B <br>&gt=3B But then again you still haven't explained why you made the =<br>> >user threads use<br>&gt=3B pthread_atfork.  I just remove it from my instal=<br>> >lations=2C but then again I'm<br>&gt=3B not trying to run CVSup so I don't =<br>> >know if it breaks that program to do so.<br>&gt=3B <br>&gt=3B      Mika<br>=<br>> >&gt=3B
 <br>&gt=3B Jay K writes:<br>&gt=3B &gt=3B--_3dd397d4-ac1d-4148-a9ff-=<br>> >059d27dd794a_<br>&gt=3B &gt=3BContent-Type: text/plain=3B charset=3D"iso-88=<br>> >59-1"<br>&gt=3B &gt=3BContent-Transfer-Encoding: quoted-printable<br>&gt=3B=<br>> > &gt=3B<br>&gt=3B &gt=3B<br>&gt=3B &gt=3B&gt=3B The following code from RTP=<br>> >rocessC.c ensures that it is neeeded on every =3D<br>&gt=3B &gt=3BUnix exce=<br>> >pt<br>&gt=3B &gt=3B&gt=3B &gt=3B /* NOTE: Even userthreads now depends<br>&=<br>> >gt=3B &gt=3B&gt=3B &gt=3B * on availability of pthreads.<br>&gt=3B &gt=3B&g=<br>> >t=3B &gt=3B * This can be fixed if need be.<br>&gt=3B &gt=3B&gt=3B &gt=3B *=<br>> >/<br>&gt=3B &gt=3B<br>&gt=3B
 &gt=3B=3D20<br>&gt=3B &gt=3BOk=3D2C "we" shoul=<br>> >d probably go ahead and fix that.<br>&gt=3B &gt=3BI'll try to=3D2C but no p=<br>> >romises=3D2C sorry.<br>&gt=3B &gt=3B=3D20<br>&gt=3B &gt=3B - Jay<br>&gt=3B =<br>> >&gt=3B=3D20<br>&gt=3B &gt=3B&gt=3B From: hosking@cs.purdue.edu<br>&gt=3B &g=<br>> >t=3B&gt=3B Date: Mon=3D2C 18 Apr 2011 18:11:26 -0400<br>&gt=3B &gt=3B&gt=3B=<br>> > To: mika@async.caltech.edu<br>&gt=3B &gt=3B&gt=3B CC: m3devel@elegosoft.co=<br>> >m<br>&gt=3B &gt=3B&gt=3B Subject: Re: [M3devel] 5.8.6 LINUXLIBC6 breakage=<br>> >=3D2C kernel 2.6.23=3D2C glib=3D<br>&gt=3B &gt=3Bc-2.6-4<br>&gt=3B &gt=3B&g=<br>> >t=3B=3D20<br>&gt=3B &gt=3B&gt=3B Probably unnecessary=3D2C given that I
 thi=<br>> >nk there is another entry point t=3D<br>&gt=3B &gt=3Bo forking a process (I=<br>> > forget where) in the thread-specific portion of m3co=3D<br>&gt=3B &gt=3Bre=<br>> >. In which case the necessary work might be done there?<br>&gt=3B &gt=3B&gt=<br>> >=3B=3D20<br>&gt=3B &gt=3B&gt=3B On Apr 18=3D2C 2011=3D2C at 2:45 PM=3D2C Mi=<br>> >ka Nystrom wrote:<br>&gt=3B &gt=3B&gt=3B=3D20<br>&gt=3B &gt=3B&gt=3B &gt=3B=<br>> > Tony Hosking writes:<br>&gt=3B &gt=3B&gt=3B &gt=3B ...<br>&gt=3B &gt=3B&gt=<br>> >=3B &gt=3B&gt=3B pthread_atfork should not be needed under user threads.<br=<br>> >>&gt=3B &gt=3B&gt=3B &gt=3B ...<br>&gt=3B &gt=3B&gt=3B &gt=3B=3D20<br>&gt=<br>> >=3B &gt=3B&gt=3B
 &gt=3B The following code from RTProcessC.c ensures that i=<br>> >t is neeeded on ever=3D<br>&gt=3B &gt=3By Unix except<br>&gt=3B &gt=3B&gt=<br>> >=3B &gt=3B FreeBSD before 6. The comment is from the checked-in source file=<br>> >.<br>&gt=3B &gt=3B&gt=3B &gt=3B=3D20<br>&gt=3B &gt=3B&gt=3B &gt=3B /* NOTE:=<br>> > Even userthreads now depends<br>&gt=3B &gt=3B&gt=3B &gt=3B * on availabili=<br>> >ty of pthreads.<br>&gt=3B &gt=3B&gt=3B &gt=3B * This can be fixed if need b=<br>> >e.<br>&gt=3B &gt=3B&gt=3B &gt=3B */<br>&gt=3B &gt=3B&gt=3B &gt=3B=3D20<br>&=<br>> >gt=3B &gt=3B&gt=3B &gt=3B INTEGER<br>&gt=3B &gt=3B&gt=3B &gt=3B __cdecl<br>=<br>> >&gt=3B &gt=3B&gt=3B &gt=3B
 RTProcess__RegisterForkHandlers(<br>&gt=3B &gt=<br>> >=3B&gt=3B &gt=3B ForkHandler prepare=3D2C<br>&gt=3B &gt=3B&gt=3B &gt=3B For=<br>> >kHandler parent=3D2C<br>&gt=3B &gt=3B&gt=3B &gt=3B ForkHandler child)<br>&g=<br>> >t=3B &gt=3B&gt=3B &gt=3B {<br>&gt=3B &gt=3B&gt=3B &gt=3B /* FreeBSD &lt=3B =<br>> >6 lacks pthread_atfork. Would be good to use autoconf.<br>&gt=3B &gt=3B&gt=<br>> >=3B &gt=3B * VMS lacks pthread_atfork? Would be good to use autoconf.<br>&g=<br>> >t=3B &gt=3B&gt=3B &gt=3B * Win32 lacks pthread_atfork and fork. OK.<br>&gt=<br>> >=3B &gt=3B&gt=3B &gt=3B *<br>&gt=3B &gt=3B&gt=3B &gt=3B * As well=3D2C for =<br>> >all Posix systems=3D2C we could implement<br>&gt=3B &gt=3B&gt=3B
 &gt=3B * a=<br>> >tfork ourselves=3D2C as long as we provide a fork()<br>&gt=3B &gt=3B&gt=3B =<br>> >&gt=3B * wrapper that code uses.<br>&gt=3B &gt=3B&gt=3B &gt=3B */<br>&gt=3B=<br>> > &gt=3B&gt=3B &gt=3B #if defined(_WIN32) \<br>&gt=3B &gt=3B&gt=3B &gt=3B ||=<br>> > defined(__vms) \<br>&gt=3B &gt=3B&gt=3B &gt=3B || (defined(__FreeBSD__) /*=<br>> > &amp=3B&amp=3B (__FreeBSD__ &lt=3B 6)*/ )<br>&gt=3B &gt=3B&gt=3B &gt=3B re=<br>> >turn 0=3D3B<br>&gt=3B &gt=3B&gt=3B &gt=3B #else<br>&gt=3B &gt=3B&gt=3B &gt=<br>> >=3B while (1)<br>&gt=3B &gt=3B&gt=3B &gt=3B {<br>&gt=3B &gt=3B&gt=3B &gt=3B=<br>> > int i =3D3D pthread_atfork(prepare=3D2C parent=3D2C child)=3D3B<br>&gt=3B
 =<br>> >&gt=3B&gt=3B &gt=3B if (i !=3D3D EAGAIN)<br>&gt=3B &gt=3B&gt=3B &gt=3B retu=<br>> >rn i=3D3B<br>&gt=3B &gt=3B&gt=3B &gt=3B sleep(0)=3D3B<br>&gt=3B &gt=3B&gt=<br>> >=3B &gt=3B }<br>&gt=3B &gt=3B&gt=3B &gt=3B #endif<br>&gt=3B &gt=3B&gt=3B &g=<br>> >t=3B }<br>&gt=3B &gt=3B&gt=3B=3D20<br>&gt=3B &gt=3B                                     =3D<br>&gt=<br>> >=3B &gt=3B<br>&gt=3B &gt=3B--_3dd397d4-ac1d-4148-a9ff-059d27dd794a_<br>&gt=<br>> >=3B &gt=3BContent-Type: text/html=3B charset=3D"iso-8859-1"<br>&gt=3B &gt=<br>> >=3BContent-Transfer-Encoding: quoted-printable<br>&gt=3B &gt=3B<br>&gt=3B &=<br>> >gt=3B&lt=3Bhtml&gt=3B<br>&gt=3B
 &gt=3B&lt=3Bhead&gt=3B<br>&gt=3B &gt=3B&lt=<br>> >=3Bstyle&gt=3B&lt=3B!--<br>&gt=3B &gt=3B.hmmessage P<br>&gt=3B &gt=3B{<br>&=<br>> >gt=3B &gt=3Bmargin:0px=3D3B<br>&gt=3B &gt=3Bpadding:0px<br>&gt=3B &gt=3B}<b=<br>> >r>&gt=3B &gt=3Bbody.hmmessage<br>&gt=3B &gt=3B{<br>&gt=3B &gt=3Bfont-size: =<br>> >10pt=3D3B<br>&gt=3B &gt=3Bfont-family:Tahoma<br>&gt=3B &gt=3B}<br>&gt=3B &g=<br>> >t=3B--&gt=3B&lt=3B/style&gt=3B<br>&gt=3B &gt=3B&lt=3B/head&gt=3B<br>&gt=3B =<br>> >&gt=3B&lt=3Bbody class=3D3D'hmmessage'&gt=3B<br>&gt=3B &gt=3B&amp=3Bgt=3D3B=<br>> > The following code from RTProcessC.c ensures that it is neeeded on e=3D<br=<br>> >>&gt=3B
 &gt=3Bvery Unix except&lt=3BBR&gt=3B&amp=3Bgt=3D3B &amp=3Bgt=3D3B /=<br>> >* NOTE: Even userthreads now depends&lt=3BBR&gt=3B=3D<br>&gt=3B &gt=3B&amp=<br>> >=3Bgt=3D3B &amp=3Bgt=3D3B * on availability of pthreads.&lt=3BBR&gt=3B&amp=<br>> >=3Bgt=3D3B &amp=3Bgt=3D3B * This can be=3D<br>&gt=3B &gt=3B fixed if need b=<br>> >e.&lt=3BBR&gt=3B&amp=3Bgt=3D3B &amp=3Bgt=3D3B */&lt=3BBR&gt=3B&lt=3BBR&gt=<br>> >=3B<br>&gt=3B &gt=3B&amp=3Bnbsp=3D3B&lt=3BBR&gt=3B<br>&gt=3B &gt=3BOk=3D2C =<br>> >"we" should probably go ahead and fix that.&lt=3BBR&gt=3B<br>&gt=3B &gt=3BI=<br>> >'ll try to=3D2C but no&amp=3Bnbsp=3D3Bpromises=3D2C sorry.&lt=3BBR&gt=3B<br=<br>> >>&gt=3B
 &gt=3B&amp=3Bnbsp=3D3B&lt=3BBR&gt=3B<br>&gt=3B &gt=3B&amp=3Bnbsp=3D=<br>> >3B- Jay&lt=3BBR&gt=3B&amp=3Bnbsp=3D3B&lt=3BBR&gt=3B<br>&gt=3B &gt=3B&amp=3B=<br>> >gt=3D3B From: hosking@cs.purdue.edu&lt=3BBR&gt=3B&amp=3Bgt=3D3B Date: Mon=<br>> >=3D2C 18 Apr 2011 18:11=3D<br>&gt=3B &gt=3B:26 -0400&lt=3BBR&gt=3B&amp=3Bgt=<br>> >=3D3B To: mika@async.caltech.edu&lt=3BBR&gt=3B&amp=3Bgt=3D3B CC: m3devel@el=<br>> >egos=3D<br>&gt=3B &gt=3Boft.com&lt=3BBR&gt=3B&amp=3Bgt=3D3B Subject: Re: [M=<br>> >3devel] 5.8.6 LINUXLIBC6 breakage=3D2C kerne=3D<br>&gt=3B &gt=3Bl 2.6.23=3D=<br>> >2C glibc-2.6-4&lt=3BBR&gt=3B&amp=3Bgt=3D3B &lt=3BBR&gt=3B&amp=3Bgt=3D3B Pro=<br>> >bably unnecessary=3D2C given =3D<br>&gt=3B &gt=3Bthat I think
 there is anot=<br>> >her entry point to forking a process (I forget wh=3D<br>&gt=3B &gt=3Bere) i=<br>> >n the thread-specific portion of m3core. In which case the necessary =3D<br=<br>> >>&gt=3B &gt=3Bwork might be done there?&lt=3BBR&gt=3B&amp=3Bgt=3D3B &lt=3BB=<br>> >R&gt=3B&amp=3Bgt=3D3B On Apr 18=3D2C 2011=3D2C at 2:45=3D<br>&gt=3B &gt=3B =<br>> >PM=3D2C Mika Nystrom wrote:&lt=3BBR&gt=3B&amp=3Bgt=3D3B &lt=3BBR&gt=3B&amp=<br>> >=3Bgt=3D3B &amp=3Bgt=3D3B Tony Hosking writes:=3D<br>&gt=3B &gt=3B&lt=3BBR&=<br>> >gt=3B&amp=3Bgt=3D3B &amp=3Bgt=3D3B ...&lt=3BBR&gt=3B&amp=3Bgt=3D3B &amp=3Bg=<br>> >t=3D3B&amp=3Bgt=3D3B pthread_atfork should not be n=3D<br>&gt=3B &gt=3Beede=<br>> >d under user threads.&lt=3BBR&gt=3B&amp=3Bgt=3D3B
 &amp=3Bgt=3D3B ...&lt=3BB=<br>> >R&gt=3B&amp=3Bgt=3D3B &amp=3Bgt=3D3B &lt=3BBR&gt=3B&amp=3Bgt=3D3B =3D<br>&g=<br>> >t=3B &gt=3B&amp=3Bgt=3D3B The following code from RTProcessC.c ensures that=<br>> > it is neeeded on e=3D<br>&gt=3B &gt=3Bvery Unix except&lt=3BBR&gt=3B&amp=<br>> >=3Bgt=3D3B &amp=3Bgt=3D3B FreeBSD before 6. The comment is from the=3D<br>&=<br>> >gt=3B &gt=3B checked-in source file.&lt=3BBR&gt=3B&amp=3Bgt=3D3B &amp=3Bgt=<br>> >=3D3B &lt=3BBR&gt=3B&amp=3Bgt=3D3B &amp=3Bgt=3D3B /* NOTE: Even u=3D<br>&gt=<br>> >=3B &gt=3Bserthreads now depends&lt=3BBR&gt=3B&amp=3Bgt=3D3B &amp=3Bgt=3D3B=<br>> > * on availability of pthreads.&lt=3BBR&gt=3B&amp=3B=3D<br>&gt=3B &gt=3Bgt=<br>> >=3D3B &amp=3Bgt=3D3B * This can be
 fixed if need be.&lt=3BBR&gt=3B&amp=3Bgt=<br>> >=3D3B &amp=3Bgt=3D3B */&lt=3BBR&gt=3B&amp=3Bgt=3D3B =3D<br>&gt=3B &gt=3B&am=<br>> >p=3Bgt=3D3B &lt=3BBR&gt=3B&amp=3Bgt=3D3B &amp=3Bgt=3D3B INTEGER&lt=3BBR&gt=<br>> >=3B&amp=3Bgt=3D3B &amp=3Bgt=3D3B __cdecl&lt=3BBR&gt=3B&amp=3Bgt=3D3B &amp=<br>> >=3Bgt=3D3B =3D<br>&gt=3B &gt=3BRTProcess__RegisterForkHandlers(&lt=3BBR&gt=<br>> >=3B&amp=3Bgt=3D3B &amp=3Bgt=3D3B ForkHandler prepare=3D2C&lt=3BBR=3D<br>&gt=<br>> >=3B &gt=3B&gt=3B&amp=3Bgt=3D3B &amp=3Bgt=3D3B ForkHandler parent=3D2C&lt=3B=<br>> >BR&gt=3B&amp=3Bgt=3D3B &amp=3Bgt=3D3B ForkHandler child)&lt=3BBR=3D<br>&gt=<br>> >=3B &gt=3B&gt=3B&amp=3Bgt=3D3B &amp=3Bgt=3D3B
 {&lt=3BBR&gt=3B&amp=3Bgt=3D3B=<br>> > &amp=3Bgt=3D3B /* FreeBSD &amp=3Blt=3D3B 6 lacks pthread_atfork.=3D<br>&gt=<br>> >=3B &gt=3B Would be good to use autoconf.&lt=3BBR&gt=3B&amp=3Bgt=3D3B &amp=<br>> >=3Bgt=3D3B * VMS lacks pthread_atfork=3D<br>&gt=3B &gt=3B? Would be good to=<br>> > use autoconf.&lt=3BBR&gt=3B&amp=3Bgt=3D3B &amp=3Bgt=3D3B * Win32 lacks pth=<br>> >read_atf=3D<br>&gt=3B &gt=3Bork and fork. OK.&lt=3BBR&gt=3B&amp=3Bgt=3D3B &=<br>> >amp=3Bgt=3D3B *&lt=3BBR&gt=3B&amp=3Bgt=3D3B &amp=3Bgt=3D3B * As well=3D2C f=<br>> >or all =3D<br>&gt=3B &gt=3BPosix systems=3D2C we could implement&lt=3BBR&gt=<br>> >=3B&amp=3Bgt=3D3B &amp=3Bgt=3D3B * atfork ourselves=3D2C =3D<br>&gt=3B &gt=<br>> >=3Bas long as we provide a
 fork()&lt=3BBR&gt=3B&amp=3Bgt=3D3B &amp=3Bgt=3D3=<br>> >B * wrapper that code uses.&lt=3BB=3D<br>&gt=3B &gt=3BR&gt=3B&amp=3Bgt=3D3B=<br>> > &amp=3Bgt=3D3B */&lt=3BBR&gt=3B&amp=3Bgt=3D3B &amp=3Bgt=3D3B #if defined(_=<br>> >WIN32) \&lt=3BBR&gt=3B&amp=3Bgt=3D3B &amp=3Bgt=3D3B =3D<br>&gt=3B &gt=3B|| =<br>> >defined(__vms) \&lt=3BBR&gt=3B&amp=3Bgt=3D3B &amp=3Bgt=3D3B || (defined(__F=<br>> >reeBSD__) /* &amp=3Bamp=3D3B&amp=3Bam=3D<br>&gt=3B &gt=3Bp=3D3B (__FreeBSD_=<br>> >_ &amp=3Blt=3D3B 6)*/ )&lt=3BBR&gt=3B&amp=3Bgt=3D3B &amp=3Bgt=3D3B return 0=<br>> >=3D3B&lt=3BBR&gt=3B&amp=3Bgt=3D3B &amp=3Bgt=3D<br>&gt=3B &gt=3B=3D3B #else&=<br>> >lt=3BBR&gt=3B&amp=3Bgt=3D3B &amp=3Bgt=3D3B while
 (1)&lt=3BBR&gt=3B&amp=3Bgt=<br>> >=3D3B &amp=3Bgt=3D3B {&lt=3BBR&gt=3B&amp=3Bgt=3D3B &amp=3Bgt=3D3B in=3D<br>=<br>> >&gt=3B &gt=3Bt i =3D3D pthread_atfork(prepare=3D2C parent=3D2C child)=3D3B&=<br>> >lt=3BBR&gt=3B&amp=3Bgt=3D3B &amp=3Bgt=3D3B if (=3D<br>&gt=3B &gt=3Bi !=3D3D=<br>> > EAGAIN)&lt=3BBR&gt=3B&amp=3Bgt=3D3B &amp=3Bgt=3D3B return i=3D3B&lt=3BBR&g=<br>> >t=3B&amp=3Bgt=3D3B &amp=3Bgt=3D3B sleep(0)=3D3B&lt=3BBR=3D<br>&gt=3B &gt=3B=<br>> >&gt=3B&amp=3Bgt=3D3B &amp=3Bgt=3D3B }&lt=3BBR&gt=3B&amp=3Bgt=3D3B &amp=3Bgt=<br>> >=3D3B #endif&lt=3BBR&gt=3B&amp=3Bgt=3D3B &amp=3Bgt=3D3B }&lt=3BBR&gt=3B&amp=<br>> >=3Bgt=3D3B &lt=3BBR&gt=3B =3D<br>&gt=3B &gt=3B                                        &lt=3B/body&gt=3B<=<br>>
 >br>&gt=3B &gt=3B&lt=3B/html&gt=3B=3D<br>&gt=3B &gt=3B<br>&gt=3B &gt=3B--_3d=<br>> >d397d4-ac1d-4148-a9ff-059d27dd794a_--<br>                                        </body><br>> ></html>=<br>> ><br>> >--_9d99325a-59cc-496a-9b87-3881dbf2b655_--<br>                                        
</div></blockquote></td></tr></table>