General Purpose library for Freestanding C++ and POSIX systems
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

84 lines
2.5 KiB

#pragma once
#include "gp_config.hpp"
#include "gp/functional/function.hpp"
#include "gp/containers/indexed_array.hpp"
#include "gp/utils/pointers.hpp"
#include "gp/ipc/file_description.hpp"
#include "gp/system/platforms/platform_autopicker.hpp"
#include <atomic>
namespace gp {
namespace system {
/**
* @brief Represent the different execution states a process can be in
*/
enum class process_status {
inactive = 0,
running = 1,
waiting = 2,
finished = 3,
zombie = 4
};
/**
* @brief A process ID type
*/
using pid_t = size_t;
/**
* @brief Represent and manages all the process info the scheduler doesn't need to be aware of
*
* Anything thread local is part of that
*/
struct base_process_info {
virtual void initialize() {} //< An initializer
virtual void checkpoint() {} //< Creates a checkpoint if the feature is available
virtual void restore() {} //< Restores a checkpoint if the feature is available
virtual void switch_in() {} //< Called as the process is resuming
virtual void switch_out() {} //< Called as the process is paused
virtual void cleanup() {} //< Called before the process get destroyed
virtual ~base_process_info() {} //< Called as the process is destroyed
};
/**
* @brief Represents the data used for scheduling and managing a process resources.
*/
struct process_data{
pid_t pid; //< The current pid
gp::function<void()> fn; //< Whatever there is to execute
void* stack; //< The stack lower bound pointer
size_t stack_sz; //< The stack size in bytes
gp::system::process_status state; //< The current process' state
std::atomic_bool is_running; //< Whenever the process is currently using execution time
[[no_unique_address]] gp::system::specifics::platform_data specifics; //< The special bits used to handle context switching
gp::unique_ptr<base_process_info> info; //< Other data related to processes but not to scheduling
process_data(gp::function<void()> _fn, void* _stack, size_t _stack_sz, gp::unique_ptr<base_process_info>&& _info)
: fn(_fn)
, stack(_stack)
, stack_sz(_stack_sz)
, state(gp::system::process_status::inactive)
, specifics(gp::buffer<char>{(char*)stack, stack_sz})
, info(gp::move(_info))
{}
process_data(process_data&& v)
: fn(v.fn)
, stack(v.stack)
, stack_sz(v.stack_sz)
, state(v.state)
, specifics(v.specifics)
, info(gp::move(v.info))
{}
~process_data() {
if(info) {
info->cleanup();
}
}
};
}
}