diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2013-02-06 15:43:28 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2013-02-06 15:43:28 +0000 |
commit | f7b7532a4114b831f5ef66ed992d28e65fb3973f (patch) | |
tree | 929ad375fc60be5b08f35b49ff681db96d97b842 /nuttx/sched/mq_timedreceive.c | |
parent | d8a1b61690862777b137ec182a0d62dcf4ee8db2 (diff) | |
download | px4-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.c | 24 |
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; } |