summaryrefslogtreecommitdiff
path: root/nuttx/sched/mq_timedreceive.c
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2013-02-06 15:43:28 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2013-02-06 15:43:28 +0000
commitf7b7532a4114b831f5ef66ed992d28e65fb3973f (patch)
tree929ad375fc60be5b08f35b49ff681db96d97b842 /nuttx/sched/mq_timedreceive.c
parentd8a1b61690862777b137ec182a0d62dcf4ee8db2 (diff)
downloadpx4-nuttx-f7b7532a4114b831f5ef66ed992d28e65fb3973f.tar.gz
px4-nuttx-f7b7532a4114b831f5ef66ed992d28e65fb3973f.tar.bz2
px4-nuttx-f7b7532a4114b831f5ef66ed992d28e65fb3973f.zip
Changed needed to fix issues with task_restart()
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5615 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/sched/mq_timedreceive.c')
-rw-r--r--nuttx/sched/mq_timedreceive.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/nuttx/sched/mq_timedreceive.c b/nuttx/sched/mq_timedreceive.c
index 0e68ecc67..774374eda 100644
--- a/nuttx/sched/mq_timedreceive.c
+++ b/nuttx/sched/mq_timedreceive.c
@@ -1,7 +1,7 @@
/****************************************************************************
* sched/mq_timedreceive.c
*
- * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2007-2009, 2011, 2013 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
@@ -182,12 +182,12 @@ static void mq_rcvtimeout(int argc, uint32_t pid)
ssize_t mq_timedreceive(mqd_t mqdes, void *msg, size_t msglen,
int *prio, const struct timespec *abstime)
{
- WDOG_ID wdog;
+ FAR struct tcb_s *rtcb = (FAR struct tcb_s *)g_readytorun.head;
FAR mqmsg_t *mqmsg;
- irqstate_t saved_state;
- int ret = ERROR;
+ irqstate_t saved_state;
+ int ret = ERROR;
- DEBUGASSERT(up_interrupt_context() == false);
+ DEBUGASSERT(up_interrupt_context() == false && rtcb->waitdog == NULL);
/* Verify the input parameters and, in case of an error, set
* errno appropriately.
@@ -209,8 +209,8 @@ ssize_t mq_timedreceive(mqd_t mqdes, void *msg, size_t msglen,
* before we enter the following critical section.
*/
- wdog = wd_create();
- if (!wdog)
+ rtcb->waitdog = wd_create();
+ if (!rtcb->waitdog)
{
set_errno(EINVAL);
return ERROR;
@@ -261,13 +261,14 @@ ssize_t mq_timedreceive(mqd_t mqdes, void *msg, size_t msglen,
set_errno(result);
irqrestore(saved_state);
sched_unlock();
- wd_delete(wdog);
+ wd_delete(rtcb->waitdog);
+ rtcb->waitdog = NULL;
return ERROR;
}
/* Start the watchdog */
- wd_start(wdog, ticks, (wdentry_t)mq_rcvtimeout, 1, getpid());
+ wd_start(rtcb->waitdog, ticks, (wdentry_t)mq_rcvtimeout, 1, getpid());
}
/* Get the message from the message queue */
@@ -278,7 +279,7 @@ ssize_t mq_timedreceive(mqd_t mqdes, void *msg, size_t msglen,
* it was never started)
*/
- wd_cancel(wdog);
+ wd_cancel(rtcb->waitdog);
/* We can now restore interrupts */
@@ -298,6 +299,7 @@ ssize_t mq_timedreceive(mqd_t mqdes, void *msg, size_t msglen,
}
sched_unlock();
- wd_delete(wdog);
+ wd_delete(rtcb->waitdog);
+ rtcb->waitdog = NULL;
return ret;
}