sched/semaphore/spinlock.c: Disable local interrupts in spin_setbit() and spin_clrbit() in order to avoid a deadlock condition.

This commit is contained in:
Masayuki Ishikawa 2017-11-23 06:55:53 -06:00 committed by Gregory Nutt
parent d1e234e179
commit 5acd26c88f
1 changed files with 19 additions and 3 deletions

View File

@ -405,8 +405,15 @@ void spin_setbit(FAR volatile cpu_set_t *set, unsigned int cpu,
#ifdef CONFIG_SCHED_INSTRUMENTATION_SPINLOCKS
cpu_set_t prev;
#endif
irqstate_t flags;
/* First, get the 'setlock' spinlock */
/* Disable local interrupts to prevent being re-entered from an interrupt
* on the same CPU. This does not effect the behavior on other CPUs.
*/
flags = up_irq_save();
/* Then, get the 'setlock' spinlock */
spin_lock(setlock);
@ -427,9 +434,10 @@ void spin_setbit(FAR volatile cpu_set_t *set, unsigned int cpu,
}
#endif
/* Release the 'setlock' */
/* Release the 'setlock' and restore local interrupts */
spin_unlock(setlock);
up_irq_restore(flags);
}
/****************************************************************************
@ -456,6 +464,13 @@ void spin_clrbit(FAR volatile cpu_set_t *set, unsigned int cpu,
#ifdef CONFIG_SCHED_INSTRUMENTATION_SPINLOCKS
cpu_set_t prev;
#endif
irqstate_t flags;
/* Disable local interrupts to prevent being re-entered from an interrupt
* on the same CPU. This does not effect the behavior on other CPUs.
*/
flags = up_irq_save();
/* First, get the 'setlock' spinlock */
@ -480,9 +495,10 @@ void spin_clrbit(FAR volatile cpu_set_t *set, unsigned int cpu,
}
#endif
/* Release the 'setlock' */
/* Release the 'setlock' and restore local interrupts */
spin_unlock(setlock);
up_irq_restore(flags);
}
#endif /* CONFIG_SPINLOCK */