This is the mail archive of the cygwin mailing list for the Cygwin project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Bug in fork() while in a thread

On 15/08/2010 20:53, Christopher Faylor wrote:
On Sun, Aug 15, 2010 at 07:42:01PM +0200, Jason Curl wrote:
In particular, if I create a thread, then issue a fork(), data that
exists on the stack is corrupted after the fork() is in the child. Using
data on the heap doesn't show any issues (and is currently my
workaround, in case this is a bug).

If I'm reading this correctly then "the stack" in this case is the stack associated with the main thread. Cygwin only duplicates the stack in the executing thread. In your example, env (or presumably env2) from the main thread is passed to another thread which then calls fork. In that scenario, the forked process is going to see garbage in env since the array has never been initialized.

It is theoretically possible to duplicate the stack of the main thread
and other threads in the forked process but this isn't something that I,
personally, would want to take on.  I'm the guy who wrote the code that
duplicates the state of the stack when a thread forks.  It was done at
the request of a customer and it was very tricky to get right.  This
isn't an experience I'd willingly take on again since it would be a lot
of work, would require testing on every Windows OS from NT4 on, and
would potentially slow down an already slow down Cygwin's already slow
fork() implementation.

However, if this is something that you're willing to do, I'll happily
review a patch to the cygwin1.dll.  You'd need to modify fork related
code in

Thanks Chris for the detailed reply. I've got a workaround and you've confirmed it is correct with your explanation. I don't get much time, my C++ needs improving, let's see what I can do.


-- Problem reports: FAQ: Documentation: Unsubscribe info:

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]