Cygwin: FIFO: introduce a new type, fifo_reader_id_t
This uniquely identifies an fhandler_fifo open for reading in any process. Add a new data member 'me' of this type, which is set in open, dup, fork, and exec.
This commit is contained in:
parent
365818a4a5
commit
16e7c10578
winsup/cygwin
@ -1300,6 +1300,26 @@ struct fifo_client_handler
|
||||
int pipe_state ();
|
||||
};
|
||||
|
||||
class fhandler_fifo;
|
||||
|
||||
struct fifo_reader_id_t
|
||||
{
|
||||
DWORD winpid;
|
||||
fhandler_fifo *fh;
|
||||
|
||||
operator bool () const { return winpid != 0 || fh != NULL; }
|
||||
|
||||
friend operator == (const fifo_reader_id_t &l, const fifo_reader_id_t &r)
|
||||
{
|
||||
return l.winpid == r.winpid && l.fh == r.fh;
|
||||
}
|
||||
|
||||
friend operator != (const fifo_reader_id_t &l, const fifo_reader_id_t &r)
|
||||
{
|
||||
return l.winpid != r.winpid || l.fh != r.fh;
|
||||
}
|
||||
};
|
||||
|
||||
/* Info needed by all readers of a FIFO, stored in named shared memory. */
|
||||
class fifo_shmem_t
|
||||
{
|
||||
@ -1329,6 +1349,7 @@ class fhandler_fifo: public fhandler_base
|
||||
af_unix_spinlock_t _fifo_client_lock;
|
||||
bool reader, writer, duplexer;
|
||||
size_t max_atomic_write;
|
||||
fifo_reader_id_t me;
|
||||
|
||||
HANDLE shmem_handle;
|
||||
fifo_shmem_t *shmem;
|
||||
@ -1362,6 +1383,8 @@ public:
|
||||
void fifo_client_lock () { _fifo_client_lock.lock (); }
|
||||
void fifo_client_unlock () { _fifo_client_lock.unlock (); }
|
||||
|
||||
fifo_reader_id_t get_me () const { return me; }
|
||||
|
||||
int open (int, mode_t);
|
||||
off_t lseek (off_t offset, int whence);
|
||||
int close ();
|
||||
|
@ -65,13 +65,15 @@ STATUS_PIPE_EMPTY simply means there's no data to be read. */
|
||||
|| _s == STATUS_PIPE_NOT_AVAILABLE \
|
||||
|| _s == STATUS_PIPE_BUSY; })
|
||||
|
||||
static NO_COPY fifo_reader_id_t null_fr_id = { .winpid = 0, .fh = NULL };
|
||||
|
||||
fhandler_fifo::fhandler_fifo ():
|
||||
fhandler_base (),
|
||||
read_ready (NULL), write_ready (NULL), writer_opening (NULL),
|
||||
cancel_evt (NULL), thr_sync_evt (NULL), _maybe_eof (false), nhandlers (0),
|
||||
reader (false), writer (false), duplexer (false),
|
||||
max_atomic_write (DEFAULT_PIPEBUFSIZE),
|
||||
shmem_handle (NULL), shmem (NULL)
|
||||
me (null_fr_id), shmem_handle (NULL), shmem (NULL)
|
||||
{
|
||||
pipe_name_buf[0] = L'\0';
|
||||
need_fork_fixup (true);
|
||||
@ -575,6 +577,8 @@ fhandler_fifo::open (int flags, mode_t)
|
||||
goto err_dec_nreaders;
|
||||
if (!(thr_sync_evt = create_event ()))
|
||||
goto err_close_cancel_evt;
|
||||
me.winpid = GetCurrentProcessId ();
|
||||
me.fh = this;
|
||||
new cygthread (fifo_reader_thread, this, "fifo_reader", thr_sync_evt);
|
||||
|
||||
/* If we're a duplexer, we need a handle for writing. */
|
||||
@ -1119,6 +1123,7 @@ fhandler_fifo::dup (fhandler_base *child, int flags)
|
||||
if (!(fhf->thr_sync_evt = create_event ()))
|
||||
goto err_close_cancel_evt;
|
||||
inc_nreaders ();
|
||||
fhf->me.fh = fhf;
|
||||
new cygthread (fifo_reader_thread, fhf, "fifo_reader", fhf->thr_sync_evt);
|
||||
}
|
||||
return 0;
|
||||
@ -1164,6 +1169,7 @@ fhandler_fifo::fixup_after_fork (HANDLE parent)
|
||||
if (!(thr_sync_evt = create_event ()))
|
||||
api_fatal ("Can't create reader thread sync event during fork, %E");
|
||||
inc_nreaders ();
|
||||
me.winpid = GetCurrentProcessId ();
|
||||
new cygthread (fifo_reader_thread, this, "fifo_reader", thr_sync_evt);
|
||||
}
|
||||
}
|
||||
@ -1179,6 +1185,7 @@ fhandler_fifo::fixup_after_exec ()
|
||||
|
||||
if (reopen_shmem () < 0)
|
||||
api_fatal ("Can't reopen shared memory during exec, %E");
|
||||
me.winpid = GetCurrentProcessId ();
|
||||
if (!(cancel_evt = create_event ()))
|
||||
api_fatal ("Can't create reader thread cancel event during exec, %E");
|
||||
if (!(thr_sync_evt = create_event ()))
|
||||
|
Loading…
x
Reference in New Issue
Block a user