forked from xuos/xiuos
Support blocking task.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user