From 58e4c4b4399a328258482e29e9430246dcc64cfd Mon Sep 17 00:00:00 2001 From: patacongo Date: Tue, 14 Sep 2010 13:42:15 +0000 Subject: [PATCH] Fix priority inheritance bug git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@2949 42af7a65-404d-4744-a932-0658087f49c3 --- sched/sem_holder.c | 8 +++----- sched/sem_internal.h | 6 +++--- sched/sem_waitirq.c | 2 +- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/sched/sem_holder.c b/sched/sem_holder.c index 6db6867c83..1c3126f2df 100644 --- a/sched/sem_holder.c +++ b/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/sched/sem_internal.h b/sched/sem_internal.h index feb99ef0b3..4b3d30fb1c 100644 --- a/sched/sem_internal.h +++ b/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 * * 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/sched/sem_waitirq.c b/sched/sem_waitirq.c index c37bc57db9..317a37a062 100644 --- a/sched/sem_waitirq.c +++ b/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