]> sourceware.org Git - newlib-cygwin.git/commit
Cygwin: FIFO: keep a writer count in shared memory
authorKen Brown <kbrown@cornell.edu>
Sat, 11 Jul 2020 18:05:23 +0000 (14:05 -0400)
committerKen Brown <kbrown@cornell.edu>
Thu, 16 Jul 2020 19:59:53 +0000 (15:59 -0400)
commit8ca713d70a4038922babc998bbf813768354d84e
tree737d56f8c92064b0f1cecadafd5764181c7e0a30
parentda9fea07592987474203a531b88d83312f569141
Cygwin: FIFO: keep a writer count in shared memory

When a reader opens, it needs to block if there are no writers open
(unless is is opened with O_NONBLOCK).  This is easy for the first
reader to test, since it can just wait for a writer to signal that it
is open (via the write_ready event).  But when a second reader wants
to open, all writers might have closed.

To check this, use a new '_nwriters' member of struct fifo_shmem_t,
which keeps track of the number of open writers.  This should be more
reliable than the previous method.

Add nwriters_lock to control access to shmem->_nwriters, and remove
reader_opening_lock, which is no longer needed.

Previously only readers had access to the shared memory, but now
writers access it too so that they can increment _nwriters during
open/dup/fork/exec and decrement it during close.

Add an optional 'only_open' argument to create_shmem for use by
writers, which only open the shared memory rather than first trying to
create it.  Since writers don't need to access the shared memory until
they have successfully connected to a pipe instance, they can safely
assume that a reader has already created the shared memory.

For debugging purposes, change create_shmem to return 1 instead of 0
when a reader successfully opens the shared memory after finding that
it had already been created.

Remove check_write_ready_evt, write_ready_ok_evt, and
check_write_ready(), which are no longer needed.

When opening a writer and looping to try to get a connection, recheck
read_ready at the top of the loop since the number of readers might
have changed.

To slightly speed up the process of opening the first reader, take
ownership immediately rather than waiting for the fifo_reader_thread
to handle it.
winsup/cygwin/fhandler.h
winsup/cygwin/fhandler_fifo.cc
This page took 0.030374 seconds and 5 git commands to generate.