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 §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;
^ 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).