seL4/src/model/preemption.c
TrusthworthySystems 91b7da8625 Release snapshot
2014-07-18 05:03:59 +10:00

43 lines
1.2 KiB
C

/*
* Copyright 2014, General Dynamics C4 Systems
*
* This software may be distributed and modified according to the terms of
* the GNU General Public License version 2. Note that NO WARRANTY is provided.
* See "LICENSE_GPLv2.txt" for details.
*
* @TAG(GD_GPL)
*/
#include <api/failures.h>
#include <model/preemption.h>
#include <model/statedata.h>
#include <plat/machine/hardware.h>
#include <config.h>
/*
* Possibly preempt the current thread to allow an interrupt to be handled.
*/
exception_t
preemptionPoint(void)
{
/* Record that we have performed some work. */
ksWorkUnitsCompleted++;
/*
* If we have performed a non-trivial amount of work since last time we
* checked for preemption, and there is an interrupt pending, handle the
* interrupt.
*
* We avoid checking for pending IRQs every call, as our callers tend to
* call us in a tight loop and checking for pending IRQs can be quite slow.
*/
if (ksWorkUnitsCompleted >= CONFIG_MAX_NUM_WORK_UNITS_PER_PREEMPTION) {
ksWorkUnitsCompleted = 0;
if (isIRQPending()) {
return EXCEPTION_PREEMPTED;
}
}
return EXCEPTION_NONE;
}