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:
parent
f9209ca539
commit
58e4c4b439
@ -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);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user