NeKernel dev
Loading...
Searching...
No Matches
UserProcessScheduler.h
Go to the documentation of this file.
1/* ========================================
2
3 Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license.
4
5======================================== */
6
7#ifndef INC_PROCESS_SCHEDULER_H
8#define INC_PROCESS_SCHEDULER_H
9
13
14#include <ArchKit/ArchKit.h>
17#include <KernelKit/UserMgr.h>
18#include <NeKit/MutableArray.h>
19
21// Last revision date is: Fri Mar 28 2025 //
23
24namespace Kernel {
26
27class IDylibObject;
30
31/***********************************************************************************/
34/***********************************************************************************/
36 public:
37 explicit USER_PROCESS();
39
40 auto DoVet() const { return *this; }
41
42 public:
43 NE_COPY_DEFAULT(USER_PROCESS)
44
45 public:
46 Char Name[kSchedNameLen] = {"USER_PROCESS"};
48 User* Owner{nullptr};
59
65
70
72
73 enum {
78 };
79
83
86
87 public:
88 /***********************************************************************************/
90 /***********************************************************************************/
91 explicit operator bool();
92
93 /***********************************************************************************/
95 /***********************************************************************************/
97
98 /***********************************************************************************/
100 /***********************************************************************************/
102
103 /***********************************************************************************/
105 /***********************************************************************************/
106 Void Exit(const Int32& exit_code = 0);
107
108 /***********************************************************************************/
113 /***********************************************************************************/
114 ErrorOr<VoidPtr> New(SizeT sz, SizeT pad_amount = 0);
115
116 /***********************************************************************************/
120 /***********************************************************************************/
121 template <typename T>
123
124 /***********************************************************************************/
126 /***********************************************************************************/
127 Void Wake(Bool wakeup = false);
128
129 public:
130 /***********************************************************************************/
132 /***********************************************************************************/
134
135 /***********************************************************************************/
138 /***********************************************************************************/
139 const Char* GetName();
140
141 /***********************************************************************************/
144 /***********************************************************************************/
146
147 const User* GetOwner();
148
150
152
153 private:
156
159};
160
163
183
184/***********************************************************************************/
187/***********************************************************************************/
188class UserProcessScheduler final : public ISchedulable {
189 friend class UserProcessHelper;
190
191 public:
192 explicit UserProcessScheduler() = default;
193 ~UserProcessScheduler() override = default;
194
197
198 public:
199 explicit operator bool();
200 bool operator!();
201
202 public:
205
206 public:
207 ProcessID Spawn(const Char* name, VoidPtr code, VoidPtr image);
208 Void Remove(ProcessID process_id);
209
210 Bool IsUser() override;
211 Bool IsKernel() override;
212 Bool HasMP() override;
213
214 public:
216 SizeT Run();
217
218 public:
220
221 private:
223};
224
225/***********************************************************************************/
229/***********************************************************************************/
230
231class UserProcessHelper final {
232 public:
233 STATIC Bool Switch(HAL::StackFramePtr frame_ptr, ProcessID new_pid);
234 STATIC Bool CanBeScheduled(const USER_PROCESS& process);
237};
238} // namespace Kernel
239
242
244// END
246
247#endif /* ifndef INC_PROCESS_SCHEDULER_H */
Core Process Scheduler header file.
#define kSchedInvalidPID
Definition CoreProcessScheduler.h:17
#define kSchedNameLen
Definition CoreProcessScheduler.h:24
#define kSchedMaxStackSz
Definition CoreProcessScheduler.h:22
#define kSchedMaxMemoryLimit
Definition CoreProcessScheduler.h:21
#define NE_COPY_DELETE(KLASS)
Definition Detail.h:13
#define NE_MOVE_DELETE(KLASS)
Definition Detail.h:21
#define NE_COPY_DEFAULT(KLASS)
Definition Detail.h:17
#define STATIC
#define BOOL
Definition Array.h:15
ErrorOr class for error handling.
Definition ErrorOr.h:22
Dylib class object. A handle to a shared library.
Definition IDylibObject.h:21
Definition UserProcessScheduler.h:35
PROCESS_FILE_TREE< VoidPtr > * FileTree
Definition UserProcessScheduler.h:67
ProcessTime PTime
Definition UserProcessScheduler.h:80
KPCError LastExitCode
Definition UserProcessScheduler.h:154
IDylibObject * DylibDelegate
Definition UserProcessScheduler.h:55
AffinityKind Affinity
Definition UserProcessScheduler.h:50
ProcessID ProcessId
brief Process used time.
Definition UserProcessScheduler.h:84
ErrorOr< VoidPtr > New(SizeT sz, SizeT pad_amount=0)
TLS allocate.
ProcessImage Image
Definition UserProcessScheduler.h:53
HAL::StackFramePtr StackFrame
Definition UserProcessScheduler.h:49
KPCError & GetLocalCode()
return local error code of process.
PROCESS_HEAP_TREE< VoidPtr > * HeapTree
Definition UserProcessScheduler.h:68
ProcessSubsystem SubSystem
Definition UserProcessScheduler.h:47
USER_PROCESS_SIGNAL Signal
Definition UserProcessScheduler.h:66
friend UserProcessScheduler
Definition UserProcessScheduler.h:157
User * Owner
Definition UserProcessScheduler.h:48
SizeT StackSize
Definition UserProcessScheduler.h:54
@ kExecutableKind
Definition UserProcessScheduler.h:75
@ kExecutableKindCount
Definition UserProcessScheduler.h:77
@ kExecutableDylibKind
Definition UserProcessScheduler.h:76
@ kInvalidExecutableKind
Definition UserProcessScheduler.h:74
UserProcessTeam * ParentTeam
Definition UserProcessScheduler.h:69
const Char * GetName()
KPCError LocalCode
Definition UserProcessScheduler.h:155
Int32 Kind
Definition UserProcessScheduler.h:85
ProcessTime RTime
Process allocated tine.
Definition UserProcessScheduler.h:81
Void Exit(const Int32 &exit_code=0)
!
Char Name[kSchedNameLen]
Definition UserProcessScheduler.h:46
KPCError & GetExitCode()
Gets the local exit code.
SizeT UsedMemory
Definition UserProcessScheduler.h:58
ProcessStatusKind Status
Definition UserProcessScheduler.h:51
auto DoVet() const
Definition UserProcessScheduler.h:40
const User * GetOwner()
Void Wake(Bool wakeup=false)
!
SizeT MemoryLimit
Definition UserProcessScheduler.h:57
SizeT MemoryCursor
Definition UserProcessScheduler.h:56
VoidPtr VMRegister
Definition UserProcessScheduler.h:71
ProcessTime UTime
Process run time.
Definition UserProcessScheduler.h:82
const AffinityKind & GetAffinity()
Boolean Delete(ErrorOr< T * > ptr)
TLS free.
const ProcessStatusKind & GetStatus()
UInt8 StackReserve[kSchedMaxStackSz]
Definition UserProcessScheduler.h:52
friend UserProcessHelper
Definition UserProcessScheduler.h:158
Reference wrapper class. /// =========================================================== ///.
Definition Ref.h:22
System User class.
Definition UserMgr.h:49
USER_PROCESS helper class, which contains needed utilities for the scheduler.
Definition UserProcessScheduler.h:231
STATIC Bool CanBeScheduled(const USER_PROCESS &process)
Check if process can be schedulded.
Definition UserProcessScheduler.cc:583
STATIC ErrorOr< ProcessID > TheCurrentPID()
Current proccess id getter.
Definition UserProcessScheduler.cc:571
STATIC Bool Switch(HAL::StackFramePtr frame_ptr, ProcessID new_pid)
Does a context switch in a CPU.
Definition UserProcessScheduler.cc:613
STATIC SizeT StartScheduling()
Start scheduling the current team.
Definition UserProcessScheduler.cc:601
USER_PROCESS scheduler class. The main class which you call to schedule user processes.
Definition UserProcessScheduler.h:188
Bool IsUser() override
Is it a user scheduler?
Definition UserProcessScheduler.cc:473
STATIC UserProcessScheduler & The()
Retrieves the singleton of the process scheduler.
Definition UserProcessScheduler.cc:450
UserProcessTeam mTeam
Definition UserProcessScheduler.h:222
Bool HasMP() override
Is it a SMP scheduler?
Definition UserProcessScheduler.cc:485
USER_PROCESS_REF & TheCurrentProcess()
Gets current running process.
Definition UserProcessScheduler.cc:565
bool operator!()
this checks if no process is on the team.
Definition UserProcessScheduler.cc:680
Bool IsKernel() override
Is it a kernel scheduler?
Definition UserProcessScheduler.cc:479
~UserProcessScheduler() override=default
Void Remove(ProcessID process_id)
Remove process from the team.
Definition UserProcessScheduler.cc:464
BOOL SwitchTeam(UserProcessTeam &team)
Switches the current team.
Definition UserProcessScheduler.cc:555
ProcessID Spawn(const Char *name, VoidPtr code, VoidPtr image)
Add process to team.
Definition UserProcessScheduler.cc:359
friend class UserProcessHelper
Definition UserProcessScheduler.h:189
SizeT Run()
Run User scheduler object.
Definition UserProcessScheduler.cc:495
UserProcessTeam & TheCurrentTeam()
Gets the current scheduled team.
Definition UserProcessScheduler.cc:544
Processs Team (contains multiple processes inside it.) Equivalent to a process batch.
Definition UserProcessScheduler.h:166
USER_PROCESS_ARRAY mProcessList
Definition UserProcessScheduler.h:178
Ref< USER_PROCESS > & AsRef()
Get current process getter as Ref.
Definition UserProcessTeam.cc:52
ProcessID mProcessCur
Definition UserProcessScheduler.h:181
Array< USER_PROCESS, kSchedProcessLimitPerTeam > & AsArray()
Process list array getter.
Definition UserProcessTeam.cc:34
ProcessID & Id()
Get team ID.
Definition UserProcessTeam.cc:43
USER_PROCESS_REF mCurrentProcess
Definition UserProcessScheduler.h:179
ProcessID mTeamId
Definition UserProcessScheduler.h:180
UserProcessTeam()
Definition UserProcessTeam.cc:16
StackFrame * StackFramePtr
Definition Processor.h:34
UPS inline definitions.
Definition Device.h:12
char Char
Definition Config.h:51
void Void
Definition Config.h:87
Array< USER_PROCESS, kSchedProcessLimitPerTeam > USER_PROCESS_ARRAY
Definition UserProcessScheduler.h:161
Int64 ProcessID
Local Process Identifier type.
Definition CoreProcessScheduler.h:219
ProcessSubsystem
Subsystem enum type.
Definition CoreProcessScheduler.h:145
@ kProcessSubsystemUser
Definition CoreProcessScheduler.h:147
__SIZE_TYPE__ SizeT
Definition Config.h:60
PTime ProcessTime
Definition CoreProcessScheduler.h:214
__UINT8_TYPE__ UInt8
Definition Config.h:55
void * VoidPtr
Definition Config.h:33
ProcessStatusKind
Local Process status enum.
Definition CoreProcessScheduler.h:158
@ kKilled
Definition CoreProcessScheduler.h:162
__INT32_TYPE__ Int32
Definition Config.h:38
AffinityKind
Affinity is the amount of nano-seconds this process is going to run.
Definition CoreProcessScheduler.h:171
@ kStandard
Definition CoreProcessScheduler.h:176
Int32 KPCError
Definition KPC.h:28
bool Boolean
Definition Config.h:49
__UINTPTR_TYPE__ UIntPtr
Definition Config.h:62
Ref< USER_PROCESS > USER_PROCESS_REF
Definition UserProcessScheduler.h:162
bool Bool
Definition Config.h:50
Definition UserProcessScheduler.h:60
UIntPtr SignalArg
Definition UserProcessScheduler.h:61
ProcessStatusKind Status
Definition UserProcessScheduler.h:62
UIntPtr SignalID
Definition UserProcessScheduler.h:63
Definition CoreProcessScheduler.h:79
Definition CoreProcessScheduler.h:52
Helper class to contain a process's image and blob.
Definition CoreProcessScheduler.h:239