mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2025-10-18 09:47:27 +08:00
sync smart & dfs (#8672)
Signed-off-by: xqyjlj <xqyjlj@126.com> Signed-off-by: Shell <smokewood@qq.com> Co-authored-by: xqyjlj <xqyjlj@126.com>
This commit is contained in:
@@ -475,6 +475,11 @@ static long _futex_wake(rt_futex_t futex, struct rt_lwp *lwp, int number,
|
||||
{
|
||||
number--;
|
||||
woken_cnt++;
|
||||
is_empty = RT_FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
is_empty = RT_TRUE;
|
||||
}
|
||||
_futex_unlock(lwp, op_flags);
|
||||
}
|
||||
@@ -512,23 +517,16 @@ static long _futex_requeue(rt_futex_t futex1, rt_futex_t futex2,
|
||||
*/
|
||||
while (nr_wake && !is_empty)
|
||||
{
|
||||
rt_sched_lock_level_t slvl;
|
||||
rt_sched_lock(&slvl);
|
||||
is_empty = rt_list_isempty(&(futex1->waiting_thread));
|
||||
if (!is_empty)
|
||||
if (rt_susp_list_dequeue(&futex1->waiting_thread, RT_EOK))
|
||||
{
|
||||
thread = RT_THREAD_LIST_NODE_ENTRY(futex1->waiting_thread.next);
|
||||
/* remove from waiting list */
|
||||
rt_list_remove(&RT_THREAD_LIST_NODE(thread));
|
||||
|
||||
thread->error = RT_EOK;
|
||||
/* resume the suspended thread */
|
||||
rt_thread_resume(thread);
|
||||
|
||||
nr_wake--;
|
||||
woken_cnt++;
|
||||
is_empty = RT_FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
is_empty = RT_TRUE;
|
||||
}
|
||||
rt_sched_unlock(slvl);
|
||||
}
|
||||
rtn = woken_cnt;
|
||||
|
||||
@@ -542,7 +540,10 @@ static long _futex_requeue(rt_futex_t futex1, rt_futex_t futex2,
|
||||
{
|
||||
rt_sched_lock_level_t slvl;
|
||||
rt_sched_lock(&slvl);
|
||||
|
||||
/* moving from one susp list to another */
|
||||
is_empty = rt_list_isempty(&(futex1->waiting_thread));
|
||||
|
||||
if (!is_empty)
|
||||
{
|
||||
thread = RT_THREAD_LIST_NODE_ENTRY(futex1->waiting_thread.next);
|
||||
@@ -914,7 +915,7 @@ void lwp_futex_exit_robust_list(rt_thread_t thread)
|
||||
rc = _fetch_robust_entry(&next_entry, &entry->next, &next_pi);
|
||||
if (entry != pending)
|
||||
{
|
||||
if (_handle_futex_death((void *)entry + futex_offset, thread, pi,
|
||||
if (_handle_futex_death((int *)((size_t)entry + futex_offset), thread, pi,
|
||||
RT_FALSE))
|
||||
return;
|
||||
}
|
||||
|
Reference in New Issue
Block a user