@@ -20,14 +20,19 @@ void switch_stack_and_jump(uint32_t stack, uint32_t task);
2020void switch_stack (uint32_t esp , uint32_t ebp );
2121extern semaphore_t task_semaphore ;
2222
23- void task_wrapper (task_function_t f ) {
23+ void task_wrapper (task_fn_t f ) {
2424 (void )f ;
2525 serial_debug ("task %d fired!" , current_task_idx );
26- task_function_t fn = tasks [current_task_idx ].task ;
27- fn ();
26+ task_fn_t fn = tasks [current_task_idx ].f ;
27+ fn (tasks [ current_task_idx ]. data );
2828
2929 asm volatile ("cli" );
3030
31+ task_destructor_fn_t df = tasks [current_task_idx ].df ;
32+ if (df ) {
33+ df (tasks [current_task_idx ].df_data );
34+ }
35+
3136 tasks [current_task_idx ].status = TASK_DEAD ;
3237 active_tasks -- ;
3338 serial_debug ("task %d completed, now %d active tasks" , current_task_idx ,
@@ -36,7 +41,6 @@ void task_wrapper(task_function_t f) {
3641 asm volatile ("sti" );
3742 // asm volatile("int $0x20");
3843
39- // should be never reached
4044 while (1 ) {
4145 asm volatile ("hlt" );
4246 }
@@ -84,10 +88,26 @@ bool check_stack_overflow(int task_id) {
8488 return (* (uint32_t * )stack_bottom != STACK_CANARY );
8589}
8690
87- void create_task (int task_id , char * name , task_function_t f , void * stack ,
88- uint32_t stack_size ) {
91+ int find_next_task_slot () {
92+ for (int i = 1 ; i < MAX_TASK ; i ++ ) {
93+ if (tasks [i ].status == TASK_INACTIVE || tasks [i ].status == TASK_DEAD ) {
94+ return i ;
95+ }
96+ }
97+ return -1 ;
98+ }
99+
100+ void create_task (char * name , task_fn_t f , void * data , task_destructor_fn_t df ,
101+ void * df_data , void * stack , uint32_t stack_size ) {
102+ assert (f && stack );
89103 asm volatile ("cli" );
90104
105+ int task_id = find_next_task_slot ();
106+ if (task_id == -1 ) {
107+ assert (0 && "no more slots for tasks" );
108+ asm volatile ("sti" );
109+ return ;
110+ }
91111 task_t task = {0 };
92112 assert (strlen (name ) <= 16 );
93113 memcpy (task .name , name , strlen (name ));
@@ -112,7 +132,10 @@ void create_task(int task_id, char *name, task_function_t f, void *stack,
112132 // push parameter for task_wrapper
113133 task .esp -= 4 ;
114134 * (uint32_t * )task .esp = (uint32_t )f ;
115- task .task = f ;
135+ task .f = f ;
136+ task .data = data ;
137+ task .df = df ;
138+ task .df_data = df_data ;
116139 task .ebp = stack_top ;
117140 task .stack_size = stack_size ;
118141
@@ -150,14 +173,13 @@ void init_tasking() {
150173
151174 memcpy (tasks [0 ].name , "main" , 5 );
152175 tasks [0 ].status = TASK_RUNNING ;
153- tasks [0 ].task = NULL ;
154176
155177 current_task_idx = 0 ;
156178 active_tasks = 1 ;
157179
158180 void * ss = kmalloc (1024 );
159- create_task (1 , "task_stack_check" , task_stack_check , ss , 1024 );
181+ create_task ("task_stack_check" , task_stack_check , ss , 0 , 0 , 0 , 1024 );
160182
161183 void * s2 = kmalloc (5000 );
162- create_task (2 , "kheap_watchdog" , kheap_watchdog , s2 , 5000 );
184+ create_task ("kheap_watchdog" , kheap_watchdog , s2 , 0 , 0 , 0 , 5000 );
163185}
0 commit comments