This is the mail archive of the
cygwin-patches
mailing list for the Cygwin project.
[PATCH 5/5] Cygwin: FIFO: stop the listen_client thread before fork/exec
- From: Ken Brown <kbrown at cornell dot edu>
- To: "cygwin-patches at cygwin dot com" <cygwin-patches at cygwin dot com>
- Date: Sat, 20 Apr 2019 18:58:51 +0000
- Subject: [PATCH 5/5] Cygwin: FIFO: stop the listen_client thread before fork/exec
- References: <20190420185834.4228-1-kbrown@cornell.edu>
Add methods need_fixup_before, init_fixup_before, and
fixup_before_fork_exec to accomplish this. Stopping the thread makes
sure that the client handler lists of the parent and child remain in
sync while the forking/execing is in progress.
---
winsup/cygwin/fhandler.h | 3 +++
winsup/cygwin/fhandler_fifo.cc | 15 +++++++++++++--
2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h
index da007ee45..0df25aa40 100644
--- a/winsup/cygwin/fhandler.h
+++ b/winsup/cygwin/fhandler.h
@@ -1300,6 +1300,9 @@ public:
void __reg3 raw_read (void *ptr, size_t& ulen);
ssize_t __reg3 raw_write (const void *ptr, size_t ulen);
bool arm (HANDLE h);
+ bool need_fixup_before () const { return reader; }
+ int fixup_before_fork_exec (DWORD) { return stop_listen_client (); }
+ void init_fixup_before ();
void fixup_after_fork (HANDLE);
void fixup_after_exec ();
int __reg2 fstatvfs (struct statvfs *buf);
diff --git a/winsup/cygwin/fhandler_fifo.cc b/winsup/cygwin/fhandler_fifo.cc
index 3ee307bcc..9b94a6da9 100644
--- a/winsup/cygwin/fhandler_fifo.cc
+++ b/winsup/cygwin/fhandler_fifo.cc
@@ -522,7 +522,10 @@ fhandler_fifo::open (int flags, mode_t)
goto out;
}
else
- res = success;
+ {
+ init_fixup_before ();
+ res = success;
+ }
}
/* If we're writing, wait for read_ready and then connect to the
@@ -752,7 +755,7 @@ fhandler_fifo::raw_read (void *in_ptr, size_t& len)
{
size_t orig_len = len;
- /* Start the listen_client thread if necessary (e.g., after dup or fork). */
+ /* Start the listen_client thread if necessary (e.g., after fork or exec). */
if (!listen_client_thr && !listen_client ())
goto errout;
@@ -934,10 +937,18 @@ fhandler_fifo::dup (fhandler_base *child, int flags)
fhf->fifo_client_unlock ();
if (!reader || fhf->listen_client ())
ret = 0;
+ if (reader)
+ fhf->init_fixup_before ();
out:
return ret;
}
+void
+fhandler_fifo::init_fixup_before ()
+{
+ cygheap->fdtab.inc_need_fixup_before ();
+}
+
void
fhandler_fifo::fixup_after_fork (HANDLE parent)
{
--
2.17.0