zx_task_resume


英文原文快照


不推荐使用此函数。 当使用task_suspend_token挂起线程时,关闭挂起令牌句柄将自动恢复该线程的执行。 如果想要从异常中恢复线程,请使用task_resume_from_exception

名称

task_resume —— 恢复指定的任务

概要

  1. #include <zircon/syscalls.h>
  2. zx_status_t zx_task_resume(zx_handle_t task, uint32_t options);

描述

task_resume() 的功能是使指定的任务从异常或被挂起状态中恢复执行。

从挂起中恢复

如果options未设置ZX_RESUME_EXCEPTION选项,则该操作从中断处恢复执行。

options在此模式下具有有选项都会产生错误。

task_resume() 在未挂起但仍存活(未被终止)的任务上被调用时,它仍将返回成功。 如果在同一个挂起的任务上多次调用task_resume(),则会将这些调用合并为一个恢复操作。

task_resume() 被调用后,任务将很快被恢复。 如果已经发出了task_suspend(),但该任务尚未挂起,则task_resume() 会取消等待中的挂起。 如果某个任务已经成功挂起,task_resume() 将立即恢复它的执行,随后的task_suspend() 将触发该任务上新的挂起。

从异常中恢复

从异常中恢复与从挂起中恢复使用相同的机制,即task_resume()。 传递ZX_RESUME_EXCEPTION选项到options参数,表示该调用是从异常中恢复任务。

请注意,线程可能同时处于挂起和异常状态中,此时每个状态都需要使用适当的options选项单独调用task_resume() 来恢复。

有两种方法可以从异常中恢复,具体取决于是否希望线程从中断处恢复,这在体系结构相关的异常的情况下通常意味着重试发生异常的指令。 否则交予搜索顺序中的下一个处理程序来处理异常。 有关异常处理的描述,请参见task_bind_exception_port

从中断处恢复线程:

  1. zx_status_t status = zx_task_resume(thread, ZX_RESUME_EXCEPTION);

为了将异常传递给搜索顺序中的下一个处理程序,除了ZX_RESUME_EXCEPTION,请同时·将ZX_RESUME_TRY_NEXT传递给option参数:

  1. zx_status_t status = zx_task_resume(thread,
  2. ZX_RESUME_EXCEPTION |
  3. ZX_RESUME_TRY_NEXT);

请注意,即使按特定顺序将异常发送给处理程序,zx_task_resume() 的调用者也无法验证它是否是该处理程序。 具有适当权限的任何人都可以从异常中恢复线程。 所以需要异常处理程序以及所有其他传递ZX_RESUME_EXCEPTION选项调用zx_task_resume() 的程序,来维持它们之间互不干扰。 (ZX-562记录了该问题的详细信息)

权限

TODO(ZX-2399)

返回值

task_resume() 调用成功则返回ZX_OK。 如果调用失败,则返回负的错误码。

错误码

ZX_ERR_BAD_HANDLEhandle是无效句柄。

ZX_ERR_WRONG_TYPEhandle不是线程类型句柄。 ZX_ERR_BAD_STATE:任务不处于可以恢复状态(例如,它已经终止或者传递了ZX_RESUME_EXCEPTIONoption中但线程不在异常中)。

ZX_ERR_INVALID_ARGSoptions是无效的组合。

限制

目前仅支持线程句柄的参数。

另见

task_suspend,