diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2010-09-14 13:42:15 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2010-09-14 13:42:15 +0000 |
commit | 1900d5219352d8a0d29672a4bf58956fe5e65620 (patch) | |
tree | 0bb50ce7b1395fc9d9c72171c0c3ad2e5935f01c /nuttx | |
parent | 4395c30614b96e828e0c64e8164b36d906b444c7 (diff) | |
download | px4-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')
-rw-r--r-- | nuttx/sched/sem_holder.c | 8 | ||||
-rw-r--r-- | nuttx/sched/sem_internal.h | 6 | ||||
-rw-r--r-- | nuttx/sched/sem_waitirq.c | 2 |
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 |