Cygwin: FIFO: find a new owner when closing
If the owning reader is closing, wait for another reader (if there is one) to take ownership before closing the owner's pipe handles. To synchronize the ownership transfer, add events owner_needed_evt and owner_found_evt, and add methods owner_needed and owner_found to set/reset them. Modify the fifo_reader_thread function to wake up all non-owners when a new owner is needed. Make a cosmetic change in close so that fhandler_base::close is called only if we have a write handle. This prevents strace output from being littered with statements that the null handle is being closed.
This commit is contained in:
@@ -1359,6 +1359,10 @@ class fhandler_fifo: public fhandler_base
|
||||
HANDLE write_ready; /* A writer is open; OK for a reader to open. */
|
||||
HANDLE writer_opening; /* A writer is opening; no EOF. */
|
||||
|
||||
/* Handles to named events needed by all readers of a given FIFO. */
|
||||
HANDLE owner_needed_evt; /* The owner is closing. */
|
||||
HANDLE owner_found_evt; /* A new owner has taken over. */
|
||||
|
||||
/* Handles to non-shared events needed for fifo_reader_threads. */
|
||||
HANDLE cancel_evt; /* Signal thread to terminate. */
|
||||
HANDLE thr_sync_evt; /* The thread has terminated. */
|
||||
@@ -1405,6 +1409,16 @@ class fhandler_fifo: public fhandler_base
|
||||
fifo_reader_id_t get_prev_owner () const { return shmem->get_prev_owner (); }
|
||||
void set_prev_owner (fifo_reader_id_t fr_id)
|
||||
{ shmem->set_prev_owner (fr_id); }
|
||||
void owner_needed ()
|
||||
{
|
||||
ResetEvent (owner_found_evt);
|
||||
SetEvent (owner_needed_evt);
|
||||
}
|
||||
void owner_found ()
|
||||
{
|
||||
ResetEvent (owner_needed_evt);
|
||||
SetEvent (owner_found_evt);
|
||||
}
|
||||
|
||||
int get_shared_nhandlers () { return shmem->get_shared_nhandlers (); }
|
||||
void set_shared_nhandlers (int n) { shmem->set_shared_nhandlers (n); }
|
||||
|
Reference in New Issue
Block a user