diff options
author | Gregory Nutt <gnutt@nuttx.org> | 2015-04-09 15:53:59 -0600 |
---|---|---|
committer | Gregory Nutt <gnutt@nuttx.org> | 2015-04-09 15:53:59 -0600 |
commit | 51c603c61b0bafd6d751ab17e6c5d9eefe9d2367 (patch) | |
tree | a2b2e8644b5af15ed11e7b77b45e8e019466eec7 | |
parent | b089e89a7a829d50a354bafe554fb5583f7263b3 (diff) | |
download | px4-nuttx-51c603c61b0bafd6d751ab17e6c5d9eefe9d2367.tar.gz px4-nuttx-51c603c61b0bafd6d751ab17e6c5d9eefe9d2367.tar.bz2 px4-nuttx-51c603c61b0bafd6d751ab17e6c5d9eefe9d2367.zip |
apps/examples/ostest: Add a test for the sigprocmask, sighold, and sigrelse
-rw-r--r-- | apps/examples/ostest/Makefile | 2 | ||||
-rw-r--r-- | apps/examples/ostest/ostest.h | 4 | ||||
-rw-r--r-- | apps/examples/ostest/ostest_main.c | 6 | ||||
-rw-r--r-- | apps/examples/ostest/sighand.c | 16 | ||||
-rw-r--r-- | apps/examples/ostest/sigprocmask.c | 221 | ||||
-rw-r--r-- | nuttx/arch/sim/src/nuttx-names.dat | 3 | ||||
-rw-r--r-- | nuttx/libc/signal/sig_relse.c | 2 |
7 files changed, 252 insertions, 2 deletions
diff --git a/apps/examples/ostest/Makefile b/apps/examples/ostest/Makefile index 5be9c5a16..db18d467a 100644 --- a/apps/examples/ostest/Makefile +++ b/apps/examples/ostest/Makefile @@ -75,7 +75,7 @@ endif # CONFIG_MUTEX_TYPES endif # CONFIG_DISABLE_PTHREAD ifneq ($(CONFIG_DISABLE_SIGNALS),y) -CSRCS += sighand.c +CSRCS += sigprocmask.c sighand.c ifneq ($(CONFIG_DISABLE_PTHREAD),y) CSRCS += timedwait.c endif # CONFIG_DISABLE_PTHREAD diff --git a/apps/examples/ostest/ostest.h b/apps/examples/ostest/ostest.h index 55da611d1..97e1beea9 100644 --- a/apps/examples/ostest/ostest.h +++ b/apps/examples/ostest/ostest.h @@ -167,6 +167,10 @@ void cancel_test(void); void timedwait_test(void); +/* sigprocmask.c ****************************************************************/ + +void sigprocmask_test(void); + /* sighand.c ****************************************************************/ void sighand_test(void); diff --git a/apps/examples/ostest/ostest_main.c b/apps/examples/ostest/ostest_main.c index d36287b78..8c21af154 100644 --- a/apps/examples/ostest/ostest_main.c +++ b/apps/examples/ostest/ostest_main.c @@ -436,6 +436,12 @@ static int user_main(int argc, char *argv[]) #endif #ifndef CONFIG_DISABLE_SIGNALS + /* Verify that we can modify the signal mask */ + + printf("\nuser_main: sigprocmask test\n"); + sigprocmask_test(); + check_test_memory_usage(); + /* Verify signal handlers */ printf("\nuser_main: signal handler test\n"); diff --git a/apps/examples/ostest/sighand.c b/apps/examples/ostest/sighand.c index 4f42dcff1..7cd96ee20 100644 --- a/apps/examples/ostest/sighand.c +++ b/apps/examples/ostest/sighand.c @@ -43,6 +43,10 @@ #include <errno.h> #include "ostest.h" +/*********************************************************************** + * Pre-processor Definitions + ***********************************************************************/ + #ifndef NULL # define NULL (void*)0 #endif @@ -50,10 +54,18 @@ #define WAKEUP_SIGNAL 17 #define SIGVALUE_INT 42 +/*********************************************************************** + * Private Data + ***********************************************************************/ + static sem_t sem; static bool sigreceived = false; static bool threadexited = false; +/*********************************************************************** + * Private Functions + ***********************************************************************/ + #ifdef CONFIG_SCHED_HAVE_PARENT static void death_of_child(int signo, siginfo_t *info, void *ucontext) { @@ -213,6 +225,10 @@ static int waiter_main(int argc, char *argv[]) return 0; } +/*********************************************************************** + * Public Functions + ***********************************************************************/ + void sighand_test(void) { #ifdef CONFIG_SCHED_HAVE_PARENT diff --git a/apps/examples/ostest/sigprocmask.c b/apps/examples/ostest/sigprocmask.c new file mode 100644 index 000000000..8e8791501 --- /dev/null +++ b/apps/examples/ostest/sigprocmask.c @@ -0,0 +1,221 @@ +/*********************************************************************** + * apps/examples/ostest/sigprocmask.c + * + * Copyright (C) 2015 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt <gnutt@nuttx.org> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ***********************************************************************/ + +#include <sys/types.h> +#include <stdbool.h> +#include <stdio.h> +#include <signal.h> +#include <string.h> +#include <errno.h> + +#include "ostest.h" + +/*********************************************************************** + * Pre-processor Definitions + ***********************************************************************/ + +#define NSIGNALS 5 + +/*********************************************************************** + * Private Data + ***********************************************************************/ + +static int g_some_signals[NSIGNALS] = {1, 3, 5, 7, 9}; + +/*********************************************************************** + * Public Functions + ***********************************************************************/ + +void sigprocmask_test(void) +{ + sigset_t saved; + sigset_t currmask; + sigset_t newmask; + int ret; + int i; + + /* Save the current sigprocmask */ + + ret = sigprocmask(SIG_SETMASK, NULL, &saved); + if (ret != OK) + { + int errcode = errno; + printf("sigprocmask_test: ERROR sigprocmask failed: %d\n", errcode); + goto errout; + } + + /* Set the mask to all zeroes */ + + ret = sigemptyset(&newmask); + if (ret != OK) + { + int errcode = errno; + printf("sigprocmask_test: ERROR sigemptyset failed: %d\n", errcode); + goto errout; + } + + ret = sigprocmask(SIG_SETMASK, &newmask, NULL); + if (ret != OK) + { + int errcode = errno; + printf("sigprocmask_test: ERROR sigprocmask failed: %d\n", errcode); + goto errout_with_mask; + } + + /* Set a few signals */ + + for (i = 0; i < NSIGNALS; i++) + { + int signo = g_some_signals[i]; + + ret = sigaddset(&newmask, signo); + if (ret != OK) + { + int errcode = errno; + printf("sigprocmask_test: ERROR sigaddset failed: %d\n", errcode); + goto errout_with_mask; + } + + ret = sighold(signo); + if (ret != OK) + { + int errcode = errno; + printf("sigprocmask_test: ERROR sighold failed: %d\n", errcode); + goto errout_with_mask; + } + } + + /* Now get the modified mask */ + + ret = sigprocmask(SIG_SETMASK, NULL, &currmask); + if (ret != OK) + { + int errcode = errno; + printf("sigprocmask_test: ERROR sigprocmask failed: %d\n", errcode); + goto errout_with_mask; + } + + /* It should be the same as newmask */ + + if (memcmp(&currmask, &newmask, sizeof(sigset_t)) != 0) + { + printf("sigprocmask_test: ERROR unexpected sigprocmask\n"); + goto errout_with_mask; + } + + /* Set the mask to all ones */ + + ret = sigfillset(&newmask); + if (ret != OK) + { + int errcode = errno; + printf("sigprocmask_test: ERROR sigfillset failed: %d\n", errcode); + goto errout; + } + + ret = sigprocmask(SIG_SETMASK, &newmask, NULL); + if (ret != OK) + { + int errcode = errno; + printf("sigprocmask_test: ERROR sigprocmask failed: %d\n", errcode); + goto errout_with_mask; + } + + /* Release a few signals */ + + for (i = 0; i < NSIGNALS; i++) + { + int signo = g_some_signals[i]; + + ret = sigdelset(&newmask, signo); + if (ret != OK) + { + int errcode = errno; + printf("sigprocmask_test: ERROR sigdelset failed: %d\n", errcode); + goto errout_with_mask; + } + + ret = sigrelse(signo); + if (ret != OK) + { + int errcode = errno; + printf("sigprocmask_test: ERROR sigrelse failed: %d\n", errcode); + goto errout_with_mask; + } + } + + /* Now get the modified mask */ + + ret = sigprocmask(SIG_SETMASK, NULL, &currmask); + if (ret != OK) + { + int errcode = errno; + printf("sigprocmask_test: ERROR sigprocmask failed: %d\n", errcode); + goto errout_with_mask; + } + + /* It should be the same as newmask */ + + if (memcmp(&currmask, &newmask, sizeof(sigset_t)) != 0) + { + printf("sigprocmask_test: ERROR unexpected sigprocmask\n"); + goto errout_with_mask; + } + + ret = sigprocmask(SIG_SETMASK, &saved, NULL); + if (ret != OK) + { + int errcode = errno; + printf("sigprocmask_test: ERROR sigprocmask failed: %d\n", errcode); + goto errout; + } + + printf("sigprocmask_test: SUCCESS\n" ); + FFLUSH(); + return; + +errout_with_mask: + ret = sigprocmask(SIG_SETMASK, &saved, NULL); + if (ret != OK) + { + int errcode = errno; + printf("sigprocmask_test: ERROR sigprocmask failed: %d\n", errcode); + goto errout; + } + +errout: + printf("sigprocmask_test: Aborting\n" ); + FFLUSH(); +} diff --git a/nuttx/arch/sim/src/nuttx-names.dat b/nuttx/arch/sim/src/nuttx-names.dat index 7cfe1bd38..634f4ea8c 100644 --- a/nuttx/arch/sim/src/nuttx-names.dat +++ b/nuttx/arch/sim/src/nuttx-names.dat @@ -33,6 +33,9 @@ rmdir NXrmdir seekdir NXseekdir select NXselect send NXsend +sighold NXsighold +sigprocmask NXsigprocmask +sigrelse NXsigrelse sendto NXsendto sleep NXsleep socket NXsocket diff --git a/nuttx/libc/signal/sig_relse.c b/nuttx/libc/signal/sig_relse.c index c17731bfe..62e86a895 100644 --- a/nuttx/libc/signal/sig_relse.c +++ b/nuttx/libc/signal/sig_relse.c @@ -52,7 +52,7 @@ * ****************************************************************************/ -int sighold(int signo) +int sigrelse(int signo) { sigset_t set; int ret; |