aboutsummaryrefslogtreecommitdiff
path: root/include/kpl/runtime.h
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