summaryrefslogtreecommitdiff
path: root/nuttx/sched
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2010-09-14 13:42:15 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2010-09-14 13:42:15 +0000
commit1900d5219352d8a0d29672a4bf58956fe5e65620 (patch)
tree0bb50ce7b1395fc9d9c72171c0c3ad2e5935f01c /nuttx/sched
parent4395c30614b96e828e0c64e8164b36d906b444c7 (diff)
downloadpx4-nuttx-1900d5219352d8a0d29672a4bf58956fe5e65620.tar.gz
px4-nuttx-1900d5219352d8a0d29672a4bf58956fe5e65620.tar.bz2
px4-nuttx-1900d5219352d8a0d29672a4bf58956fe5e65620.zip
Fix priority inheritance bug
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@2949 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/sched')
-rw-r--r--nuttx/sched/sem_holder.c8
-rw-r--r--nuttx/sched/sem_internal.h6
-rw-r--r--nuttx/sched/sem_waitirq.c2
3 files changed, 7 insertions, 9 deletions
diff --git a/nuttx/sched/sem_holder.c b/nuttx/sched/sem_holder.c
index 6db6867c8..1c3126f2d 100644
--- a/nuttx/sched/sem_holder.c
+++ b/nuttx/sched/sem_holder.c
@@ -816,7 +816,7 @@ void sem_restorebaseprio(FAR _TCB *stcb, FAR sem_t *sem)
* Function: sem_canceled
*
* Description:
- * Called from sem_post() after a thread that was waiting for a semaphore
+ * Called from sem_waitirq() after a thread that was waiting for a semaphore
* count was awakened because of a signal and the semaphore wait has been
* canceled. This function restores the correct thread priority of each
* holder of the semaphore.
@@ -831,17 +831,15 @@ void sem_restorebaseprio(FAR _TCB *stcb, FAR sem_t *sem)
*
****************************************************************************/
-void sem_canceled(FAR sem_t *sem)
+void sem_canceled(FAR _TCB *stcb, FAR sem_t *sem)
{
- FAR _TCB *rtcb = (FAR _TCB*)g_readytorun.head;
-
/* Check our assumptions */
DEBUGASSERT(sem->semcount <= 0);
/* Adjust the priority of every holder as necessary */
- (void)sem_foreachholder(sem, sem_restoreholderprio, rtcb);
+ (void)sem_foreachholder(sem, sem_restoreholderprio, stcb);
}
/****************************************************************************
diff --git a/nuttx/sched/sem_internal.h b/nuttx/sched/sem_internal.h
index feb99ef0b..4b3d30fb1 100644
--- a/nuttx/sched/sem_internal.h
+++ b/nuttx/sched/sem_internal.h
@@ -1,7 +1,7 @@
/****************************************************************************
* sched/sem_internal.h
*
- * Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2007, 2009-2010 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
@@ -100,7 +100,7 @@ EXTERN void sem_addholder(FAR sem_t *sem);
EXTERN void sem_boostpriority(FAR sem_t *sem);
EXTERN void sem_releaseholder(FAR sem_t *sem);
EXTERN void sem_restorebaseprio(FAR _TCB *stcb, FAR sem_t *sem);
-EXTERN void sem_canceled(FAR sem_t *sem);
+EXTERN void sem_canceled(FAR _TCB *stcb, FAR sem_t *sem);
#else
# define sem_initholders()
# define sem_destroyholder(sem)
@@ -108,7 +108,7 @@ EXTERN void sem_canceled(FAR sem_t *sem);
# define sem_boostpriority(sem)
# define sem_releaseholder(sem)
# define sem_restorebaseprio(stcb,sem)
-# define sem_canceled(sem)
+# define sem_canceled(stcb, sem)
#endif
#undef EXTERN
diff --git a/nuttx/sched/sem_waitirq.c b/nuttx/sched/sem_waitirq.c
index c37bc57db..317a37a06 100644
--- a/nuttx/sched/sem_waitirq.c
+++ b/nuttx/sched/sem_waitirq.c
@@ -114,7 +114,7 @@ void sem_waitirq(FAR _TCB *wtcb)
* to this semaphore.
*/
- sem_canceled(sem);
+ sem_canceled(wtcb, sem);
/* And increment the count on the semaphore. This releases the
* count that was taken by sem_post(). This count decremented