Finish micorkernel functions.
This commit is contained in:
@@ -102,37 +102,28 @@ int _task_retrieve_sys_resources(struct TaskMicroDescriptor* ptask)
|
||||
assert(ptask != NULL);
|
||||
|
||||
/* handle sessions for condition 1, ref. delete_share_pages() */
|
||||
struct session_backend* session_backend = NULL;
|
||||
// close all server_sessions
|
||||
struct server_session* server_session = NULL;
|
||||
while (!IS_DOUBLE_LIST_EMPTY(&ptask->svr_sess_listhead)) {
|
||||
server_session = CONTAINER_OF(ptask->svr_sess_listhead.next, struct server_session, node);
|
||||
assert(server_session != NULL);
|
||||
session_backend = SERVER_SESSION_BACKEND(server_session);
|
||||
assert(session_backend->server == ptask);
|
||||
// cut the connection from task to session
|
||||
if (!server_session->closed) {
|
||||
xizi_share_page_manager.unmap_task_share_pages(ptask, server_session->buf_addr, CLIENT_SESSION_BACKEND(server_session)->nr_pages);
|
||||
server_session->closed = true;
|
||||
}
|
||||
doubleListDel(&server_session->node);
|
||||
SERVER_SESSION_BACKEND(server_session)->server = NULL;
|
||||
// delete session (also cut connection from session to task)
|
||||
if (SERVER_SESSION_BACKEND(server_session)->client_side.closed) {
|
||||
xizi_share_page_manager.delete_share_pages(SERVER_SESSION_BACKEND(server_session));
|
||||
}
|
||||
server_session->closed = true;
|
||||
xizi_share_page_manager.delete_share_pages(session_backend);
|
||||
}
|
||||
// close all client_sessions
|
||||
struct client_session* client_session = NULL;
|
||||
while (!IS_DOUBLE_LIST_EMPTY(&ptask->cli_sess_listhead)) {
|
||||
client_session = CONTAINER_OF(ptask->cli_sess_listhead.next, struct client_session, node);
|
||||
assert(client_session != NULL);
|
||||
session_backend = CLIENT_SESSION_BACKEND(client_session);
|
||||
assert(session_backend->client == ptask);
|
||||
// cut the connection from task to session
|
||||
if (!client_session->closed) {
|
||||
xizi_share_page_manager.unmap_task_share_pages(ptask, client_session->buf_addr, CLIENT_SESSION_BACKEND(client_session)->nr_pages);
|
||||
client_session->closed = true;
|
||||
}
|
||||
doubleListDel(&client_session->node);
|
||||
CLIENT_SESSION_BACKEND(client_session)->client = NULL;
|
||||
// delete session (also cut connection from session to task)
|
||||
if (CLIENT_SESSION_BACKEND(client_session)->server_side.closed) {
|
||||
xizi_share_page_manager.delete_share_pages(CLIENT_SESSION_BACKEND(client_session));
|
||||
}
|
||||
client_session->closed = true;
|
||||
xizi_share_page_manager.delete_share_pages(session_backend);
|
||||
}
|
||||
|
||||
if (ptask->server_identifier.meta != NULL) {
|
||||
@@ -265,8 +256,13 @@ static void _scheduler(struct SchedulerRightGroup right_group)
|
||||
/* if there's not a runnable task, wait for one */
|
||||
if (next_task == NULL) {
|
||||
xizi_leave_kernel();
|
||||
// there is no task to run, into low power mode
|
||||
cpu_into_low_power();
|
||||
|
||||
/* leave kernel for other cores, so they may create a runnable task */
|
||||
xizi_enter_kernel();
|
||||
// activate cpu
|
||||
cpu_leave_low_power();
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user