add ERROR_FREE sign, break task manager
This commit is contained in:
@@ -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);
|
||||
}
|
||||
@@ -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*);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user