Cygwin: fhandler_fifo: reduce size

Replace the 'WCHAR pipe_name_buf[48]' class member by 'PWCHAR
pipe_name_buf', and allocate space for the latter as needed.

Change the default constructor to accommodate this change, and add a
destructor that frees the allocated space.

Also change get_pipe_name and clone to accommodate this change.
This commit is contained in:
Ken Brown 2020-11-08 12:02:39 -05:00
parent f3ed5f2fe0
commit f505e7a032
2 changed files with 14 additions and 9 deletions

View File

@ -1384,7 +1384,7 @@ class fhandler_fifo: public fhandler_base
HANDLE thr_sync_evt; /* The thread has terminated. */
UNICODE_STRING pipe_name;
WCHAR pipe_name_buf[CYGWIN_FIFO_PIPE_NAME_LEN + 1];
PWCHAR pipe_name_buf;
fifo_client_handler *fc_handler; /* Dynamically growing array. */
int shandlers; /* Size (capacity) of the array. */
int nhandlers; /* Number of elements in the array. */
@ -1467,6 +1467,11 @@ class fhandler_fifo: public fhandler_base
public:
fhandler_fifo ();
~fhandler_fifo ()
{
if (pipe_name_buf)
cfree (pipe_name_buf);
}
/* Called if we appear to be at EOF after polling fc_handlers. */
bool hit_eof () const
{ return !nwriters () && !IsEventSignalled (writer_opening); }
@ -1512,11 +1517,8 @@ public:
{
void *ptr = (void *) ccalloc (malloc_type, 1, sizeof (fhandler_fifo));
fhandler_fifo *fhf = new (ptr) fhandler_fifo (ptr);
/* We don't want our client list to change any more. */
copyto (fhf);
/* fhf->pipe_name_buf is a *copy* of this->pipe_name_buf, but
fhf->pipe_name.Buffer == this->pipe_name_buf. */
fhf->pipe_name.Buffer = fhf->pipe_name_buf;
fhf->pipe_name_buf = NULL;
return fhf;
}
};

View File

@ -131,25 +131,28 @@ fhandler_fifo::fhandler_fifo ():
fhandler_base (),
read_ready (NULL), write_ready (NULL), writer_opening (NULL),
owner_needed_evt (NULL), owner_found_evt (NULL), update_needed_evt (NULL),
cancel_evt (NULL), thr_sync_evt (NULL),
cancel_evt (NULL), thr_sync_evt (NULL), pipe_name_buf (NULL),
fc_handler (NULL), shandlers (0), nhandlers (0),
reader (false), writer (false), duplexer (false),
max_atomic_write (DEFAULT_PIPEBUFSIZE),
me (null_fr_id), shmem_handle (NULL), shmem (NULL),
shared_fc_hdl (NULL), shared_fc_handler (NULL)
{
pipe_name_buf[0] = L'\0';
need_fork_fixup (true);
}
PUNICODE_STRING
fhandler_fifo::get_pipe_name ()
{
if (!pipe_name_buf[0])
if (!pipe_name_buf)
{
pipe_name.Length = CYGWIN_FIFO_PIPE_NAME_LEN * sizeof (WCHAR);
pipe_name.MaximumLength = pipe_name.Length + sizeof (WCHAR);
pipe_name_buf = (PWCHAR) cmalloc_abort (HEAP_STR,
pipe_name.MaximumLength);
pipe_name.Buffer = pipe_name_buf;
__small_swprintf (pipe_name_buf, L"%S-fifo.%08x.%016X",
&cygheap->installation_key, get_dev (), get_ino ());
RtlInitUnicodeString (&pipe_name, pipe_name_buf);
}
return &pipe_name;
}