summaryrefslogtreecommitdiff
path: root/nuttx/examples/ostest
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2007-03-28 14:48:42 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2007-03-28 14:48:42 +0000
commit151a39425178ee628c924b8231ca65e24ee386d7 (patch)
treec509b82d096f72a52b58c51d7cca13d20ef818bb /nuttx/examples/ostest
parent02ca18a9e0cd6c8a31f501dcd05cef13caa5a911 (diff)
downloadpx4-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/ostest')
-rw-r--r--nuttx/examples/ostest/mqueue.c60
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)
{