[M3devel] pthread_atfork
Olaf Wagner
wagner at elegosoft.com
Sat Feb 12 20:55:27 CET 2011
Well, I think actually the fork-and-do-work pattern has been
the default for a long time with the M3 user threads implementation.
It wasn't specified though, and I think no application except
CVSup did use it.
Jay is not responsible for any breakage here, he just tried to fix
CVSup and establish a consistent behaviour after our change to
system pthreads on most platforms.
Olaf
Quoting Mika Nystrom <mika at async.caltech.edu>:
> Hi Jay,
>
> I think "fork and do work" qualifies as a bug in the application, if
> the application wants to be portable. Why can't it fork and exec instead?
> If it wants to do more work it should just fork and exec another copy
> of itself.
>
> fork() is also not part of Modula-3... Process.Create() is, however.
> Don't tell me you broke that as part of "fixing" things for cvsupd...
>
> There is still one aspect of your comment I don't understand. What does
> the call to pthread_atfork actually accomplish when running with user
> threads? You say below that "don't expect pthreads to work on FreeBSD <
> 6 [using the fork-and-do-work pattern]". Fair enough. But why would
> user threads work? We're skipping pthread_atfork for them too.
>
> Do we not need pthread_atfork with user threads? What you're saying
> suggests that FreeBSD >= 6 and all other platforms need pthread_atfork
> with user threads. Is that really what you mean?
>
> At the moment I'm just concerned with getting user threads to work as
> I know there are bugs with pthreads.
>
> I also think we should not waste time and effort making the "fork and do
> work" pattern work unless it's really, really necessary (which I really
> don't see why it would be). Fix the application instead of introducing
> bugs in the libraries and language implementation!
>
> I've been trying for a long, long time to switch from PM3 to CM3 (almost
> ten years, I think). These bugs from "enhancements" have stopped me
> every time. Maybe things are finally working well enough...
>
> (some comments inline in your quoted text below)
>
> Mika
>
>
> Jay K writes:
>> --_19a7daf7-3f48-43cb-bea8-6f0fa13b0fef_
>> Content-Type: text/plain; charset="iso-8859-1"
>> Content-Transfer-Encoding: quoted-printable
>>
>>
>> I wrote that.
>>
>> As I recall=2C FreeBSD < 6 doesn't have pthread_atfork.
>>
>> I think that was based on reading the man pages.
>>
>> So=2C yes. What would you suggest?
>>
>>
>>
>>
>>
>> All this atfork stuff came about as part of getting cvsupd to work.
>>
>> With pthreads/kernel threads. It historically worked=2C with Modula-3 use=
>> r threads.
>>
>> Modula-3 user threads have this funny property that all threads survive w=
>> ork.
>
> you mean survive fork don't you?
>
>>
>> With pthreads/kernel threads=2C fork gives you a new process with just on=
>> e thread.
>>
>> (Solaris has fork1 and forkall=2C and fork maybe used to be forkall=2C b=
>> ut now it is fork1).
>>
>>
>>
>>
>>
>> cvsupd is one of those slightly unusual programs that does "fork and then d=
>> o more work"
>>
>> as supposed to the more typical "fork and exec".
>>
>>
>>
>> Which is to say..I don't know. Maybe=2C don't expect pthreads to work on Fr=
>> eeBSD < 6?
>>
>> At least not in a process that ever calls fork? Or does "fork and then more=
>> work"?
>>
>>
>>
>>
>>
>> In reality=2C i think a lot of libraries have trouble with "fork and then d=
>> o more work"=2C but
>>
>> I don't know. I recall vague notices in the Apple/Darwin manpages not to as=
>> sume
>>
>> this works -- the obvious implication that there is plenty of use of pthrea=
>> ds e.g. mutexes=2C
>>
>> but relatively little use of pthread_atfork.
>>
>>
>>
>>
>>
>> You could perhaps replace all uses of fork with a function that called the =
>> fork handlers=2C
>>
>> then fork=2C then the other handlers. That is probably what I meant in the =
>> comment
>>
>> about this being easy to fix.
>>
>> You might though then run into the problem that callers of fork can't do mu=
>> ch
>>
>> before exec...oh=2C that's vfork I bet actually.
>
> I don't understand this paragraph either :(
>
>>
>>
>>
>>
>>
>> - Jay
>>
>>
>>
>>
>>
>>
>>> To: hosking at cs.purdue.edu
>>> Date: Fri=2C 11 Feb 2011 19:05:25 -0800
>>> From: mika at async.caltech.edu
>>> CC: m3devel at elegosoft.com=3B jay.krell at cornell.edu
>>> Subject: [M3devel] pthread_atfork
>>> =20
>>> Tony=2C
>>> =20
>>> What's RTProcessC.c doing?
>>> =20
>>> I note the following cryptic comment:
>>> =20
>>> /* NOTE: Even userthreads now depends
>>> * on availability of pthreads.
>>> * This can be fixed if need be.
>>> */
>>> =20
>>> now further down we can read:
>>> =20
>>> #if defined(_WIN32) \
>>> || defined(__vms) \
>>> || (defined(__FreeBSD__) && (__FreeBSD__ < 6))
>>> return 0=3B
>>> #else
>>> while (1)
>>> {
>>> int i =3D pthread_atfork(prepare=2C parent=2C child)=3B
>>> if (i !=3D EAGAIN)
>>> return i=3B
>>> sleep(0)=3B
>>> }
>>> #endif
>>> =20
>>> so on FreeBSD 5 (what I'm running on my "FreeBSD4" system)=2C
>>> RTProcess.RegisterForkHandlers does nothing?
>>> =20
>>> Hmmm.....
>>> =20
>>> Mika
>> =
>>
>> --_19a7daf7-3f48-43cb-bea8-6f0fa13b0fef_
>> Content-Type: text/html; charset="iso-8859-1"
>> Content-Transfer-Encoding: quoted-printable
>>
>> <html>
>> <head>
>> <style><!--
>> .hmmessage P
>> {
>> margin:0px=3B
>> padding:0px
>> }
>> body.hmmessage
>> {
>> font-size: 10pt=3B
>> font-family:Tahoma
>> }
>> --></style>
>> </head>
>> <body class=3D'hmmessage'>
>> I wrote that.<br>
>> As I recall=2C FreeBSD <=3B 6 doesn't have pthread_atfork.<br>
>> I think that was based on reading the man pages.<br>
>> So=2C yes. What would you suggest?<br>
>> <br>
>> <br>
>> All this atfork stuff came about as part of getting cvsupd to work.<br>
>>  =3B With pthreads/kernel threads. It historically worked=2C with Modul=
>> a-3 user threads.<br>
>>  =3B Modula-3 user threads have this funny property that all threads su=
>> rvive work.<br>
>>  =3B With pthreads/kernel threads=2C fork gives you a new process with =
>> just one thread.<br>
>>  =3B =3B (Solaris has fork1 and forkall=2C and fork maybe used to b=
>> e forkall=2C but now it is fork1).<br>
>> <br>
>> <br>
>> cvsupd is one of those slightly unusual programs that does "fork and then d=
>> o more work"<br>
>> as supposed to the more typical "fork and exec".<br>
>> <br>
>> Which is to say..I don't know. Maybe=2C don't expect pthreads to work on Fr=
>> eeBSD <=3B 6?<br>
>> At least not in a process that ever calls fork? Or does "fork and then more=
>> work"?<br>
>> <br>
>> <br>
>> In reality=2C i think a lot of libraries have trouble with "fork and then d=
>> o more work"=2C but<br>
>> I don't know. I recall vague notices in the Apple/Darwin manpages not to as=
>> sume<br>
>> this works -- the obvious implication that there is plenty of use of pthrea=
>> ds e.g. mutexes=2C<br>
>> but relatively little use of pthread_atfork.<br>
>> <br>
>> <br>
>> You could perhaps replace all uses of fork with a function that called the =
>> fork handlers=2C<br>
>> then fork=2C then the other handlers. That is probably what I meant in the =
>> comment<br>
>> about this being easy to fix.<br>
>> You might though then run into the problem that callers of fork can't do mu=
>> ch<br>
>> before exec...oh=2C that's vfork I bet actually.<br>
>> <br>
>> <br>
>>  =3B- Jay<br><br><br><br><br><br><br>>=3B To: hosking at cs.purdue.edu<b=
>> r>>=3B Date: Fri=2C 11 Feb 2011 19:05:25 -0800<br>>=3B From: mika at async=
>> .caltech.edu<br>>=3B CC: m3devel at elegosoft.com=3B jay.krell at cornell.edu<b=
>> r>>=3B Subject: [M3devel] pthread_atfork<br>>=3B <br>>=3B Tony=2C<br>=
>> >=3B <br>>=3B What's RTProcessC.c doing?<br>>=3B <br>>=3B I note th=
>> e following cryptic comment:<br>>=3B <br>>=3B /* NOTE: Even userthreads=
>> now depends<br>>=3B * on availability of pthreads.<br>>=3B * This ca=
>> n be fixed if need be.<br>>=3B */<br>>=3B <br>>=3B now further down =
>> we can read:<br>>=3B <br>>=3B #if defined(_WIN32) \<br>>=3B |=
>> | defined(__vms) \<br>>=3B || (defined(__FreeBSD__) &=3B&=
>> =3B (__FreeBSD__ <=3B 6))<br>>=3B return 0=3B<br>>=3B #else<br>&g=
>> t=3B while (1)<br>>=3B {<br>>=3B int i =3D pthread_atfork=
>> (prepare=2C parent=2C child)=3B<br>>=3B if (i !=3D EAGAIN)<br>>=
>> =3B return i=3B<br>>=3B sleep(0)=3B<br>>=3B }<br>>=
>> =3B #endif<br>>=3B <br>>=3B so on FreeBSD 5 (what I'm running on my "Fr=
>> eeBSD4" system)=2C<br>>=3B RTProcess.RegisterForkHandlers does nothing?<b=
>> r>>=3B <br>>=3B Hmmm.....<br>>=3B <br>>=3B Mika<br>
>> =
>> </body>
>> </html>=
>>
>> --_19a7daf7-3f48-43cb-bea8-6f0fa13b0fef_--
>
--
Olaf Wagner -- elego Software Solutions GmbH
Gustav-Meyer-Allee 25 / Gebäude 12, 13355 Berlin, Germany
phone: +49 30 23 45 86 96 mobile: +49 177 2345 869 fax: +49 30 23 45 86 95
http://www.elegosoft.com | Geschäftsführer: Olaf Wagner | Sitz: Berlin
Handelregister: Amtsgericht Charlottenburg HRB 77719 | USt-IdNr: DE163214194
More information about the M3devel
mailing list