From 6b636dfde0500c693ec15d3aa3c8fb449c4736b8 Mon Sep 17 00:00:00 2001 From: TXuian <1163589503@qq.com> Date: Tue, 24 Dec 2024 16:48:52 +0800 Subject: [PATCH] minor fix --- .../XiZi_AIoT/services/app/test_thread.c | 46 ++----------------- .../XiZi_AIoT/softkernel/task/schedule.c | 5 +- .../XiZi_AIoT/softkernel/task/semaphore.c | 5 +- Ubiquitous/XiZi_AIoT/softkernel/task/task.c | 4 +- 4 files changed, 11 insertions(+), 49 deletions(-) diff --git a/Ubiquitous/XiZi_AIoT/services/app/test_thread.c b/Ubiquitous/XiZi_AIoT/services/app/test_thread.c index b5e212db3..8e7050ef3 100644 --- a/Ubiquitous/XiZi_AIoT/services/app/test_thread.c +++ b/Ubiquitous/XiZi_AIoT/services/app/test_thread.c @@ -25,15 +25,9 @@ int sub_thread_entry(int argc, char** argv) global_value++; } - /// @warning session is single threaded, so that each thread cannot share a common session. // sub thread connect to semaphore server - struct Session sem_session; - while (connect_session(&sem_session, sem_server_name, 4096) < 0) { - yield(SYS_TASK_YIELD_NO_REASON); - } - printf("Thread signal sem.\n"); - sem_signal(&sem_session, &sem); + semaphore_signal(sem); exit(0); return 0; @@ -45,39 +39,8 @@ int main(int argc, char** argv) global_value = 0; printf("Test Create Semaphore.\n"); - struct Session sem_session; - bool spawn_sem_server = false; - while (connect_session(&sem_session, sem_server_name, 4096) < 0) { - if (!spawn_sem_server) { - struct Session fs_session; - printf("Connect FS.\n"); - if (connect_session(&fs_session, "MemFS", 8192) < 0) { - printf("Connect FS failed.\n"); - exit(1); - } - - printf("Loading semaphore server.\n"); - int fd = -1; - if ((fd = open(&fs_session, sem_file_name)) < 0) { - printf("Open %s failed.\n", sem_file_name); - free_session(&fs_session); - exit(1); - } - - printf("Spawn semaphore server.\n"); - char* sem_server_params[] = { sem_server_name, sem_server_name, NULL }; - if (spawn(&fs_session, fd, read, fsize, sem_server_name, sem_server_params) < 0) { - printf("Spawn %s failed.\n", sem_file_name); - free_session(&fs_session); - exit(1); - } - - spawn_sem_server = true; - free_session(&fs_session); - } - } printf("Create new sem.\n"); - sem_create(&sem_session, &sem, 0); + sem = semaphore_new(0); printf("Create new thread.\n"); char* task_param[2] = { "add_gval", NULL }; @@ -91,12 +54,11 @@ int main(int argc, char** argv) printf("Main thread waiting for sem for %d times.\n", nr_thread); for (int i = 0; i < nr_thread; i++) { - int sem_wait_ret = sem_wait(&sem_session, &sem, 0); + int sem_wait_ret = semaphore_wait(sem); } printf("Main thread sem %d wait return, global val: %d.\n", sem, global_value); - sem_delete(&sem_session, &sem); - free_session(&sem_session); + semaphore_free(sem); exit(0); return 0; } \ No newline at end of file diff --git a/Ubiquitous/XiZi_AIoT/softkernel/task/schedule.c b/Ubiquitous/XiZi_AIoT/softkernel/task/schedule.c index 26fc15f6b..987124f07 100644 --- a/Ubiquitous/XiZi_AIoT/softkernel/task/schedule.c +++ b/Ubiquitous/XiZi_AIoT/softkernel/task/schedule.c @@ -122,10 +122,9 @@ void task_dead(struct Thread* thd) assert(thd != NULL); struct ScheduleNode* snode = &thd->snode; - assert(snode->state == READY); - + assert(snode->state == INIT || snode->state == READY); bool trans_res = task_trans_sched_state(snode, // - &g_scheduler.snode_state_pool[READY], // + &g_scheduler.snode_state_pool[snode->state], // &g_scheduler.snode_state_pool[DEAD], DEAD); assert(trans_res = true); assert(RBTTREE_DELETE_SUCC == rbt_delete(&g_scheduler.snode_state_pool[DEAD], snode->snode_id)); diff --git a/Ubiquitous/XiZi_AIoT/softkernel/task/semaphore.c b/Ubiquitous/XiZi_AIoT/softkernel/task/semaphore.c index 0fb3444f4..fd3589f54 100644 --- a/Ubiquitous/XiZi_AIoT/softkernel/task/semaphore.c +++ b/Ubiquitous/XiZi_AIoT/softkernel/task/semaphore.c @@ -106,7 +106,8 @@ bool ksemaphore_wait(struct XiziSemaphorePool* sem_pool, struct Thread* thd, sem // waiting at the sem sem->val--; THREAD_TRANS_STATE(thd, BLOCKED); - assert(RBTTREE_INSERT_SECC == rbt_insert(&sem->wait_thd_tree, thd->tid, thd)); + int rbt_insert_res = rbt_insert(&sem->wait_thd_tree, thd->tid, thd); + assert(RBTTREE_INSERT_SECC == rbt_insert_res || RBTTREE_INSERT_EXISTED == rbt_insert_res); return true; } @@ -119,7 +120,7 @@ bool ksemaphore_signal(struct XiziSemaphorePool* sem_pool, sem_id_t sem_id) return false; } - if (sem->val < 0) { + if (sem->val < 0 && !rbt_is_empty(&sem->wait_thd_tree)) { assert(!rbt_is_empty(&sem->wait_thd_tree)); RbtNode* root = sem->wait_thd_tree.root; struct Thread* thd = (struct Thread*)root->data; diff --git a/Ubiquitous/XiZi_AIoT/softkernel/task/task.c b/Ubiquitous/XiZi_AIoT/softkernel/task/task.c index 892639f26..5205ae24f 100644 --- a/Ubiquitous/XiZi_AIoT/softkernel/task/task.c +++ b/Ubiquitous/XiZi_AIoT/softkernel/task/task.c @@ -185,7 +185,7 @@ static void _free_thread(struct Thread* task) if (task->memspace->thread_to_notify != NULL) { if (task->memspace->thread_to_notify != task) { if (task->memspace->thread_to_notify->snode.state == BLOCKED) { - THREAD_TRANS_STATE(task->memspace->thread_to_notify, READY); + THREAD_TRANS_STATE(task->memspace->thread_to_notify, TRANS_WAKING); } else { task->memspace->thread_to_notify->advance_unblock = true; } @@ -323,7 +323,7 @@ static void central_trans_task_state() if (snode->state == RUNNING || snode->state == READY) { task_into_ready(thd); } else { - ERROR("Thread %s(%d) Error trans to READY\n", thd->name, thd->tid); + ERROR("Thread %s(%d) Error trans to READY(from %d)\n", thd->name, thd->tid, snode->state); } break; }