zxfutex_requeue

摘要

唤醒正在等待 futex 的一些线程,并将更多等待者移至另一个等待队列。

声明

#include <zircon/syscalls.h>

zx_status_t zx_futex_requeue(const zx_futex_t* value_ptr,
                             uint32_t wake_count,
                             zx_futex_t current_value,
                             const zx_futex_t* requeue_ptr,
                             uint32_t requeue_count,
                             zx_handle_t new_requeue_owner);

说明

重新排队是对唤醒的泛化。首先,内核会验证 current_value 中的值与 value_ptr;如果未报告 ZX_ERR_BAD_STATE,则报告该 ID。唤醒 wake_count 后 会将 requeue_count 个线程从原始 futex 的 等待队列加入到与 requeue_ptr 对应的等待队列,另一个 futex

这种重新排队行为可用于避免在唤醒时受到雷击。

所有权

重新排队操作针对两个 futex,即 wake futexrequeue futex。我们将分别讨论每个部分的所有权影响。 一般来说,如果调用由于任何原因失败,二者的所有权不会发生任何变化 FUTEX 产生的。

请参阅 futex 中的所有权和优先级继承

wake futex 目标的影响

成功调用 zx_futex_requeue() 会导致 futex 的所有者: 也设为零。为了转让“ ”的所有权 如果是 futex,请改用 zx_futex_requeue_single_owner() 变体。 zx_futex_requeue_single_owner() 将尝试仅从 futex 等待队列。如果至少有一个线程要唤醒,则 futex 的所有者将 设置为被唤醒的线程。否则, 将不会有所有者。

重新排队 futex 目标的影响

成功调用 zx_futex_requeue()zx_futex_requeue_single_owner() 这会导致 futex 的所有者被设置为 new_requeue_owner 句柄;如果 new_requeue_owner 为,则不为空 ZX_HANDLE_INVALID

权限

无。

返回值

如果成功,zx_futex_requeue() 会返回 ZX_OK

错误

ZX_ERR_INVALID_ARGS 符合以下情况之一:

  • value_ptrrequeue_ptr 不是有效的用户空间指针
  • value_ptrrequeue_ptr 未与 sizeof(zx_futex_t) 边界对齐。
  • value_ptrrequeue_ptr 是相同的 futex
  • new_requeue_owner 目前是 value_ptrrequeue_ptr 的 Waiter 成员
  • new_requeue_owner 尚未启动。

ZX_ERR_BAD_HANDLE new_requeue_owner 不是 ZX_HANDLE_INVALID,并且不是有效的句柄且 current_valuevalue_ptr 中的值匹配

ZX_ERR_WRONG_TYPE new_requeue_owner 是一个有效的句柄,但不是线程的句柄。

ZX_ERR_BAD_STATE current_valuevalue_ptr 中的值不匹配。

另请参阅