From 47dd0e389be3d8f2d8214f908fc182730e5a2d36 Mon Sep 17 00:00:00 2001 From: ljy <1134570045@qq.com> Date: Tue, 21 Jun 2022 14:48:20 +0800 Subject: [PATCH 1/2] fix futex --- components/lwp/lwp_futex.c | 42 ++++++++++++++++++------------------ components/lwp/lwp_syscall.c | 2 +- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/components/lwp/lwp_futex.c b/components/lwp/lwp_futex.c index 44c798f31b..cbae3a09c2 100644 --- a/components/lwp/lwp_futex.c +++ b/components/lwp/lwp_futex.c @@ -52,7 +52,7 @@ rt_err_t futex_destory(void *data) return ret; } -struct rt_futex* futex_create(int *uaddr, struct rt_lwp *lwp) +struct rt_futex *futex_create(int *uaddr, struct rt_lwp *lwp) { struct rt_futex *futex = RT_NULL; struct rt_object *obj = RT_NULL; @@ -84,7 +84,7 @@ struct rt_futex* futex_create(int *uaddr, struct rt_lwp *lwp) return futex; } -static struct rt_futex* futex_get(void *uaddr, struct rt_lwp *lwp) +static struct rt_futex *futex_get(void *uaddr, struct rt_lwp *lwp) { struct rt_futex *futex = RT_NULL; struct lwp_avl_struct *node = RT_NULL; @@ -128,8 +128,8 @@ int futex_wait(struct rt_futex *futex, int value, const struct timespec *timeout /* start the timer of thread */ rt_timer_control(&(thread->thread_timer), - RT_TIMER_CTRL_SET_TIME, - &time); + RT_TIMER_CTRL_SET_TIME, + &time); rt_timer_start(&(thread->thread_timer)); } rt_mutex_release(&_futex_lock); @@ -143,6 +143,7 @@ int futex_wait(struct rt_futex *futex, int value, const struct timespec *timeout } else { + rt_mutex_release(&_futex_lock); rt_set_errno(EAGAIN); } @@ -152,7 +153,6 @@ int futex_wait(struct rt_futex *futex, int value, const struct timespec *timeout void futex_wake(struct rt_futex *futex, int number) { rt_base_t level = rt_hw_interrupt_disable(); - while (!rt_list_isempty(&(futex->waiting_thread)) && number) { rt_thread_t thread; @@ -165,7 +165,7 @@ void futex_wake(struct rt_futex *futex, int number) /* resume the suspended thread */ rt_thread_resume(thread); - number --; + number--; } rt_mutex_release(&_futex_lock); rt_hw_interrupt_enable(level); @@ -175,7 +175,7 @@ void futex_wake(struct rt_futex *futex, int number) } int sys_futex(int *uaddr, int op, int val, const struct timespec *timeout, - int *uaddr2, int val3) + int *uaddr2, int val3) { struct rt_lwp *lwp = RT_NULL; struct rt_futex *futex = RT_NULL; @@ -195,7 +195,6 @@ int sys_futex(int *uaddr, int op, int val, const struct timespec *timeout, return -RT_EINVAL; } } - lock_ret = rt_mutex_take_interruptible(&_futex_lock, RT_WAITING_FOREVER); if (lock_ret != RT_EOK) { @@ -218,6 +217,7 @@ int sys_futex(int *uaddr, int op, int val, const struct timespec *timeout, if (lwp_user_object_add(lwp, futex->custom_obj) != 0) { rt_custom_object_destroy(futex->custom_obj); + rt_mutex_release(&_futex_lock); rt_set_errno(ENOMEM); return -RT_ENOMEM; } @@ -225,21 +225,21 @@ int sys_futex(int *uaddr, int op, int val, const struct timespec *timeout, switch (op) { - case FUTEX_WAIT: - ret = futex_wait(futex, val, timeout); - /* _futex_lock is released by futex_wait */ - break; + case FUTEX_WAIT: + ret = futex_wait(futex, val, timeout); + /* _futex_lock is released by futex_wait */ + break; - case FUTEX_WAKE: - futex_wake(futex, val); - /* _futex_lock is released by futex_wake */ - break; + case FUTEX_WAKE: + futex_wake(futex, val); + /* _futex_lock is released by futex_wake */ + break; - default: - rt_mutex_release(&_futex_lock); - rt_set_errno(ENOSYS); - ret = -ENOSYS; - break; + default: + rt_mutex_release(&_futex_lock); + rt_set_errno(ENOSYS); + ret = -ENOSYS; + break; } return ret; diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c index 3d6444c812..6a63b5b007 100644 --- a/components/lwp/lwp_syscall.c +++ b/components/lwp/lwp_syscall.c @@ -399,7 +399,7 @@ void sys_exit(int value) tid->clear_child_tid = RT_NULL; lwp_put_to_user(clear_child_tid, &t, sizeof t); - sys_futex(tid->clear_child_tid, FUTEX_WAKE, 1, RT_NULL, RT_NULL, 0); + sys_futex(clear_child_tid, FUTEX_WAKE, 1, RT_NULL, RT_NULL, 0); } main_thread = rt_list_entry(lwp->t_grp.prev, struct rt_thread, sibling); if (main_thread == tid) -- Gitee From 3b3eacd96c9159816e16138d46a6141b055e4724 Mon Sep 17 00:00:00 2001 From: ljy <1134570045@qq.com> Date: Tue, 21 Jun 2022 16:33:58 +0800 Subject: [PATCH 2/2] add syscall sys_fsync --- components/lwp/lwp_syscall.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c index 6a63b5b007..28f4f52ee4 100644 --- a/components/lwp/lwp_syscall.c +++ b/components/lwp/lwp_syscall.c @@ -4105,6 +4105,11 @@ int sys_sched_getscheduler(int tid, int *policy, void *param) return 0; } +int sys_fsync(int fd) +{ + return fsync(fd); +} + const static void* func_table[] = { (void *)sys_exit, /* 01 */ @@ -4299,7 +4304,8 @@ const static void* func_table[] = (void *)sys_sched_get_priority_min, (void *)sys_sched_setscheduler, (void *)sys_sched_getscheduler, - (void *)sys_setaffinity + (void *)sys_setaffinity, + (void *)sys_fsync }; const void *lwp_get_sys_api(rt_uint32_t number) -- Gitee