blob: 2adf402be9fa38e06d397c2ed9bfb31baf8d452e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
/*
* KPL allocators, io and threading
*/
#pragma once
#include "base.h"
typedef enum : uint8_t {
KPL_MEMORY_ALLOCATOR_MIN_POW2 = 7,
KPL_MEMORY_ALLOCATOR_MAX_POW2 = 30
} kpl_memory_allocator_enum;
/*
* All allocations are rounded to the next power of two at lest to a min or error if over max
* Each power of two has a bucket in the memory pool for reuse
*/
typedef struct {
// TODO MEMORY ALLOCATOR
} kpl_memory_allocator;
typedef enum : uint8_t {
KPL_MEMORY_POOL_COUNT = 31
} kpl_memory_pool_enum;
// TODO IO URING
// TODO JIT ALLOCATOR
typedef struct {
kpl_memory_allocator allocator;
kpl_object_queue memory_pools[KPL_MEMORY_POOL_COUNT]; // each index represents 2 ** INDEX size in bytes
// TODO io_uring
// TODO jit allocator
_Atomic ssize_t priority; // running + the total number of tasks in threads queue, lower is higher priority
kpl_object_queue task_queue;
pthread_t pthread; // not used for main thread
sem_t sem; // wait when no task queue and io queue is empty
} kpl_thread;
typedef enum : int32_t {
KPL_THREAD_DETERIMINE_COUNT = -1,
KPL_THREAD_MAIN_ID = 0
} kpl_thread_enum;
typedef struct _kpl_env {
int32_t thread_count; // -1 updates this value to max possible, 0 invalid, >= 1 for specific number
_Atomic ssize_t total_priority; // the sum of the threads priority fields, application stops on zero
kpl_thread *thread_array; // 0 is main thread, >= 1 are spawned pthreads
kpl_tree *namespace_tree, *module_tree; // *namespace_tree lookups are thread safe, *module_tree needs mutex
pthread_mutex_t module_tree_mutex;
} kpl_env; // kpl state, no globals
|