sched/sched/sched_critmon.c: Design simplication. Now that irqcount is always available, there is no need for the flags that were used to retain IRQ state.

This commit is contained in:
Gregory Nutt 2018-11-25 07:41:52 -06:00
parent d09cf2d23a
commit 491ef22b63
2 changed files with 7 additions and 34 deletions

View File

@ -700,7 +700,6 @@ struct tcb_s
/* Pre-emption monitor support ************************************************/
#ifdef CONFIG_SCHED_CRITMONITOR
uint32_t crit_flags; /* Flag values used by the monitor */
uint32_t premp_start; /* Time when preemption disabled */
uint32_t premp_max; /* Max time preemption disabled */
uint32_t crit_start; /* Time critical section entered */

View File

@ -43,24 +43,6 @@
#ifdef CONFIG_SCHED_CRITMONITOR
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* Flags used by the critical section monitor */
#define CRITMON_PREEMPT (1 << 0) /* Bit 0: Pre-emption is disabled */
#define CRITMON_CSECTION (1 << 1) /* Bit 1: In a critical section */
#define DISABLE_PREEMPT(t) do { (t)->crit_flags |= CRITMON_PREEMPT; } while (0)
#define ENTER_CSECTION(t) do { (t)->crit_flags |= CRITMON_CSECTION; } while (0)
#define ENABLE_PREEMPT(t) do { (t)->crit_flags &= ~CRITMON_PREEMPT; } while (0)
#define LEAVE_CSECTION(t) do { (t)->crit_flags &= ~CRITMON_CSECTION; } while (0)
#define PREEMPT_ISDISABLED(t) (((t)->crit_flags & CRITMON_PREEMPT) != 0)
#define IN_CSECTION(t) (((t)->crit_flags & CRITMON_CSECTION) != 0)
/****************************************************************************
* External Function Prototypes
****************************************************************************/
@ -131,7 +113,7 @@ void sched_critmon_preemption(FAR struct tcb_s *tcb, bool state)
if (state)
{
DEBUGASSERT(tcb->premp_start == 0 && !PREEMPT_ISDISABLED(tcb));
DEBUGASSERT(tcb->premp_start == 0);
/* Disabling.. Save the thread start time */
@ -141,8 +123,6 @@ void sched_critmon_preemption(FAR struct tcb_s *tcb, bool state)
if (tcb->premp_start != 0)
{
DISABLE_PREEMPT(tcb);
/* Save the global start time */
g_premp_start[cpu] = tcb->premp_start;
@ -155,7 +135,7 @@ void sched_critmon_preemption(FAR struct tcb_s *tcb, bool state)
uint32_t now = up_critmon_gettime();
uint32_t elapsed = now - tcb->premp_start;
DEBUGASSERT(now != 0 && PREEMPT_ISDISABLED(tcb));
DEBUGASSERT(now != 0);
tcb->premp_start = 0;
if (elapsed > tcb->premp_max)
@ -163,8 +143,6 @@ void sched_critmon_preemption(FAR struct tcb_s *tcb, bool state)
tcb->premp_max = elapsed;
}
ENABLE_PREEMPT(tcb);
/* Check for the global max elapsed time */
elapsed = now - g_premp_start[cpu];
@ -205,8 +183,6 @@ void sched_critmon_csection(FAR struct tcb_s *tcb, bool state)
if (tcb->crit_start != 0)
{
ENTER_CSECTION(tcb);
/* Set the global start time */
g_crit_start[cpu] = tcb->crit_start;
@ -219,7 +195,7 @@ void sched_critmon_csection(FAR struct tcb_s *tcb, bool state)
uint32_t now = up_critmon_gettime();
uint32_t elapsed = now - tcb->crit_start;
DEBUGASSERT(now != 0 && IN_CSECTION(tcb));
DEBUGASSERT(now != 0);
tcb->crit_start = 0;
if (elapsed > tcb->crit_max)
@ -227,8 +203,6 @@ void sched_critmon_csection(FAR struct tcb_s *tcb, bool state)
tcb->crit_max = elapsed;
}
LEAVE_CSECTION(tcb);
/* Check for the global max elapsed time */
elapsed = now - g_crit_start[cpu];
@ -262,7 +236,7 @@ void sched_critmon_resume(FAR struct tcb_s *tcb)
/* Did this task disable pre-emption? */
if (PREEMPT_ISDISABLED(tcb))
if (tcb->lockcount > 0)
{
/* Yes.. Save the start time */
@ -289,7 +263,7 @@ void sched_critmon_resume(FAR struct tcb_s *tcb)
/* Was this task in a critical section? */
if (IN_CSECTION(tcb))
if (tcb->irqcount > 0)
{
/* Yes.. Save the start time */
@ -333,7 +307,7 @@ void sched_critmon_suspend(FAR struct tcb_s *tcb)
/* Did this task disable pre-emption? */
if (PREEMPT_ISDISABLED(tcb))
if (tcb->lockcount > 0)
{
/* Possibly re-enabling.. Check for the max elapsed time */
@ -348,7 +322,7 @@ void sched_critmon_suspend(FAR struct tcb_s *tcb)
/* Is this task in a critical section? */
if (IN_CSECTION(tcb))
if (tcb->irqcount > 0)
{
/* Possibly leaving .. Check for the max elapsed time */