Sfoglia il codice sorgente

!528 fix futex
Merge pull request !528 from wsljy2021/fix_futex

bernard 3 anni fa
parent
commit
9a73896e95
2 ha cambiato i file con 29 aggiunte e 23 eliminazioni
  1. 21 21
      components/lwp/lwp_futex.c
  2. 8 2
      components/lwp/lwp_syscall.c

+ 21 - 21
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;

+ 8 - 2
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)
@@ -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)