diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2007-03-28 14:48:42 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2007-03-28 14:48:42 +0000 |
commit | 151a39425178ee628c924b8231ca65e24ee386d7 (patch) | |
tree | c509b82d096f72a52b58c51d7cca13d20ef818bb /nuttx/examples | |
parent | 02ca18a9e0cd6c8a31f501dcd05cef13caa5a911 (diff) | |
download | px4-nuttx-151a39425178ee628c924b8231ca65e24ee386d7.tar.gz px4-nuttx-151a39425178ee628c924b8231ca65e24ee386d7.tar.bz2 px4-nuttx-151a39425178ee628c924b8231ca65e24ee386d7.zip |
mq_receive/send: Return appropriate errnos and stop waiting if signal received.
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@164 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/examples')
-rw-r--r-- | nuttx/examples/ostest/mqueue.c | 60 |
1 files changed, 50 insertions, 10 deletions
diff --git a/nuttx/examples/ostest/mqueue.c b/nuttx/examples/ostest/mqueue.c index 00b17e124..99cf1e585 100644 --- a/nuttx/examples/ostest/mqueue.c +++ b/nuttx/examples/ostest/mqueue.c @@ -37,13 +37,17 @@ * Included Files **************************************************************************/ +#include <nuttx/config.h> + #include <stdio.h> +#include <unistd.h> #include <string.h> #include <ctype.h> #include <fcntl.h> #include <pthread.h> #include <mqueue.h> #include <sched.h> +#include <errno.h> #include "ostest.h" @@ -51,11 +55,18 @@ * Private Definitions **************************************************************************/ -#define TEST_MESSAGE "This is a test and only a test" +#define TEST_MESSAGE "This is a test and only a test" #ifdef SDCC -#define TEST_MSGLEN (31) +#define TEST_MSGLEN (31) #else -#define TEST_MSGLEN (strlen(TEST_MESSAGE)+1) +#define TEST_MSGLEN (strlen(TEST_MESSAGE)+1) +#endif + +#define TEST_SEND_NMSGS (10) +#ifndef CONFIG_DISABLE_SIGNALS +# define TEST_RECEIVE_NMSGS (11) +#else +# define TEST_RECEIVE_NMSGS (10) #endif /************************************************************************** @@ -121,9 +132,9 @@ static void *sender_thread(void *arg) memcpy(msg_buffer, TEST_MESSAGE, TEST_MSGLEN); - /* Perform the send 10 times */ + /* Perform the send TEST_SEND_NMSGS times */ - for (i = 0; i < 10; i++) + for (i = 0; i < TEST_SEND_NMSGS; i++) { status = mq_send(mqfd, msg_buffer, TEST_MSGLEN, 42); if (status < 0) @@ -183,16 +194,27 @@ static void *receiver_thread(void *arg) pthread_exit((pthread_addr_t)1); } - /* Perform the receive 10 times */ + /* Perform the receive TEST_RECEIVE_NMSGS times */ - for (i = 0; i < 10; i++) + for (i = 0; i < TEST_RECEIVE_NMSGS; i++) { memset(msg_buffer, 0xaa, TEST_MSGLEN); nbytes = mq_receive(mqfd, msg_buffer, TEST_MSGLEN, 0); if (nbytes < 0) { - printf("receiver_thread: ERROR mq_receive failure on msg %d\n", i); - nerrors++; + /* mq_receive failed. If the error is because of EINTR then + * it is not a failure. + */ + + if (*get_errno_ptr() != EINTR) + { + printf("receiver_thread: ERROR mq_receive failure on msg %d, errno=%d\n", i, *get_errno_ptr()); + nerrors++; + } + else + { + printf("receiver_thread: mq_receive interrupted!\n", i); + } } else if (nbytes != TEST_MSGLEN) { @@ -336,8 +358,26 @@ void mqueue_test(void) printf("mqueue_test: ERROR sender thread exited with %d errors\n", (int)result); } +#ifndef CONFIG_DISABLE_SIGNALS + /* Wake up the receiver thread with a signal */ + + printf("mqueue_test: Killing receiver\n"); + pthread_kill(receiver, 9); +#endif + + /* Wait a bit to see if the thread exits on its own */ + + usleep(500*1000); + + /* Then cancel the thread and see if it did */ + printf("mqueue_test: Canceling receiver\n"); - pthread_cancel(receiver); + status = pthread_cancel(receiver); + if (status == ESRCH) + { + printf("mqueue_test: receiver has already terminated\n"); + } + pthread_join(receiver, &result); if (result != (void*)0) { |