[newlib-cygwin] Cygwin: POSIX message queues: simplify sync object creation
Corinna Vinschen
corinna@sourceware.org
Wed May 12 09:40:37 GMT 2021
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=7b8edba6259fd8439fada6a2aaf1ecdef7b509d8
commit 7b8edba6259fd8439fada6a2aaf1ecdef7b509d8
Author: Corinna Vinschen <corinna@vinschen.de>
Date: Wed May 12 11:04:44 2021 +0200
Cygwin: POSIX message queues: simplify sync object creation
Introduce new inline function mq_ipc_init to create all three
required sync objects.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diff:
---
winsup/cygwin/posix_ipc.cc | 53 +++++++++++++++++++++++-----------------------
1 file changed, 27 insertions(+), 26 deletions(-)
diff --git a/winsup/cygwin/posix_ipc.cc b/winsup/cygwin/posix_ipc.cc
index fdecbca75..6b8c57fa0 100644
--- a/winsup/cygwin/posix_ipc.cc
+++ b/winsup/cygwin/posix_ipc.cc
@@ -410,6 +410,31 @@ 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)
+ {
+ ipc_mutex_close (mqinfo->mqi_lock);
+ return ret;
+ }
+ ret = ipc_cond_init (&mqinfo->mqi_waitrecv, name, 'R');
+ if (ret)
+ {
+ ipc_cond_close (mqinfo->mqi_waitsend);
+ ipc_mutex_close (mqinfo->mqi_lock);
+ return ret;
+ }
+ return 0;
+}
+
extern "C" mqd_t
mq_open (const char *name, int oflag, ...)
{
@@ -517,19 +542,7 @@ mq_open (const char *name, int oflag, ...)
msghdr->msg_next = 0; /* end of free list */
/* Initialize mutex & condition variables */
- i = ipc_mutex_init (&mqinfo->mqi_lock, mqhdr->mqh_uname);
- if (i != 0)
- {
- set_errno (i);
- __leave;
- }
- i = ipc_cond_init (&mqinfo->mqi_waitsend, mqhdr->mqh_uname, 'S');
- if (i != 0)
- {
- set_errno (i);
- __leave;
- }
- i = ipc_cond_init (&mqinfo->mqi_waitrecv, mqhdr->mqh_uname, 'R');
+ i = _mq_ipc_init (mqinfo, mqhdr->mqh_uname);
if (i != 0)
{
set_errno (i);
@@ -598,19 +611,7 @@ mq_open (const char *name, int oflag, ...)
mqinfo->mqi_flags = nonblock;
/* Initialize mutex & condition variable */
- i = ipc_mutex_init (&mqinfo->mqi_lock, mqhdr->mqh_uname);
- if (i != 0)
- {
- set_errno (i);
- __leave;
- }
- i = ipc_cond_init (&mqinfo->mqi_waitsend, mqhdr->mqh_uname, 'S');
- if (i != 0)
- {
- set_errno (i);
- __leave;
- }
- i = ipc_cond_init (&mqinfo->mqi_waitrecv, mqhdr->mqh_uname, 'R');
+ i = _mq_ipc_init (mqinfo, mqhdr->mqh_uname);
if (i != 0)
{
set_errno (i);
More information about the Cygwin-cvs
mailing list