// Copyright 2017 The Fuchsia Authors
// Copyright (c) 2008-2015 Travis Geiselbrecht
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT
#pragma once

#include <kernel/thread.h>
#include <list.h>
#include <stdbool.h>
#include <zircon/compiler.h>

/* scheduler interface, used internally by thread.c */
/* not intended to be used by regular kernel code */
void sched_init_early(void);

void sched_init_thread(thread_t* t, int priority);
void sched_block(void);
void sched_yield(void);
void sched_preempt(void);
void sched_reschedule(void);
void sched_resched_internal(void);
void sched_unblock_idle(thread_t* t);
void sched_migrate(thread_t* t);

/* set the inheirited priority of a thread and return if the caller should locally reschedule.
 * pri should be < MAX_PRIORITY, negative values disable priority inheiritance
 */
void sched_inheirit_priority(thread_t* t, int pri, bool* local_resched);

/* return true if the thread was placed on the current cpu's run queue */
/* this usually means the caller should locally reschedule soon */
bool sched_unblock(thread_t* t) __WARN_UNUSED_RESULT;
bool sched_unblock_list(struct list_node* list) __WARN_UNUSED_RESULT;

void sched_transition_off_cpu(cpu_num_t old_cpu);
