add ERROR_FREE sign, break task manager

This commit is contained in:
TXuian
2024-10-31 23:33:58 +08:00
parent ce727442de
commit 3d43cb9644
13 changed files with 197 additions and 113 deletions
@@ -41,3 +41,5 @@ extern void panic(char*);
#define LIKELY(exp) __builtin_expect(exp, 1)
#define UNLIKELY(exp) __builtin_expect(exp, 0)
#define ERROR_FREE
@@ -46,22 +46,23 @@ static inline void bitmap64_init(struct bitmap64* bitmap)
static inline int bitmap64_alloc(struct bitmap64* bitmap)
{
int free_bit = -1;
// free bit is the first 0 bit, from [1, 64]
// free bit is the first 0 bit, from [0, 63]
free_bit = __builtin_ffsl(~(uint64_t)(bitmap->map));
// handle if bitmap is full (no using 64th bit here)
if (free_bit == 0) {
return -1;
}
assert(free_bit < 64 && free_bit >= 1);
free_bit -= 1;
assert(free_bit < 64 && free_bit >= 0);
// alloc and return
bitmap->map |= (1 << (free_bit - 1));
return free_bit - 1;
bitmap->map |= (1ULL << free_bit);
return free_bit;
}
static inline void bitmap64_free(struct bitmap64* bitmap, int idx)
{
// usages of bitmap64 must be correct
assert((bitmap->map & (1 << idx)) != 0);
assert((bitmap->map & (1ULL << idx)) != 0);
// free bit
bitmap->map &= ~(uint64_t)(1 << idx);
bitmap->map &= ~(uint64_t)(1ULL << idx);
}
@@ -23,6 +23,7 @@ typedef struct RbtNode {
typedef struct RbtTree {
RbtNode* root;
int nr_ele;
} RbtTree;
void rbtree_init(RbtTree* tree);
@@ -30,4 +31,9 @@ int rbt_insert(RbtTree* tree, uintptr_t key, void* data);
RbtNode* rbt_search(RbtTree* tree, uintptr_t key);
int rbt_delete(RbtTree* tree, uintptr_t key);
void module_rbt_factory_init(TraceTag* _softkernel_tag);
void module_rbt_factory_init(TraceTag* _softkernel_tag);
static inline bool rbt_is_empty(RbtTree* tree)
{
return tree->nr_ele == 0;
}
@@ -92,3 +92,23 @@ struct XiziSharePageManager {
extern struct XiziSharePageManager xizi_share_page_manager;
int module_share_page_init(struct SharePageRightGroup* right_group);
static inline void client_close_session(struct Thread* thd, struct client_session* cli_sess)
{
assert(cli_sess != NULL);
struct session_backend* sess_backend = CLIENT_SESSION_BACKEND(cli_sess);
assert(sess_backend->client == thd);
assert(cli_sess->closed == false);
cli_sess->closed = true;
xizi_share_page_manager.delete_share_pages(sess_backend);
}
static inline void server_close_session(struct Thread* thd, struct server_session* svr_sess)
{
assert(svr_sess != NULL);
struct session_backend* sess_backend = SERVER_SESSION_BACKEND(svr_sess);
assert(sess_backend->server == thd);
assert(svr_sess->closed == false);
svr_sess->closed = true;
xizi_share_page_manager.delete_share_pages(sess_backend);
}
+21 -5
View File
@@ -104,7 +104,7 @@ struct Thread {
Queue sessions_to_be_handle;
Queue sessions_in_handle;
struct TraceTag server_identifier;
bool advance_unblock;
bool advance_unblock; // @todo abandon
/* task schedule attributes */
struct double_list_node node;
@@ -120,6 +120,22 @@ struct SchedulerRightGroup {
struct TraceTag mmu_driver_tag;
};
/* @todo task pool to maintain task lifetime and support fast task search */
struct GlobalTaskPool {
RbtTree thd_ref_map;
struct double_list_node thd_listing_head;
};
struct TaskScheduler {
};
struct TaskLifecycleOperations {
/* new a task control block, checkout #sys_spawn for usage */
struct Thread* (*new_thread)(struct MemSpace* pmemspace);
/* free a task control block, this calls #free_user_pgdir to free all vitual spaces */
void (*free_pcb)(struct Thread*);
};
struct XiziTaskManager {
TraceTag tag;
/* thead schedule lists */
@@ -128,6 +144,10 @@ struct XiziTaskManager {
struct double_list_node task_blocked_list_head;
struct double_list_node task_sleep_list_head;
struct XiziSemaphorePool semaphore_pool;
/* living task pool */
TraceTag task_pool_tag;
/* task lifecycle Ops */
TraceTag task_lifecycle_ops_tag;
/* mem allocator */
struct slab_allocator memspace_allocator;
@@ -137,10 +157,6 @@ struct XiziTaskManager {
/* init task manager */
void (*init)();
/* new a task control block, checkout #sys_spawn for usage */
struct Thread* (*new_task_cb)(struct MemSpace* pmemspace);
/* free a task control block, this calls #free_user_pgdir to free all vitual spaces */
void (*free_pcb)(struct Thread*);
/* init a task control block, set name, remain_tick, state, cwd, priority, etc. */
void (*task_set_default_schedule_attr)(struct Thread*);