forked from xuos/xiuos
fix sys_poll_session performance bug.
This commit is contained in:
@@ -169,13 +169,11 @@ int task_exec(struct TaskMicroDescriptor* task, char* img_start, char* name, cha
|
||||
}
|
||||
strncpy(task->name, last, sizeof(task->name));
|
||||
|
||||
struct TopLevelPageDirectory old_pgdir = task->pgdir;
|
||||
xizi_pager.free_user_pgdir(&task->pgdir);
|
||||
task->pgdir = pgdir;
|
||||
|
||||
/// @todo record mem size used b task
|
||||
task->mem_size = ALIGNUP(load_size, PAGE_SIZE);
|
||||
|
||||
xizi_pager.free_user_pgdir(&old_pgdir);
|
||||
task->heap_base = ALIGNUP(load_size, PAGE_SIZE);
|
||||
task->mem_size = task->heap_base + USER_STACK_SIZE;
|
||||
return 0;
|
||||
|
||||
error_exec:
|
||||
|
||||
@@ -63,5 +63,7 @@ int sys_mmap(uintptr_t vaddr, uintptr_t paddr, int len, int is_dev)
|
||||
load_len += PAGE_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
cur_task->mem_size += true_len;
|
||||
return vaddr + true_len;
|
||||
}
|
||||
@@ -61,28 +61,6 @@ int sys_poll_session(struct Session* userland_session_arr, int arr_capacity)
|
||||
doubleListAddOnBack(cur_node, &cur_task->svr_sess_listhead);
|
||||
}
|
||||
|
||||
/* handle sessions for condition 2, ref. delete_share_pages() */
|
||||
bool has_delete = true;
|
||||
while (has_delete) {
|
||||
has_delete = false;
|
||||
|
||||
DOUBLE_LIST_FOR_EACH_ENTRY(server_session, &cur_task->svr_sess_listhead, node)
|
||||
{
|
||||
if (SERVER_SESSION_BACKEND(server_session)->client_side.closed) {
|
||||
// client had closed it, then server will close it too
|
||||
struct session_backend* session_backend = SERVER_SESSION_BACKEND(server_session);
|
||||
|
||||
if (!session_backend->server_side.closed) {
|
||||
session_backend->server_side.closed = true;
|
||||
xizi_share_page_manager.unmap_task_share_pages(cur_task, session_backend->server_side.buf_addr, session_backend->nr_pages);
|
||||
}
|
||||
xizi_share_page_manager.delete_share_pages(session_backend);
|
||||
has_delete = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* poll with new sessions */
|
||||
int i = 0;
|
||||
DOUBLE_LIST_FOR_EACH_ENTRY(server_session, &cur_task->svr_sess_listhead, node)
|
||||
@@ -90,6 +68,19 @@ int sys_poll_session(struct Session* userland_session_arr, int arr_capacity)
|
||||
if (i >= arr_capacity) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (SERVER_SESSION_BACKEND(server_session)->client_side.closed) {
|
||||
// client had closed it, then server will close it too
|
||||
struct session_backend* session_backend = SERVER_SESSION_BACKEND(server_session);
|
||||
|
||||
if (!session_backend->server_side.closed) {
|
||||
session_backend->server_side.closed = true;
|
||||
xizi_share_page_manager.unmap_task_share_pages(cur_task, session_backend->server_side.buf_addr, session_backend->nr_pages);
|
||||
}
|
||||
xizi_share_page_manager.delete_share_pages(session_backend);
|
||||
break;
|
||||
}
|
||||
|
||||
userland_session_arr[i++] = (struct Session) {
|
||||
.buf = (void*)server_session->buf_addr,
|
||||
.capacity = server_session->capacity,
|
||||
|
||||
@@ -49,7 +49,7 @@ int sys_spawn(char* img_start, char* name, char** argv)
|
||||
return -1;
|
||||
}
|
||||
// init pcb
|
||||
xizi_task_manager.task_set_default_schedule_attr(new_task_cb, RequireRootTag());
|
||||
xizi_task_manager.task_set_default_schedule_attr(new_task_cb);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -65,7 +65,7 @@ void show_tasks(void)
|
||||
}
|
||||
}
|
||||
LOG_PRINTF("******************************************************\n");
|
||||
LOG_PRINTF("STAT ID TASK PRI LEFT_TICKS\n");
|
||||
LOG_PRINTF("STAT ID TASK PRI MEM(KB)\n");
|
||||
for (int i = 0; i < TASK_MAX_PRIORITY; i++) {
|
||||
if (IS_DOUBLE_LIST_EMPTY(&xizi_task_manager.task_list_head[i])) {
|
||||
continue;
|
||||
@@ -82,7 +82,7 @@ void show_tasks(void)
|
||||
LOG_PRINTF(" DEAD ");
|
||||
|
||||
_padding(task->name);
|
||||
LOG_PRINTF(" %d %s %d %d\n", task->pid, task->name, task->priority, task->remain_tick);
|
||||
LOG_PRINTF(" %d %s %d %d\n", task->pid, task->name, task->priority, task->mem_size >> 10);
|
||||
}
|
||||
}
|
||||
LOG_PRINTF("******************************************************\n");
|
||||
@@ -138,7 +138,7 @@ int sys_state(sys_state_option option, sys_state_info* info)
|
||||
info->memblock_info.memblock_start = (uintptr_t)V2P(_binary_fs_img_start);
|
||||
info->memblock_info.memblock_end = (uintptr_t)V2P(_binary_fs_img_end);
|
||||
} else if (option == SYS_STATE_GET_HEAP_BASE) {
|
||||
return cur_cpu()->task->mem_size;
|
||||
return cur_cpu()->task->heap_base;
|
||||
} else if (option == SYS_STATE_SET_TASK_PRIORITY) {
|
||||
xizi_task_manager.set_cur_task_priority(info->priority);
|
||||
} else if (option == SYS_STATE_SHOW_TASKS) {
|
||||
|
||||
Reference in New Issue
Block a user