[PATCH fifo 5/8] Cygwin: FIFO: update clone and dup
Ken Brown
kbrown@cornell.edu
Fri Mar 22 19:31:00 GMT 2019
Deal with all clients.
---
winsup/cygwin/fhandler.h | 8 +++++---
winsup/cygwin/fhandler_fifo.cc | 25 +++++++++++++++++++++++++
2 files changed, 30 insertions(+), 3 deletions(-)
diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h
index af5f500bf..0ebc44e0d 100644
--- a/winsup/cygwin/fhandler.h
+++ b/winsup/cygwin/fhandler.h
@@ -1309,9 +1309,11 @@ public:
fhandler_fifo *clone (cygheap_types malloc_type = HEAP_FHANDLER)
{
void *ptr = (void *) ccalloc (malloc_type, 1, sizeof (fhandler_fifo));
- fhandler_fifo *fh = new (ptr) fhandler_fifo (ptr);
- copyto (fh);
- return fh;
+ fhandler_fifo *fhf = new (ptr) fhandler_fifo (ptr);
+ copyto (fhf);
+ for (int i = 0; i < nclients; i++)
+ fhf->client[i].fh = client[i].fh->fhandler_base::clone ();
+ return fhf;
}
};
diff --git a/winsup/cygwin/fhandler_fifo.cc b/winsup/cygwin/fhandler_fifo.cc
index 1dcb3b3df..c295c2393 100644
--- a/winsup/cygwin/fhandler_fifo.cc
+++ b/winsup/cygwin/fhandler_fifo.cc
@@ -816,6 +816,31 @@ fhandler_fifo::dup (fhandler_base *child, int flags)
__seterrno ();
return -1;
}
+ for (int i = 0; i < nclients; i++)
+ {
+ if (!DuplicateHandle (GetCurrentProcess (), client[i].fh->get_handle (),
+ GetCurrentProcess (),
+ &fhf->client[i].fh->get_handle (),
+ 0, true, DUPLICATE_SAME_ACCESS)
+ || !DuplicateHandle (GetCurrentProcess (), client[i].connect_evt,
+ GetCurrentProcess (),
+ &fhf->client[i].connect_evt,
+ 0, true, DUPLICATE_SAME_ACCESS)
+ || !DuplicateHandle (GetCurrentProcess (), client[i].dummy_evt,
+ GetCurrentProcess (),
+ &fhf->client[i].dummy_evt,
+ 0, true, DUPLICATE_SAME_ACCESS))
+ {
+ CloseHandle (fhf->read_ready);
+ CloseHandle (fhf->write_ready);
+ fhf->close ();
+ __seterrno ();
+ return -1;
+ }
+ }
+ fhf->listen_client_thr = NULL;
+ fhf->lct_termination_evt = NULL;
+ fhf->fifo_client_unlock ();
return 0;
}
--
2.17.0
More information about the Cygwin-patches
mailing list