Skip to content
Snippets Groups Projects
Commit 58e4c4b4 authored by patacongo's avatar patacongo
Browse files

Fix priority inheritance bug

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@2949 42af7a65-404d-4744-a932-0658087f49c3
parent f9209ca5
No related branches found
No related tags found
No related merge requests found
......@@ -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);
}
/****************************************************************************
......
/****************************************************************************
* 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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment