Files
MentOS/mentos/inc/process/scheduler.h
T
Enrico Fraccaroli (Galfurian) d90e7ff02b Move list_head in libc
2023-06-09 10:45:51 -04:00

115 lines
4.1 KiB
C

/// @file scheduler.h
/// @brief Scheduler structures and functions.
/// @copyright (c) 2014-2023 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#include "sys/list_head.h"
#include "process/process.h"
#include "stddef.h"
/// @brief Structure that contains information about live processes.
typedef struct runqueue_t {
/// Number of queued processes.
size_t num_active;
/// Number of queued periodic processes.
size_t num_periodic;
/// Queue of processes.
list_head queue;
/// The current running process.
task_struct *curr;
} runqueue_t;
/// @brief Structure that describes scheduling parameters.
typedef struct sched_param_t {
/// Static execution priority.
int sched_priority;
/// Expected period of the task
time_t period;
/// Absolute deadline
time_t deadline;
/// Absolute time of arrival of the task
time_t arrivaltime;
/// Is task periodic?
bool_t is_periodic;
} sched_param_t;
/// @brief Initialize the scheduler.
void scheduler_initialize();
/// @brief Returns a non-decreasing unique process id.
/// @return Process identifier (PID).
uint32_t scheduler_getpid();
/// @brief Returns the pointer to the current active process.
/// @return Pointer to the current process.
task_struct *scheduler_get_current_process();
/// @brief Returns the maximum vruntime of all the processes in running state.
/// @return A maximum vruntime value.
time_t scheduler_get_maximum_vruntime();
/// @brief Returns the number of active processes.
/// @return Number of processes.
size_t scheduler_get_active_processes();
/// @brief Returns a pointer to the process with the given pid.
/// @param pid The pid of the process we are looking for.
/// @return Pointer to the process, or NULL if we cannot find it.
task_struct *scheduler_get_running_process(pid_t pid);
/// @brief Activate the given process.
/// @param process Process that has to be activated.
void scheduler_enqueue_task(task_struct *process);
/// @brief Removes the given process from the queue.
/// @param process Process that has to be activated.
void scheduler_dequeue_task(task_struct *process);
/// @brief The RR implementation of the scheduler.
/// @param f The context of the process.
void scheduler_run(pt_regs *f);
/// @brief Values from pt_regs to task_struct process.
/// @param f The set of registers we are saving.
/// @param process The process for which we are saving the CPU registers status.
void scheduler_store_context(pt_regs *f, task_struct *process);
/// @brief Values from task_struct process to pt_regs.
/// @param process The process for which we are restoring the registers in CPU .
/// @param f The set of registers we are restoring.
void scheduler_restore_context(task_struct *process, pt_regs *f);
/// @brief Switch CPU to user mode and start running that given process.
/// @param location The instruction pointer of the process we are starting.
/// @param stack Address of the stack of that process.
void scheduler_enter_user_jmp(uintptr_t location, uintptr_t stack);
/// @brief Picks the next task (in scheduler_algorithm.c).
/// @param runqueue Pointer to the runqueue.
/// @return The next task to execute.
task_struct *scheduler_pick_next_task(runqueue_t *runqueue);
/// @brief Set new scheduling settings for the given process.
/// @param pid ID of the process we are manipulating.
/// @param param New parameters.
/// @return 1 on success, -1 on error.
int sys_sched_setparam(pid_t pid, const sched_param_t *param);
/// @brief Gets the scheduling settings for the given process.
/// @param pid ID of the process we are manipulating.
/// @param param Where we store the parameters.
/// @return 1 on success, -1 on error.
int sys_sched_getparam(pid_t pid, sched_param_t *param);
/// @brief Puts the process on wait until its next period starts.
/// @return 0 on success, a negative value on failure.
int sys_waitperiod();
/// @brief Returns 1 if the given group is orphaned, the session leader of the group
/// is no longer alive.
/// @param gid ID of the group
/// @return 1 if the group is orphan, 0 otherwise.
int is_orphaned_pgrp(pid_t gid);