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
@ -1300,6 +1300,26 @@ struct fifo_client_handler
|
|||||||
int pipe_state ();
|
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. */
|
/* Info needed by all readers of a FIFO, stored in named shared memory. */
|
||||||
class fifo_shmem_t
|
class fifo_shmem_t
|
||||||
{
|
{
|
||||||
@ -1329,6 +1349,7 @@ class fhandler_fifo: public fhandler_base
|
|||||||
af_unix_spinlock_t _fifo_client_lock;
|
af_unix_spinlock_t _fifo_client_lock;
|
||||||
bool reader, writer, duplexer;
|
bool reader, writer, duplexer;
|
||||||
size_t max_atomic_write;
|
size_t max_atomic_write;
|
||||||
|
fifo_reader_id_t me;
|
||||||
|
|
||||||
HANDLE shmem_handle;
|
HANDLE shmem_handle;
|
||||||
fifo_shmem_t *shmem;
|
fifo_shmem_t *shmem;
|
||||||
@ -1362,6 +1383,8 @@ public:
|
|||||||
void fifo_client_lock () { _fifo_client_lock.lock (); }
|
void fifo_client_lock () { _fifo_client_lock.lock (); }
|
||||||
void fifo_client_unlock () { _fifo_client_lock.unlock (); }
|
void fifo_client_unlock () { _fifo_client_lock.unlock (); }
|
||||||
|
|
||||||
|
fifo_reader_id_t get_me () const { return me; }
|
||||||
|
|
||||||
int open (int, mode_t);
|
int open (int, mode_t);
|
||||||
off_t lseek (off_t offset, int whence);
|
off_t lseek (off_t offset, int whence);
|
||||||
int close ();
|
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_NOT_AVAILABLE \
|
||||||
|| _s == STATUS_PIPE_BUSY; })
|
|| _s == STATUS_PIPE_BUSY; })
|
||||||
|
|
||||||
|
static NO_COPY fifo_reader_id_t null_fr_id = { .winpid = 0, .fh = NULL };
|
||||||
|
|
||||||
fhandler_fifo::fhandler_fifo ():
|
fhandler_fifo::fhandler_fifo ():
|
||||||
fhandler_base (),
|
fhandler_base (),
|
||||||
read_ready (NULL), write_ready (NULL), writer_opening (NULL),
|
read_ready (NULL), write_ready (NULL), writer_opening (NULL),
|
||||||
cancel_evt (NULL), thr_sync_evt (NULL), _maybe_eof (false), nhandlers (0),
|
cancel_evt (NULL), thr_sync_evt (NULL), _maybe_eof (false), nhandlers (0),
|
||||||
reader (false), writer (false), duplexer (false),
|
reader (false), writer (false), duplexer (false),
|
||||||
max_atomic_write (DEFAULT_PIPEBUFSIZE),
|
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';
|
pipe_name_buf[0] = L'\0';
|
||||||
need_fork_fixup (true);
|
need_fork_fixup (true);
|
||||||
@ -575,6 +577,8 @@ fhandler_fifo::open (int flags, mode_t)
|
|||||||
goto err_dec_nreaders;
|
goto err_dec_nreaders;
|
||||||
if (!(thr_sync_evt = create_event ()))
|
if (!(thr_sync_evt = create_event ()))
|
||||||
goto err_close_cancel_evt;
|
goto err_close_cancel_evt;
|
||||||
|
me.winpid = GetCurrentProcessId ();
|
||||||
|
me.fh = this;
|
||||||
new cygthread (fifo_reader_thread, this, "fifo_reader", thr_sync_evt);
|
new cygthread (fifo_reader_thread, this, "fifo_reader", thr_sync_evt);
|
||||||
|
|
||||||
/* If we're a duplexer, we need a handle for writing. */
|
/* 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 ()))
|
if (!(fhf->thr_sync_evt = create_event ()))
|
||||||
goto err_close_cancel_evt;
|
goto err_close_cancel_evt;
|
||||||
inc_nreaders ();
|
inc_nreaders ();
|
||||||
|
fhf->me.fh = fhf;
|
||||||
new cygthread (fifo_reader_thread, fhf, "fifo_reader", fhf->thr_sync_evt);
|
new cygthread (fifo_reader_thread, fhf, "fifo_reader", fhf->thr_sync_evt);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -1164,6 +1169,7 @@ fhandler_fifo::fixup_after_fork (HANDLE parent)
|
|||||||
if (!(thr_sync_evt = create_event ()))
|
if (!(thr_sync_evt = create_event ()))
|
||||||
api_fatal ("Can't create reader thread sync event during fork, %E");
|
api_fatal ("Can't create reader thread sync event during fork, %E");
|
||||||
inc_nreaders ();
|
inc_nreaders ();
|
||||||
|
me.winpid = GetCurrentProcessId ();
|
||||||
new cygthread (fifo_reader_thread, this, "fifo_reader", thr_sync_evt);
|
new cygthread (fifo_reader_thread, this, "fifo_reader", thr_sync_evt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1179,6 +1185,7 @@ fhandler_fifo::fixup_after_exec ()
|
|||||||
|
|
||||||
if (reopen_shmem () < 0)
|
if (reopen_shmem () < 0)
|
||||||
api_fatal ("Can't reopen shared memory during exec, %E");
|
api_fatal ("Can't reopen shared memory during exec, %E");
|
||||||
|
me.winpid = GetCurrentProcessId ();
|
||||||
if (!(cancel_evt = create_event ()))
|
if (!(cancel_evt = create_event ()))
|
||||||
api_fatal ("Can't create reader thread cancel event during exec, %E");
|
api_fatal ("Can't create reader thread cancel event during exec, %E");
|
||||||
if (!(thr_sync_evt = create_event ()))
|
if (!(thr_sync_evt = create_event ()))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user