This is the mail archive of the cygwin-cvs@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[newlib-cygwin] cygwin/signal.h: Remove SI_QUEUE unimplemented comment


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

commit 54ed68a781fe8a36d08352503524e61534a25e07
Author: Corinna Vinschen <corinna@vinschen.de>
Date:   Thu Aug 3 14:54:02 2017 +0200

    cygwin/signal.h: Remove SI_QUEUE unimplemented comment
    
    Signed-off-by: Corinna Vinschen <corinna@vinschen.de>

Diff:
---
 winsup/cygwin/include/cygwin/signal.h |  3 +--
 winsup/cygwin/signal.cc               | 25 ++++++++++++++++---------
 2 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/winsup/cygwin/include/cygwin/signal.h b/winsup/cygwin/include/cygwin/signal.h
index af08336..a8c852d 100644
--- a/winsup/cygwin/include/cygwin/signal.h
+++ b/winsup/cygwin/include/cygwin/signal.h
@@ -265,8 +265,7 @@ enum
   SI_MESGQ,				/* sent by real time mesq state change
 					   (currently unimplemented) */
   SI_TIMER,				/* sent by timer expiration */
-  SI_QUEUE,				/* sent by sigqueue (currently
-					   unimplemented) */
+  SI_QUEUE,				/* sent by sigqueue */
   SI_KERNEL,				/* sent by system */
 
   ILL_ILLOPC,				/* illegal opcode */
diff --git a/winsup/cygwin/signal.cc b/winsup/cygwin/signal.cc
index fbd2b24..4b63e99 100644
--- a/winsup/cygwin/signal.cc
+++ b/winsup/cygwin/signal.cc
@@ -623,14 +623,9 @@ sigwaitinfo (const sigset_t *set, siginfo_t *info)
   return res;
 }
 
-/* FIXME: SUSv3 says that this function should block until the signal has
-   actually been delivered.  Currently, this will only happen when sending
-   signals to the current process.  It will not happen when sending signals
-   to other processes.  */
-extern "C" int
-sigqueue (pid_t pid, int sig, const union sigval value)
+int
+__SYS_rt_sigqueueinfo (pid_t pid, int sig, siginfo_t *si)
 {
-  siginfo_t si = {0};
   pinfo dest (pid);
   if (!dest)
     {
@@ -639,15 +634,27 @@ sigqueue (pid_t pid, int sig, const union sigval value)
     }
   if (sig == 0)
     return 0;
-  if (sig < 0 || sig >= NSIG)
+  if (sig < 0 || sig >= NSIG
+      || !si || si->si_code < SI_ASYNCIO || si->si_code > SI_KERNEL)
     {
       set_errno (EINVAL);
       return -1;
     }
+  return sig_send (dest, *si);
+}
+
+/* FIXME: SUSv3 says that this function should block until the signal has
+   actually been delivered.  Currently, this will only happen when sending
+   signals to the current process.  It will not happen when sending signals
+   to other processes.  */
+extern "C" int
+sigqueue (pid_t pid, int sig, const union sigval value)
+{
+  siginfo_t si = {0};
   si.si_signo = sig;
   si.si_code = SI_QUEUE;
   si.si_value = value;
-  return sig_send (dest, si);
+  return __SYS_rt_sigqueueinfo (pid, sig, &si);
 }
 
 extern "C" int


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]