Fix priority inheritance bug

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@2949 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2010-09-14 13:42:15 +00:00
parent f9209ca539
commit 58e4c4b439
3 changed files with 7 additions and 9 deletions

View File

@ -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);
}
/****************************************************************************

View File

@ -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

View File

@ -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