<html><head><base href="x-msg://821/"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">fork should still work with pthreads.  Why wouldn't it?<div>Unless there is something weird about the semaphore used to start and stop threads?</div><div>If the child ends up with the same semaphore then that would be a problem.</div><div>Perhaps we need to ensure it is replicated it in forked children using pthread_atfork?</div><div>You could try things on a target like OSX where threads are stopped/started natively (i.e., no semaphore being used).</div><div>Though, on inspection I see that sem_init is called with pshared == false.<br><div><br><div>
<span class="Apple-style-span" style="border-collapse: separate; 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; orphans: 2; text-align: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0; "><span class="Apple-style-span" style="border-collapse: separate; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 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; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 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; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-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; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 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; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-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; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 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; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-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; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 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; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-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; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 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; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-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; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 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; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-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; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 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; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-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; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 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; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-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 class="Apple-converted-space"> </span>|<span class="Apple-converted-space"> </span></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 class="Apple-converted-space"> </span></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; "><span class="Apple-converted-space"> </span>+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></span><br class="Apple-interchange-newline">
</div>
<br><div><div>On 16 Mar 2010, at 13:43, Jay K wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><span class="Apple-style-span" style="border-collapse: separate; font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div class="hmmessage" style="font-size: 10pt; font-family: Verdana; ">With fork, which data is copy-on-write vs. shared-write?<br>mmap has a flag, so it is up to each caller. You end up with a mix.<br> <br> <br>Whether or not you get one forked thread or all of them I believe varies.<br>Solaris has "fork1()".<br>There is no obvious answer.<br>It just goes to show how wierd fork() is.<br> <br> <br>I'm not sure any longer there is a connection to mmap/sbrk.<br>It might be just user threads vs. not.<br>Though there again there is a question as to which data is<br>shared-write vs. copy-on-write.<br> <br> <br>The server should not crash.<br>It is written in an optionally save language, after all.<br>More so, that is I believe a much more larger more difficult fix to apply.<br>Using processes for such separation is deemed overkill, depending<br>on whose story you believe.<br>I'll have to think about it more.<br> <br> <br> - Jay<br> <br>> Date: Tue, 16 Mar 2010 18:07:38 +0100<br>> From:<span class="Apple-converted-space"> </span><a href="mailto:wagner@elegosoft.com">wagner@elegosoft.com</a><br>> To:<span class="Apple-converted-space"> </span><a href="mailto:m3devel@elegosoft.com">m3devel@elegosoft.com</a><br>> Subject: Re: [M3devel] cvsup<br>><span class="Apple-converted-space"> </span><br>> Quoting Jay K <<a href="mailto:jay.krell@cornell.edu">jay.krell@cornell.edu</a>>:<br>><span class="Apple-converted-space"> </span><br>> ><br>> > User threads is apparently sufficient to let it work -- no change to<span class="Apple-converted-space"> </span><br>> > sbrk vs. mmap.<br>> ><br>> > You end up with a wierd mix of shared and not shared data, right?<br>> ><br>> > I'll try to make it use pthreads and Modula-3 threads and not fork().<br>><span class="Apple-converted-space"> </span><br>> I cannot really follow you here. Why should fork not work for<br>> threaded processes? The kernel should duplicate all threads and all<br>> memory regions, right?<br>><span class="Apple-converted-space"> </span><br>> I don't seem to get the connection you make to sbrk vs. mmap.<br>> Can you explain?<br>><span class="Apple-converted-space"> </span><br>> Using a thread for the process fork will probably not work contrary<br>> to my former statement that it might, as each client process is<br>> expected to have multiple threads.<br>><span class="Apple-converted-space"> </span><br>> And the address spaces of the server processes should be separate<br>> for security and robustness reasons, as they are each connected to<br>> different clients, and one client's server crash must not impact the<br>> other sessions.<br>><span class="Apple-converted-space"> </span><br>> Or am I misunderstanding what you intend to do?<br>><span class="Apple-converted-space"> </span><br>> Olaf<br>><span class="Apple-converted-space"> </span><br>> > - Jay<br>> ><br>> ><br>> ><br>> ><br>> > From:<span class="Apple-converted-space"> </span><a href="mailto:jay.krell@cornell.edu">jay.krell@cornell.edu</a><br>> > To:<span class="Apple-converted-space"> </span><a href="mailto:hosking@cs.purdue.edu">hosking@cs.purdue.edu</a><br>> > Date: Tue, 16 Mar 2010 16:10:15 +0000<br>> > CC:<span class="Apple-converted-space"> </span><a href="mailto:m3devel@elegosoft.com">m3devel@elegosoft.com</a><br>> > Subject: Re: [M3devel] cvsup<br>> ><br>> ><br>> ><br>> > I could have sworn I had not seen hanging with sbrk or map_shared,<span class="Apple-converted-space"> </span><br>> > but I can't get that now.<br>> > I'll dig a bit more..maybe not today.<br>> > To be clear, this isn't even the usual fork+exec. This is fork + do<span class="Apple-converted-space"> </span><br>> > work + exit.<br>> > We can probably fix it by having it create a Modula-3 thread.<br>> > The first fork (daemonize) is probably fine. It is the per-client<span class="Apple-converted-space"> </span><br>> > one that I think is a problem.<br>> > I'd like to find a theory as to why it ever worked, maybe see it<span class="Apple-converted-space"> </span><br>> > work, and then fix it differently.<br>> > Maybe sbrk + user threads?<br>> ><br>> > (Can anyone claim to have seen cvsup server work with kernel threads?)<br>> ><br>> > - Jay<br>> ><br>> ><br>> ><br>> > From:<span class="Apple-converted-space"> </span><a href="mailto:hosking@cs.purdue.edu">hosking@cs.purdue.edu</a><br>> > Date: Tue, 16 Mar 2010 11:43:52 -0400<br>> > To:<span class="Apple-converted-space"> </span><a href="mailto:jay.krell@cornell.edu">jay.krell@cornell.edu</a><br>> > CC:<span class="Apple-converted-space"> </span><a href="mailto:m3devel@elegosoft.com">m3devel@elegosoft.com</a><br>> > Subject: Re: [M3devel] cvsup<br>> ><br>> > mmap is strongly preferred over sbrk.<br>> ><br>> ><br>> > I'd need to understand the control flow here in and across the<span class="Apple-converted-space"> </span><br>> > processes, but yes, generally, mixing pthreads with fork may require<span class="Apple-converted-space"> </span><br>> > significant care.<br>> ><br>> ><br>> ><br>> > On 16 Mar 2010, at 11:33, Jay K wrote:<br>> ><br>> > Daniel thank you for the bug report.<br>> > Thank you for suggesting strace. I used strace<br>> > and compared working vs. non-working.<br>> > And started added RTIO everywhere.<br>> > You can also use cvsup -f to slightly simplify -- one fork instead of two.<br>> > gdb set follow mode didn't seem to help.<br>> ><br>> ><br>> > I almost have it nailed down.<br>> ><br>> ><br>> > in CVSup, FSServer.m3, this code:<br>> ><br>> > FINALLY<br>> > IF isChild THEN<br>> > SigHandler.ShutDown(); <==<br>> > ELSE<br>> > SigHandler.Unblock();<br>> > END;<br>> > END;<br>> ><br>> ><br>> > which runs fairly early, never returns in the child.<br>> ><br>> ><br>> > It ends up here:<br>> ><br>> ><br>> > PROCEDURE ChangeState(d: Dispatcher; state: State) =<br>> > (* Ask the dispatcher thread to change to a new state, and wait until<br>> > it has made the change. *)<br>> > BEGIN<br>> > LOCK d.mu DO<br>> > d.desiredState := state;<br>> > IF d.state # d.desiredState THEN<br>> > IF d.state = State.Running THEN<br>> > (* Send dummy signal 0 to wake up the dispatcher. *)<br>> > Catch(0);<br>> > ELSE<br>> > Thread.Signal(d.changeState);<br>> > END;<br>> > WHILE d.state # d.desiredState DO<br>> > Thread.Wait(d.mu, d.stateChanged); <== this never returns<br>> > END;<br>> > END;<br>> > END;<br>> > END ChangeState;<br>> ><br>> ><br>> > It's a bit wierd to be mixing fork() and Modula-3 Thread?<br>> > Or maybe it is ok?<br>> ><br>> ><br>> > See, they are asking another process, from the fork() point of view,<span class="Apple-converted-space"> </span><br>> > to change the state.<br>> > It does so, but the write is private.<br>> ><br>> ><br>> > Remember...Olaf changed from sbrk to mmap(anon|private) in RTOS.GetMemory()?<br>> > sbrk is maybe shared? mmap(anon|private) is not.<br>> ><br>> > Right now I have<br>> > #ifndef apple<br>> > sbrk<br>> > #else<br>> > mmap(anon|shared)<br>> > #endif<br>> ><br>> ><br>> > and it gets further.<br>> > Hit an assertion failure in pthread.<br>> > I'll try again.<br>> > Cleanup all my RTIO.<br>> ><br>> ><br>> > Maybe this notion of using fork() is just not supportable?<br>> ><br>> ><br>> > In either case...you could paint it as an m3core problem, but<br>> > ?it won't affect much code?.<br>> ><br>> ><br>> > - Jay<br>> ><br>> ><br>> ><br>> > From:<span class="Apple-converted-space"> </span><a href="mailto:jay.krell@cornell.edu">jay.krell@cornell.edu</a><br>> > To:<span class="Apple-converted-space"> </span><a href="mailto:m3devel@elegosoft.com">m3devel@elegosoft.com</a><br>> > Subject: cvsup<br>> > Date: Tue, 16 Mar 2010 12:32:49 +0000<br>> ><br>> > I can reproduce the cvsup problem.<br>> > An important point to consider is that cvsupd forks a server?<br>> > Maybe that messes up initialization?<br>> > I'll dig further.<br>> ><br>> ><br>> > I think these steps are complete.<br>> > I'll test them on a second clean system.<br>> > You don't need any real data.<br>> ><br>> ><br>> > jay@xlin2:~$ cat cvsupd.cfg<br>> > *default tag=.<br>> > *default host=xlin2.<br>> > *default prefix=/home/jay<br>> > *default base=/home/jay/var/db<br>> > *default release=cvs delete use-rel-suffix compress<br>> ><br>> > src-all<br>> ><br>> ><br>> > mkdir -p $HOME/var/db<br>> > mkdir -p $HOME/data/cvsupd<br>> > pkill cvsupd # cleanup any previous<br>> ><br>> ><br>> > You don't really need any data.<br>> > cvsup/cvsupd will issue an error in the "working" case, and<br>> > hang in the non-working case.<br>> ><br>> ><br>> ><br>> ><br>> > run the server:<br>> ><br>> ><br>> > jay@xlin2:~$ /cm3/bin/cvsupd -b $HOME/data/cvsupd<br>> > 2010.03.16 05:24:25 PDT [22555]: CVSup server started<br>> > 2010.03.16 05:24:25 PDT [22555]: Software version: 2010-03-05 10:55:15<br>> > 2010.03.16 05:24:25 PDT [22555]: Protocol version: 17.0<br>> > 2010.03.16 05:24:25 PDT [22555]: Ready to service requests<br>> ><br>> ><br>> > run the client:<br>> ><br>> > /cm3/bin/cvsup -g -L 2 $HOME/cvsupd.cfg<br>> ><br>> ><br>> > Parsing supfile "/home/jay/cvsupd.cfg"<br>> > Connecting to xlin2.<br>> > Connected to xlin2.<br>> > Server software version: 2010-03-05<br>> > Negotiating file attribute support<br>> > Exchanging collection information<br>> > Server message: Unknown collection "src-all"<br>> > Establishing multiplexed-mode data connection<br>> > Running<br>> > Skipping collection src-all/cvs<br>> > Shutting down connection to server<br>> > Finished successfully<br>> ><br>> > it is able to talk to the server, and then fails.<br>> > Ok -- at least it talked to the server.<br>> ><br>> > The server then exits too.<br>> > I think that is correct (read the usage on the -C option).<br>> ><br>> ><br>> > Then try with -C.<br>> > The bug says -C 2. Let's use -C 1.<br>> > They behave the same for our purposes.<br>> ><br>> ><br>> > Just add -C 1 to the above server.<br>> > Run the same client.<br>> > The client hangs -- it never connects to the server.<br>> ><br>> ><br>> > I reproduced this on LINUXLIBC6 and PPC_LINUX.<br>> > Maybe more soon.<br>> > I'm just rebuilding first.<br>> ><br>> ><br>> > - Jay<br>> ><br>> ><br>><span class="Apple-converted-space"> </span><br>><span class="Apple-converted-space"> </span><br>><span class="Apple-converted-space"> </span><br>> --<span class="Apple-converted-space"> </span><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>><span class="Apple-converted-space"> </span><a href="http://www.elegosoft.com">http://www.elegosoft.com</a><span class="Apple-converted-space"> </span>| Geschäftsführer: Olaf Wagner | Sitz: Berlin<br>> Handelregister: Amtsgericht Charlottenburg HRB 77719 | USt-IdNr: DE163214194<br>><span class="Apple-converted-space"> </span><br></div></span></blockquote></div><br></div></div></body></html>