summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2015-01-27 06:17:59 -0600
committerGregory Nutt <gnutt@nuttx.org>2015-01-27 06:17:59 -0600
commit9fd74b8b8ac60c7e8a1860b6e4069946c131dec7 (patch)
tree2f680ab93a5ca71fb1c647bb711f73833614f753
parent648126f1ac10c444f98a662924b3a0feaf5e3a2d (diff)
parenta9137270348022c765557cbe8c506a573304ad57 (diff)
downloadnuttx-9fd74b8b8ac60c7e8a1860b6e4069946c131dec7.tar.gz
nuttx-9fd74b8b8ac60c7e8a1860b6e4069946c131dec7.tar.bz2
nuttx-9fd74b8b8ac60c7e8a1860b6e4069946c131dec7.zip
Merge remote-tracking branch 'origin/master' into afunix
-rw-r--r--nuttx/libc/wqueue/work_usrthread.c18
-rw-r--r--nuttx/sched/wqueue/kwork_process.c18
2 files changed, 26 insertions, 10 deletions
diff --git a/nuttx/libc/wqueue/work_usrthread.c b/nuttx/libc/wqueue/work_usrthread.c
index f55aaa2f8..bc6797004 100644
--- a/nuttx/libc/wqueue/work_usrthread.c
+++ b/nuttx/libc/wqueue/work_usrthread.c
@@ -219,18 +219,26 @@ void work_process(FAR struct usr_wqueue_s *wqueue)
work = (FAR struct work_s *)work->dq.flink;
}
}
- else
+ else /* elapsed < work->delay */
{
- /* This one is not ready.. will it be ready before the next
- * scheduled wakeup interval?
+ /* This one is not ready.
*
* NOTE that elapsed is relative to the the current time,
* not the time of beginning of this queue processing pass.
* So it may need an adjustment.
*/
- elapsed += (ctick - stick);
- remaining = elapsed - work->delay;
+ elapsed += (ctick - stick);
+ if (elapsed > work->delay)
+ {
+ /* The delay has expired while we are processing */
+
+ elapsed = work->delay;
+ }
+
+ /* Will it be ready before the next scheduled wakeup interval? */
+
+ remaining = work->delay - elapsed;
if (remaining < next)
{
/* Yes.. Then schedule to wake up when the work is ready */
diff --git a/nuttx/sched/wqueue/kwork_process.c b/nuttx/sched/wqueue/kwork_process.c
index 87ed7900d..6333a6c21 100644
--- a/nuttx/sched/wqueue/kwork_process.c
+++ b/nuttx/sched/wqueue/kwork_process.c
@@ -198,18 +198,26 @@ void work_process(FAR struct kwork_wqueue_s *wqueue, uint32_t period, int wndx)
work = (FAR struct work_s *)work->dq.flink;
}
}
- else
+ else /* elapsed < work->delay */
{
- /* This one is not ready.. will it be ready before the next
- * scheduled wakeup interval?
+ /* This one is not ready.
*
* NOTE that elapsed is relative to the the current time,
* not the time of beginning of this queue processing pass.
* So it may need an adjustment.
*/
- elapsed += (ctick - stick);
- remaining = elapsed - work->delay;
+ elapsed += (ctick - stick);
+ if (elapsed > work->delay)
+ {
+ /* The delay has expired while we are processing */
+
+ elapsed = work->delay;
+ }
+
+ /* Will it be ready before the next scheduled wakeup interval? */
+
+ remaining = work->delay - elapsed;
if (remaining < next)
{
/* Yes.. Then schedule to wake up when the work is ready */