From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2155) id CF10B3848026; Fri, 21 May 2021 13:34:12 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org CF10B3848026 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Corinna Vinschen To: cygwin-cvs@sourceware.org Subject: [newlib-cygwin] Cygwin: POSIX msg queues: move IPC object creation into fhandler X-Act-Checkin: newlib-cygwin X-Git-Author: Corinna Vinschen X-Git-Refname: refs/heads/master X-Git-Oldrev: 438764a9de7eda912f3c2c25a586a9374b26a6b0 X-Git-Newrev: 3342549fcfcf8e148f303d5349e5102eae222ea3 Message-Id: <20210521133412.CF10B3848026@sourceware.org> Date: Fri, 21 May 2021 13:34:12 +0000 (GMT) X-BeenThere: cygwin-cvs@cygwin.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Cygwin core component git logs List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 21 May 2021 13:34:12 -0000 https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=3342549fcfcf8e148f303d5349e5102eae222ea3 commit 3342549fcfcf8e148f303d5349e5102eae222ea3 Author: Corinna Vinschen Date: Fri May 21 13:38:57 2021 +0200 Cygwin: POSIX msg queues: move IPC object creation into fhandler Signed-off-by: Corinna Vinschen Diff: --- winsup/cygwin/fhandler_mqueue.cc | 43 ++++++++++++++++- winsup/cygwin/posix_ipc.cc | 99 ++-------------------------------------- 2 files changed, 46 insertions(+), 96 deletions(-) diff --git a/winsup/cygwin/fhandler_mqueue.cc b/winsup/cygwin/fhandler_mqueue.cc index b3b6d4258..dc10a3671 100644 --- a/winsup/cygwin/fhandler_mqueue.cc +++ b/winsup/cygwin/fhandler_mqueue.cc @@ -7,6 +7,7 @@ Cygwin license. Please consult the file "CYGWIN_LICENSE" for details. */ #include "winsup.h" +#include "shared_info.h" #include "path.h" #include "fhandler.h" #include "dtable.h" @@ -22,14 +23,54 @@ struct mq_info * fhandler_mqueue::mqinfo (const char *name, int8_t *mptr, HANDLE sect, size_t size, mode_t mode, int flags) { + WCHAR buf[MAX_PATH]; + UNICODE_STRING uname; + OBJECT_ATTRIBUTES attr; + NTSTATUS status; + set_name (name); mqinfo ()->mqi_hdr = (struct mq_hdr *) mptr; mqinfo ()->mqi_sect = sect; mqinfo ()->mqi_sectsize = size; mqinfo ()->mqi_mode = mode; - mqinfo ()->mqi_magic = MQI_MAGIC; mqinfo ()->mqi_flags = flags; + + __small_swprintf (buf, L"mqueue/mtx%s", name); + RtlInitUnicodeString (&uname, buf); + InitializeObjectAttributes (&attr, &uname, OBJ_OPENIF | OBJ_CASE_INSENSITIVE, + get_shared_parent_dir (), + everyone_sd (CYG_MUTANT_ACCESS)); + status = NtCreateMutant (&mqinfo ()->mqi_lock, CYG_MUTANT_ACCESS, &attr, + FALSE); + if (!NT_SUCCESS (status)) + goto err; + + wcsncpy (buf + 7, L"snd", 3); + /* same length, no RtlInitUnicodeString required */ + InitializeObjectAttributes (&attr, &uname, OBJ_OPENIF | OBJ_CASE_INSENSITIVE, + get_shared_parent_dir (), + everyone_sd (CYG_EVENT_ACCESS)); + status = NtCreateEvent (&mqinfo ()->mqi_waitsend, CYG_EVENT_ACCESS, &attr, + NotificationEvent, FALSE); + if (!NT_SUCCESS (status)) + goto err; + wcsncpy (buf + 7, L"rcv", 3); + /* same length, same attributes, no more init required */ + status = NtCreateEvent (&mqinfo ()->mqi_waitrecv, CYG_EVENT_ACCESS, &attr, + NotificationEvent, FALSE); + if (!NT_SUCCESS (status)) + goto err; + + mqinfo ()->mqi_magic = MQI_MAGIC; return mqinfo (); + +err: + if (mqinfo ()->mqi_waitsend) + NtClose (mqinfo ()->mqi_waitsend); + if (mqinfo ()->mqi_lock) + NtClose (mqinfo ()->mqi_lock); + __seterrno_from_nt_status (status); + return NULL; } char * diff --git a/winsup/cygwin/posix_ipc.cc b/winsup/cygwin/posix_ipc.cc index 401c78dd7..056fa966a 100644 --- a/winsup/cygwin/posix_ipc.cc +++ b/winsup/cygwin/posix_ipc.cc @@ -94,28 +94,6 @@ check_path (char *res_name, ipc_type_t type, const char *name, size_t len) return true; } -static int -ipc_mutex_init (HANDLE *pmtx, const char *name) -{ - WCHAR buf[MAX_PATH]; - UNICODE_STRING uname; - OBJECT_ATTRIBUTES attr; - NTSTATUS status; - - __small_swprintf (buf, L"mqueue/mtx%s", name); - RtlInitUnicodeString (&uname, buf); - InitializeObjectAttributes (&attr, &uname, OBJ_OPENIF | OBJ_CASE_INSENSITIVE, - get_shared_parent_dir (), - everyone_sd (CYG_MUTANT_ACCESS)); - status = NtCreateMutant (pmtx, CYG_MUTANT_ACCESS, &attr, FALSE); - if (!NT_SUCCESS (status)) - { - debug_printf ("NtCreateMutant: %y", status); - return geterrno_from_win_error (RtlNtStatusToDosError (status)); - } - return 0; -} - static int ipc_mutex_lock (HANDLE mtx, bool eintr) { @@ -140,29 +118,6 @@ ipc_mutex_unlock (HANDLE mtx) return ReleaseMutex (mtx) ? 0 : geterrno_from_win_error (); } -static int -ipc_cond_init (HANDLE *pevt, const char *name, char sr) -{ - WCHAR buf[MAX_PATH]; - UNICODE_STRING uname; - OBJECT_ATTRIBUTES attr; - NTSTATUS status; - - __small_swprintf (buf, L"mqueue/evt%s%c", name, sr); - RtlInitUnicodeString (&uname, buf); - InitializeObjectAttributes (&attr, &uname, OBJ_OPENIF | OBJ_CASE_INSENSITIVE, - get_shared_parent_dir (), - everyone_sd (CYG_EVENT_ACCESS)); - status = NtCreateEvent (pevt, CYG_EVENT_ACCESS, &attr, - NotificationEvent, FALSE); - if (!NT_SUCCESS (status)) - { - debug_printf ("NtCreateEvent: %y", status); - return geterrno_from_win_error (RtlNtStatusToDosError (status)); - } - return 0; -} - static int ipc_cond_timedwait (HANDLE evt, HANDLE mtx, const struct timespec *abstime) { @@ -352,31 +307,6 @@ struct mq_attr defattr = { 0, 10, 8192, 0 }; /* Linux defaults. */ extern "C" off_t lseek64 (int, off_t, int); extern "C" void *mmap64 (void *, size_t, int, int, int, off_t); -static inline int -_mq_ipc_init (struct mq_info *mqinfo, const char *name) -{ - int ret; - - /* Initialize mutex & condition variable */ - ret = ipc_mutex_init (&mqinfo->mqi_lock, name); - if (ret) - return ret; - ret = ipc_cond_init (&mqinfo->mqi_waitsend, name, 'S'); - if (ret) - { - NtClose (mqinfo->mqi_lock); - return ret; - } - ret = ipc_cond_init (&mqinfo->mqi_waitrecv, name, 'R'); - if (ret) - { - NtClose (mqinfo->mqi_waitsend); - NtClose (mqinfo->mqi_lock); - return ret; - } - return 0; -} - static int8_t * _map_file (int fd, SIZE_T filesize, HANDLE §h) { @@ -489,14 +419,8 @@ mq_open (const char *name, int oflag, ...) fdm = fh; mqinfo = fh->mqinfo (name, mptr, secth, filesize, mode, nonblock); - - /* Initialize mutex & condition variables */ - i = _mq_ipc_init (mqinfo, fh->get_name ()); - if (i != 0) - { - set_errno (i); - __leave; - } + if (!mqinfo) + __leave; /* Initialize header at beginning of file */ /* Create free list with all messages on it */ @@ -589,14 +513,8 @@ mq_open (const char *name, int oflag, ...) mqinfo = fh->mqinfo (name, mptr, secth, filesize, statbuff.st_mode, nonblock); - - /* Initialize mutex & condition variable */ - i = _mq_ipc_init (mqinfo, fh->get_name ()); - if (i != 0) - { - set_errno (i); - __leave; - } + if (!mqinfo) + __leave; return (mqd_t) fdm; } @@ -611,15 +529,6 @@ mq_open (const char *name, int oflag, ...) NtUnmapViewOfSection (NtCurrentProcess (), mptr); NtClose (secth); } - if (mqinfo) - { - if (mqinfo->mqi_lock) - NtClose (mqinfo->mqi_lock); - if (mqinfo->mqi_waitsend) - NtClose (mqinfo->mqi_waitsend); - if (mqinfo->mqi_waitrecv) - NtClose (mqinfo->mqi_waitrecv); - } if (fd >= 0) close (fd); return (mqd_t) -1;