public inbox for cygwin-cvs@sourceware.org
help / color / mirror / Atom feed
* [newlib-cygwin] Cygwin: POSIX msg queues: move IPC object creation into fhandler
@ 2021-05-21 13:34 Corinna Vinschen
  0 siblings, 0 replies; only message in thread
From: Corinna Vinschen @ 2021-05-21 13:34 UTC (permalink / raw)
  To: cygwin-cvs

https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=3342549fcfcf8e148f303d5349e5102eae222ea3

commit 3342549fcfcf8e148f303d5349e5102eae222ea3
Author: Corinna Vinschen <corinna@vinschen.de>
Date:   Fri May 21 13:38:57 2021 +0200

    Cygwin: POSIX msg queues: move IPC object creation into fhandler
    
    Signed-off-by: Corinna Vinschen <corinna@vinschen.de>

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 &secth)
 {
@@ -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;


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-05-21 13:34 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-21 13:34 [newlib-cygwin] Cygwin: POSIX msg queues: move IPC object creation into fhandler Corinna Vinschen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).