Support blocking task.

This commit is contained in:
TXuian
2024-04-28 15:49:41 +08:00
parent a24d73f710
commit e5df6012af
6 changed files with 64 additions and 6 deletions
@@ -55,6 +55,15 @@ int sys_poll_session(struct Session* userland_session_arr, int arr_capacity)
return -1;
}
// update session_backend
// if current session is handled
if (server_session->head != userland_session_arr[i].head) {
struct TaskMicroDescriptor* client = SERVER_SESSION_BACKEND(server_session)->client;
if (client->state == BLOCKED) {
xizi_task_manager.task_unblock(client);
} else {
client->current_ipc_handled = true;
}
}
server_session->head = userland_session_arr[i].head;
server_session->tail = userland_session_arr[i].tail;
doubleListDel(cur_node);
@@ -85,6 +85,14 @@ void show_tasks(void)
LOG_PRINTF(" %d %s %d %d\n", task->pid, task->name, task->priority, task->mem_size >> 10);
}
}
DOUBLE_LIST_FOR_EACH_ENTRY(task, &xizi_task_manager.task_blocked_list_head, node)
{
LOG_PRINTF(" BLOCK ");
_padding(task->name);
LOG_PRINTF(" %d %s %d %d\n", task->pid, task->name, task->priority, task->mem_size >> 10);
}
LOG_PRINTF("******************************************************\n");
return;
}
@@ -35,6 +35,16 @@ Modification:
int sys_yield(task_yield_reason reason)
{
xizi_task_manager.task_yield_noschedule(cur_cpu()->task, false);
struct TaskMicroDescriptor* cur_task = cur_cpu()->task;
xizi_task_manager.task_yield_noschedule(cur_task, false);
// handle ipc block
if ((reason & SYS_TASK_YIELD_BLOCK_IPC) != 0) {
if (cur_task->current_ipc_handled) {
cur_task->current_ipc_handled = false;
} else {
xizi_task_manager.task_block(cur_task);
}
}
return 0;
}