|
|
@@ -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;
|