#if CONFIG_TELEMETRY
#include <kern/telemetry.h>
#endif
-#include <kern/wait_queue.h>
+#include <kern/waitq.h>
#include <kern/ledger.h>
#include <mach/policy.h>
#include <machine/trap.h> // for CHUD AST hook
* Check for urgent preemption.
*/
if ( (reasons & AST_URGENT) &&
- wait_queue_assert_possible(thread) ) {
+ waitq_wait_possible(thread) ) {
if (reasons & AST_PREEMPT) {
counter(c_ast_taken_block++);
thread_block_reason(THREAD_CONTINUE_NULL, NULL,
/*
* Thread APC hook.
*/
- if (reasons & AST_APC)
- act_execute_returnhandlers();
+ if (reasons & AST_APC) {
+ thread_ast_clear(thread, AST_APC);
+ special_handler(thread);
+ }
if (reasons & AST_GUARD) {
thread_ast_clear(thread, AST_GUARD);
ml_set_interrupts_enabled(FALSE);
+#if CONFIG_SCHED_SFI
if (reasons & AST_SFI) {
sfi_ast(thread);
}
+#endif
- /*
+ /*
* Check for preemption. Conditions may have changed from when the AST_PREEMPT was originally set.
*/
thread_lock(thread);
reasons = csw_check(current_processor(), reasons & AST_QUANTUM);
thread_unlock(thread);
- if ( (reasons & AST_PREEMPT) &&
- wait_queue_assert_possible(thread) ) {
+ assert(waitq_wait_possible(thread));
+
+ if (reasons & AST_PREEMPT) {
counter(c_ast_taken_block++);
thread_block_reason((thread_continue_t)thread_exception_return, NULL, reasons & AST_PREEMPTION);
}
*/
void
ast_check(
- processor_t processor)
+ processor_t processor)
{
- thread_t thread = processor->active_thread;
+ thread_t thread = processor->active_thread;
- if ( processor->state == PROCESSOR_RUNNING ||
- processor->state == PROCESSOR_SHUTDOWN ) {
- ast_t preempt;
+ if (processor->state == PROCESSOR_RUNNING ||
+ processor->state == PROCESSOR_SHUTDOWN) {
+ ast_t preempt;
/*
* Propagate thread ast to processor.
if ((preempt = csw_check(processor, AST_NONE)) != AST_NONE)
ast_on(preempt);
+
thread_unlock(thread);
}
}
+
+/*
+ * Set AST flags on current processor
+ * Called at splsched
+ */
+void
+ast_on(ast_t reasons)
+{
+ ast_t *pending_ast = ast_pending();
+
+ *pending_ast |= reasons;
+}
+
+/*
+ * Clear AST flags on current processor
+ * Called at splsched
+ */
+void
+ast_off(ast_t reasons)
+{
+ ast_t *pending_ast = ast_pending();
+
+ *pending_ast &= ~reasons;
+}
+
+/*
+ * Re-set current processor's per-thread AST flags to those set on thread
+ * Called at splsched
+ */
+void
+ast_context(thread_t thread)
+{
+ ast_t *pending_ast = ast_pending();
+
+ *pending_ast = ((*pending_ast & ~AST_PER_THREAD) | thread->ast);
+}
+
+