模块契约Future 与 Promise

结果与所有权

  • xrtPromiseResolve 只借用值。调用方必须保证值至少活到全部 Future 引用释放之后。
  • xrtPromiseResolveOwned 仅在成功完成时接管值;重复完成失败时,值仍归调用方。
  • xrtPromiseReject 增加不可变错误引用,调用方仍释放自己的错误引用。
  • 只有第一个终态写入成功。重复写入返回 false 并设置 XERR_STATE。
  • Future 最后释放时执行 owned 值析构;析构过程在 Future 内部锁外运行。

xrtFutureDone 和 xrtPromiseDone 判断对应端点是否已经进入终态。xrtFutureResult 返回借用的 xfutureresult,xrtFutureError 直接返回失败终态中的借用错误。结果中的值和错误只在调用方继续持有 Future 引用时有效。Pending 返回 false 并设置 XERR_AGAIN。xrtFutureValue 是常见成功路径助手;对失败、取消或关闭状态调用时,会把对应结构化错误设置到当前执行上下文。

xrtPromiseForward 把一个已经进入终态的源 Future 安全透传到目标 Promise。失败错误会增加引用;成功值保持借用语义,同时由目标 Future 保留源引用。透传所有者链使用迭代释放,因此深延续链的销毁不会递归耗尽 C 调用栈。源仍为 Pending、目标已经完成或发生自透传时返回 false。

裁剪与依赖

层裁剪宏依赖能力
Future 核心XRT_FEATURE_FUTUREcancel结果、所有权、同步等待、协作取消
Future 适配桥XRT_FEATURE_FUTURE_BRIDGEfuture、thread、atomic异步操作、Promise 与取消监听的一次性装配
Future 延续XRT_FEATURE_FUTURE_CONTINUEfutureContinue、Then、Catch、Finally 与安全结果透传
Future 组合器XRT_FEATURE_FUTURE_COMBINEfutureAny、All、Race 与源结果保活
协程等待桥XRT_FEATURE_FUTURE_COROUTINEfuture、coroutine_scheduler不阻塞调度线程的 await

延续链、线程池执行器和结构化任务组属于后续独立层,不会增加只需要 Future 核心的程序体积。

统一等待边界

当前契约不再提供 xwaitsrc 或网络专用 xnetwaitsrc。异步操作直接返回同一种 xfuture:Future 同时携带终态、成功值、结构化错误、取消入口和所有权,因此线程 等待、协程 Await、延续、组合器和 TaskGroup 不需要先把它包装成另一个等待对象。

TCP 可读、可写、Drain、Accept 等只表示条件就绪的场景仍通过对应的 xrtNet*WaitAsync 返回 Future;真正接收数据或建立连接的操作返回拥有结果的 Future。 这种分层保留“只观察条件”和“取得结果”两类能力,但不复制 bool、xnet_result 和 Future 终态三套互相转换的状态模型。

需要组合不同对象类型时,上层只保存 xfuture*,通过 Any、All、Race 或 TaskGroup 协调;完成后按创建该 Future 的操作契约解释值。底层事件端口的 readiness/completion 观察仍属于网络引擎内部原语,不作为跨模块类型擦除接口泄漏到业务层。

状态

xfuturestate 只有五个稳定状态:

  • XFUTURE_PENDING:生产端尚未写入结果。
  • XFUTURE_RESOLVED:成功,可读取 Value。
  • XFUTURE_FAILED:失败,可读取不可变 xerror。
  • XFUTURE_CANCELLED:生产过程确认以取消结束。
  • XFUTURE_CLOSED:最后一个生产端在未完成时离开,或显式关闭。

等待一个失败、取消或关闭的 Future 仍返回 XWAIT_OK,因为等待动作已经完成。调用方随后通过 xrtFutureState 或 xrtFutureResult 判断操作结果。XWAIT_TIMEOUT 和 XWAIT_CANCELLED 只描述等待者自身提前停止等待。

创建与生命周期

创建成功后,调用方各拥有一个 Promise 和 Future 引用。pParentCancel 可以为空;非空时,新 Future 的取消令牌继承父链。xrtPromiseRef、xrtFutureRef 分别增加端点引用,xrtPromiseDestroy、xrtFutureDestroy 分别释放。

最后一个 Promise 引用在 Pending 状态释放时,Future 自动进入 XFUTURE_CLOSED 并请求取消,避免消费者永久等待。已经完成的 Future 不会因 Promise 释放而改变状态或取消令牌。

Future 的内部完成监听按注册顺序执行。嵌套完成会追加到当前 Fiber 或线程的无分配派发队列,由最外层完成调用迭代排空;因此组合器和后续延续链的级联深度不会转化为 C 调用栈深度。

无分配终态监听

xfuturewatch 是调用方提供存储的底层终态监听节点,使用 XRT_FUTURE_WATCH_STORAGE_SIZE 固定不透明空间,不为每次监听分配内存。 xfuturewatchproc 接收通知上下文;可选的 xfuturewatchreleaseproc 在节点被 Future 接管后,于完成通知或成功摘除时执行一次。

xrtFutureWatchAdd 返回 XFUTURE_WATCH_PENDING 时,Future 已接管节点;返回 XFUTURE_WATCH_READY 时源已经完成,节点仍归调用方且不会执行 Release; XFUTURE_WATCH_ERROR 表示参数或状态无效。xrtFutureWatchDetach 只尝试摘除尚未 开始通知的节点,成功时同步执行 Release;xrtFutureWatchRemove 还会等待已经开始的 通知结束,不能从该 Watch 自己的通知中调用。xfuturewatchresult 只描述注册结果, 不替代 Future 的终态。

取消

xrtFutureCancel 只发出协作取消请求,Future 保持 Pending,直到生产端完成、确认取消或关闭。这样资源回收、内核 I/O 取消和任务退出不会被一个伪造终态掩盖。令牌访问函数返回新增引用,使用完毕后调用 xrtCancelDestroy。

生产过程可以处理取消后正常返回值;取消请求与最终状态是两个正交事实。只有 xrtPromiseCancel 才写入 XFUTURE_CANCELLED。

xrtPromiseCancel、xrtPromiseClose 和最后一个 Promise 引用的隐式关闭使用两阶段发布:先独占终态写入权并完成取消令牌通知,再发布 CANCELLED/CLOSED、唤醒等待者和执行 Future 回调。因此任何已经观察到取消或关闭终态的线程都必然也能观察到令牌已经请求;令牌监听执行期间 Future 仍显示为 Pending,但其他生产者已经不能抢占终态。取消监听不得等待同一个 Future 进入终态,否则会形成生产端自等待。

同步等待

时间单位统一为毫秒,截止时间使用单调时钟。等待支持任意数量线程,并对虚假唤醒、完成与超时竞争、取消监听注销竞争进行循环检查。Future 终态与外部取消回调在同一把 Future 锁下线性化:终态先取得锁时返回 XWAIT_OK;取消先取得锁时,本次等待固定返回 XWAIT_CANCELLED,即使 Future 在等待线程恢复前已经完成也不会覆盖该结果。截止时间在相同循环边界检查,Future 尚未终结时到期返回 XWAIT_TIMEOUT。调用方取消只停止当前等待,不取消 Future;需要同时取消生产过程时另行调用 xrtFutureCancel。

协程等待

这些函数只能在 xcosched 管理的协程中调用。等待节点由当前协程栈保存,不产生每次 await 堆分配;Future 可由任意线程完成,完成通知通过内部代际令牌投递回所属调度器。通知早于真正 park 时不会丢失,等待退出后也不会污染下一次 park;独立的公共 xrtCoWake 不会被 Await 清理过程误消费。提前唤醒、超时和协程取消都会安全摘除等待节点。

协程取消使 Await 返回 XWAIT_CANCELLED,但不改变被等待 Future 的状态,也不自动决定当前协程的终态。用户过程可以完成清理后正常返回;只有显式调用 xrtCoConfirmCancel,当前协程才以 XCORO_TERM_CANCELLED 终结。对于一次调用者独占的网络 Future,放弃操作时应先调用 xrtFutureCancel,让 TCP/UDP 等待节点及时摘除;共享 Future 则由拥有生产过程取消权的一层决定。

组合器

组合器只协调多个 Future 的生命周期,不复制、不接管源值,也不把某个源的失败冒充为组合器自身失败:

  • Any 在第一个源进入任意终态时,以 xfuturepick 成功完成,不改变其余源。
  • Race 与 Any 的选择结果相同,随后向其余源发出协作取消请求;源生产端仍决定各自最终状态。
  • All 等全部输入槽位进入终态后,以保序的 xfutureall 成功完成。重复源按重复槽位计数;空集合立即成功完成。
  • 输入数量同时受连续分配大小和内部引用计数上限约束,超出任一边界都会在读取输入数组前以 XERR_RANGE 失败。
  • xfuturepick 和 xfutureall 都是借用视图,只在持有组合 Future 引用时有效。组合器内部保留全部源引用,因此通过视图读取源结果不会悬空。
  • 取消尚未完成的组合 Future 会确认组合器自身为 XFUTURE_CANCELLED、摘除全部源监听,并向源发出取消请求;源 Future 不会被伪造为已取消。

这种契约把“多个操作何时达到协调点”和“每个操作以什么结果结束”分开。调用方可以直接检查 pPick->Future 或 pAll->Futures[i] 的状态、值和结构化错误,也可以在上层任务组中实现失败即取消、收集全部错误等策略。

Future 桥

桥解决"异步操作先返回 Future、结果稍后才到"的装配竞态:Ready 之前的终态写入被挂起,Ready/Fail 决定放行或回收。

TLS 监听器

监听器把 TCP 绑定与异步接入组合为单入口;Accept 三形态覆盖 pull(非阻塞/Future/阻塞)消费模型。

TLS 拨号

拨号把 DNS 解析、TCP 竞争连接与 TLS 握手组合为一次异步操作,提供回调式与 Future 式两个入口。

TLS Stream

TLS Stream 组合 TCP 传输与 TLS 会话为单一明文接口:Worker 专用同步收发(Send/Buffer/Pullup/Read/Consume)与任意线程 Future 收发(SendAsync/RecvAsync/WaitAsync)双模型。

Watch 与聚合器的物理拥有图

xrtFutureWatchInitTraced(watch, notify, release, data, trace) 在初始化时固定 release(data) 所释放的强拥有槽;release 和 trace 必须非空。唯一拥有的上下文 折叠到源 Future 的边,共享引用计数上下文必须作为独立物理节点报告。初始化不 分配、不消费、不执行回调;只有 WatchAdd 返回 PENDING 才转移注册释放权。 READY / ERROR 时仍由调用方释放数据。公开 Watch 继续为 64 字节,不改变旧 Init。

Future Inspect 遍历已描述的挂接 Watch;任一未知 waiter 仍拒绝整个检查,不能 假装其数据是叶子。注册、通知、释放、图检查与之后提交之间仍需要调用方保证 整个图静止和所有回调代码驻留;本接口不建立安全点,不自动使语言 frame 可检查。

Any / All / Race 的共享上下文现在按实际 RC 身份入图:每个 Source 槽各一条边, 重复输入保留重复边;Pick 和 All 仅借用这些槽,不产生第二组虚假拥有边。挂起时 每个注册 waiter 持有一个 group 引用;输出另以真实 producer 引用拥有 group, group 又拥有 Promise。拥有型取消监听保有一个实际 group 引用,令牌链表仍只 借用监听。终态原生结果通过策略化原子发布保有 group;终态时取消监听实际注销, 不再留到原生结果销毁。未认证映射上下文仍不被自动准入为可收集节点。 未知源载荷/源 waiter 继续导致拒绝;图检查本身不执行通知、取消、析构或收集。

验证入口 tools/check_future_waiter_ownership.ps1 分别覆盖 Watch 的 PENDING / READY / detach 所有权、重复输入、取消/空集合、原生别名及分配失败原子性。

示例

网络适配层直接返回同一种 xfuture。TCP、UDP、TLS Stream、HTTP 和 WebSocket 的 Future 都可以交给上述同步等待、组合器、延续和协程 Await;协议层只定义 成功值、取消点和终态映射,不复制 Future 或协程状态机。

标准库和扩展库的异步适配器共用公开的 xfuturebridge;对象使用 XRT_FUTURE_BRIDGE_STORAGE_SIZE 字节不透明存储,可直接嵌入操作上下文。底层操作可以 在监听安装期间并发完成,但只有装配进入 READY 后才能发布 Future;监听分配 失败会进入 FAILED,底层晚到结果只执行对应资源回收,不会留下回调。这个底层 契约由 tests/concurrency/test_future_bridge_oom.c 独立验证,DNS、TCP、TLS 与 HTTP 适配器不再分别复制这一段易错生命周期代码。

xrtFutureBridgeCreate 创建 Future/Promise 对;xrtFutureBridgeInit 则借用一个 已有 Promise,两种路径都不接管 Promise 所有权。适配器最终仍须调用 xrtPromiseDestroy(xrtFutureBridgePromise(&bridge))。xrtFutureBridgeReady 与 xrtFutureBridgeFail 只能发布一次,重复发布以状态错误失败。完成回调先调用 xrtFutureBridgeWait 跨过极短装配窗口,再调用 xrtFutureBridgeUnwatch 与正在 执行的取消回调汇合。Wait 返回 false 时只回收底层结果,不写入 Promise。

适配器发布终态前必须先固定成功值或错误引用、注销取消监听、销毁底层操作, 并归还等待节点、缓存预算、网络对象引用和临时 Engine 租约。因而观察到网络 Future 终态时,适配器上下文不会再被迟到回调访问,也没有只为该操作保留的 Engine 活动对象。成功 Future 明确拥有的 Stream、Packet、响应或连接是公开结果, 其生命周期继续由 Future 引用保护,不属于内部临时资源。协作取消同样遵守该屏障, 不会先伪造 CANCELLED 再在后台回收操作。

完整示例位于 examples/concurrency/future/main.c、 examples/concurrency/future_combine/main.c、 examples/concurrency/future_coroutine/main.c 与 examples/tls/stream_future/main.c、examples/tls/dial_future/main.c。 其中 future_combine 同时演示 Any、All、Race、胜出源索引和 Race 的协作取消语义。

显式结果生命周期与物理控制块接管

xrtPromiseResolveOwnedPolicyV1 在发布时绑定不可变的 xfuturepayloadownershipv1 { size, Drop, Trace }。该策略与代码必须比所有结果 活得更久,context 固定为空;失败不消费结果。它与旧的 xrtPromiseResolveOwnedTraced 不同:提供追踪函数并不自动获得生命周期认证。

回收器在同一次全图 freeze 中、调用 Count/Trace 之前,用 xrtFutureOwnershipAdapterV1 及明确的策略身份白名单接纳物理控制块。 Future 与 Promise 是同一个节点,生产端引用不能凭估计扣除。未认证的拥有 载荷、正在完成的控制块、所有已注册 waiter,以及有取消观察者的令牌均拒绝。 转发 Owner、错误 Cause、取消 Parent 和载荷内的拥有边仍需逐一独立接纳。

Claim 可在提交前恢复;Clear 仅在最终重验的同一个 freeze 中隔离结果。 无观察者的 pending 控制块此时进入 CLOSED 并请求其自身取消,不通知用户代码。 真实结果、Owner、Error、Cancel 引用延迟到 freeze 外的 Finish 释放;重复 Finish 不重复消费。已 Clear 的控制块拒绝新增 Future/Promise 引用和结果读取。 普通终末释放仅对显式策略退出自身 mutation 后执行 Drop;旧回调保持保守隔离。 这不是对 pending task、Watch、原生回调或任意模块卸载的普遍授权。

xfuturestate类型

Future 终态明确区分成功、失败、协作取消和生产端关闭。

值语义
XFUTURE_PENDING等待中
XFUTURE_RESOLVEDRESOLVED
XFUTURE_FAILED已失败
XFUTURE_CANCELLED已取消
XFUTURE_CLOSED已关闭
typedef enum xfuturestate { XFUTURE_PENDING = 0, XFUTURE_RESOLVED = 1, XFUTURE_FAILED = 2, XFUTURE_CANCELLED = 3, XFUTURE_CLOSED = 4 } xfuturestate;

xfutureresult类型

Future 结果只借用值和错误,其生命周期由 Future 引用保护。

字段类型语义
Statexfuturestate状态
Valueptr值
Errorconst xerror*错误输出
typedef struct xfutureresult { xfuturestate State; ptr Value; const xerror* Error; } xfutureresult;

xfuturewatch类型

Watch 的内部链表和并发状态保持不透明。

字段类型语义
Alignmentuint64对齐(二次幂)
typedef union xfuturewatch { uint64 Alignment; uint8 Storage[XRT_FUTURE_WATCH_STORAGE_SIZE]; } xfuturewatch;

xfuturewatchresult类型

注册结果区分错误、Future 已完成和成功进入等待链。

值语义
XFUTURE_WATCH_ERROR失败
XFUTURE_WATCH_READY就绪
XFUTURE_WATCH_PENDING等待事件期间
typedef enum xfuturewatchresult { XFUTURE_WATCH_ERROR = -1, XFUTURE_WATCH_READY = 0, XFUTURE_WATCH_PENDING = 1 } xfuturewatchresult;

xfuturepick类型

Any 与 Race 的结果借用胜出源 Future;组合 Future 负责保留该引用。

字段类型语义
Indexsize_t索引
Futurexfuture*Future
typedef struct xfuturepick { size_t Index; xfuture* Future; } xfuturepick;

xfutureall类型

All 的结果按输入顺序借用全部源 Future;组合 Future 负责保留这些引用。

字段类型语义
Countsize_t数量
Futuresxfuture* const*Futures
typedef struct xfutureall { size_t Count; xfuture* const* Futures; } xfutureall;

xfuture类型

Future 是只读共享结果,Promise 是唯一终态写入端。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xfuture xfuture;

xpromise类型

Promise 对象(不透明):解析端单写、Future 端多读的一次性同步原语,随 future_bridge 启用。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xpromise xpromise;

xfuturewatchproc类型

Watch 回调在线程安全的 Future 完成路径中执行,不得重入同一个 Watch。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef void(*xfuturewatchproc)(ptr pData)

xfuturewatchreleaseproc类型

Watch 释放过程在线性化完成通知或成功摘除后执行一次。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef void(*xfuturewatchreleaseproc)(ptr pData)

xfuturefreeproc类型

成功值析构过程接收创建者提供的值和上下文。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef void(*xfuturefreeproc)(ptr pValue, ptr pData)

xfuturecontinueproc类型

延续过程借用源结果和输出 Promise;保留 Promise 时必须先增加引用。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef void(*xfuturecontinueproc)( const xfutureresult* pInput, xpromise* pOutput, ptr pData)

xfuturefinallyproc类型

Finally 过程只观察源结果,输出 Future 自动安全透传源终态。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef void(*xfuturefinallyproc)(const xfutureresult* pInput, ptr pData)
状态

xrtFutureState函数

返回 Future 状态快照;参数无效时返回 CLOSED 并设置错误。

xfuturestate xrtFutureState(const xfuture* pFuture)

参数

参数方向约束说明
pFuture输入允许空目标 Future
返回值
返回含义失败时状态
XFUTURE_PENDING等待中—
XFUTURE_RESOLVED已完成—
XFUTURE_FAILED已失败—
XFUTURE_CANCELLED已取消—
XFUTURE_CLOSED已关闭—
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

concurrency/future_tour · Promise 补集 · 观察

			(xrtFutureState(pSourceFut) != XFUTURE_FAILED) ) {

xrtFutureDone函数

判断 Future 是否已经进入任一不可变终态。

bool xrtFutureDone(const xfuture* pFuture)

参数

参数方向约束说明
pFuture输入允许空目标 Future
返回值
返回含义失败时状态
true已终态(RESOLVED/FAILED/CANCELLED/CLOSED)—
false仍待定或参数非法—
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

concurrency/future_tour · 等待族 · 观察

	if ( (pPromise == NULL) || (pFut1 == NULL) ||
		xrtFutureDone(pFut1) ||
创建与生命周期

xrtPromiseCreate函数

创建一对 Future/Promise;父取消令牌为空时使用独立取消源。

xpromise* xrtPromiseCreate(xfuture** ppFuture, xcancel* pParentCancel)

参数

参数方向约束说明
ppFuture输出非空接收消费端 Future
pParentCancel输入允许空父取消令牌;触发时级联到此 Future
返回值
返回含义失败时状态
非空生产端 Promise(初始引用 1)—
NULL创建失败XERR_MEMORY
错误
  • XERR_MEMORY — 分配失败

范例已编译验证

concurrency/future · 基础 · 观察

	pPromise = xrtPromiseCreate(&pFuture, NULL);
	if ( (pPromise == NULL) || !xrtPromiseResolve(pPromise, &iValue) ) {

xrtPromiseRef函数

增加 Promise 生产端引用并返回原指针。

xpromise* xrtPromiseRef(xpromise* pPromise)

参数

参数方向约束说明
pPromise输入非空目标 Promise
返回值
返回含义失败时状态
非空原指针,引用 +1—
NULL参数非法或引用耗尽XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

concurrency/future_tour · Promise 补集 · 观察

		xpromise* pRef2 = xrtPromiseRef(pPromise);

		if ( (pRef2 != pPromise) ) {
			goto Cleanup;
		}

xrtPromiseDestroy函数

释放生产端引用;最后一个未完成生产端会关闭 Future 并请求取消。

void xrtPromiseDestroy(xpromise* pPromise)

参数

参数方向约束说明
pPromise输入允许空空 = 空操作
返回值
返回含义失败时状态
无归零时 Future 进入 CLOSED 终态—
错误
  • 无 — 释放不失败

范例已编译验证

concurrency/future · 基础 · 观察

	xrtPromiseDestroy(pPromise);
	xrtFutureDestroy(pFuture);

xrtFutureRef函数

增加 Future 消费端引用并返回原指针。

xfuture* xrtFutureRef(xfuture* pFuture)

参数

参数方向约束说明
pFuture输入非空目标 Future
返回值
返回含义失败时状态
非空原指针,引用 +1—
NULL参数非法或引用耗尽XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

concurrency/future_tour · 等待族 · 观察

	pRef = xrtFutureRef(pFut1);
	if ( (pRef != pFut1) || !xrtPromiseResolve(pPromise, (ptr)1) ) {

xrtFutureDestroy函数

释放 Future 消费端引用;空指针视为空操作。

void xrtFutureDestroy(xfuture* pFuture)

参数

参数方向约束说明
pFuture输入允许空空 = 空操作
返回值
返回含义失败时状态
无归零时释放值/错误与对象—
错误
  • 无 — 释放不失败

范例已编译验证

concurrency/future_combine · 收尾 · 观察

	xrtFutureDestroy(pRace);
无分配终态监听

xrtPromiseResolve函数

以借用方式完成成功结果,值的生命周期由调用方保证。

bool xrtPromiseResolve(xpromise* pPromise, ptr pValue)

参数

参数方向约束说明
pPromise输入非空、待定目标 Promise
pValue输入借用成功值
返回值
返回含义失败时状态
true已发布 RESOLVED 终态—
false已完成或参数非法XERR_STATE / XERR_ARGUMENT
错误
  • XERR_STATE — 已进入终态(Promise 只能完成一次)或对象状态非法
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

concurrency/future · 基础 · 观察

	if ( (pPromise == NULL) || !xrtPromiseResolve(pPromise, &iValue) ) {

xrtPromiseResolveOwned函数

转移成功值所有权;完成失败时所有权仍归调用方。

bool xrtPromiseResolveOwned(xpromise* pPromise, ptr pValue, xfuturefreeproc pDestroy, ptr pDestroyData)

参数

参数方向约束说明
pPromise输入非空、待定目标 Promise
pValue输入成功后移交拥有值
pDestroy输入非空值析构过程
pDestroyData输入任意值原样传给析构
返回值
返回含义失败时状态
true已完成;Future 归零时执行析构恰好一次—
false已完成所有权仍归调用方
错误
  • XERR_STATE — 已进入终态(Promise 只能完成一次)或对象状态非法

范例已编译验证

concurrency/worker · 结果移交 · 观察

		if ( !xrtPromiseResolveOwned(
			pPromise,
			pJob,
			workerJobFree,
			NULL
		) ) {

xrtPromiseReject函数

以增加引用方式完成失败结果。

bool xrtPromiseReject(xpromise* pPromise, const xerror* pError)

参数

参数方向约束说明
pPromise输入非空、待定目标 Promise
pError输入非空失败错误(内部增引用)
返回值
返回含义失败时状态
true已发布 FAILED 终态—
false已完成或参数非法XERR_STATE / XERR_ARGUMENT
错误
  • XERR_STATE — 已进入终态(Promise 只能完成一次)或对象状态非法
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

concurrency/future_tour · Promise 补集 · 观察

		if ( (pFail == NULL) ||
			!xrtPromiseReject(pFail, pError) ) {

xrtPromiseForward函数

把已进入终态的源 Future 结果安全透传到 Promise。

bool xrtPromiseForward(xpromise* pPromise, xfuture* pSource)

参数

参数方向约束说明
pPromise输入非空、待定目标 Promise
pSource输入非空、已终态源 Future
返回值
返回含义失败时状态
true源终态已透传—
false源待定或参数非法XERR_STATE / XERR_ARGUMENT
错误
  • XERR_STATE — 已进入终态(Promise 只能完成一次)或对象状态非法
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

concurrency/future_tour · 透传 · 观察

			!xrtPromiseForward(pSource, pFailFut) ||
			!xrtPromiseDone(pSource) ||

xrtFutureResult函数

复制借用结果三元组(State/Value/Error);尚未完成时返回 false 并设置 AGAIN。

bool xrtFutureResult(const xfuture* pFuture, xfutureresult* pResult)

参数

参数方向约束说明
pFuture输入非空目标 Future
pResult输出非空接收借用快照
返回值
返回含义失败时状态
true终态快照已写出(值/错误由 Future 引用保护)—
false待定或参数非法XERR_AGAIN(待定)
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_AGAIN — Future 仍待定

范例已编译验证

network/tcp_server_sync · 接受结果 · 观察

		!xrtFutureResult(pAccept, &Result) ||
		(Result.State != XFUTURE_RESOLVED) ) {

xrtFutureValue函数

返回成功值;非成功终态会把对应错误设置到当前执行上下文。

ptr xrtFutureValue(const xfuture* pFuture)

参数

参数方向约束说明
pFuture输入非空目标 Future
返回值
返回含义失败时状态
非空成功值(借用,由 Future 引用保护)—
NULL非成功终态或参数非法对应错误已设置
错误
  • 失败终态 — 结构化错误设置到当前执行上下文
  • 取消/关闭 — XERR_CANCELLED / XERR_CLOSED 设置

范例已编译验证

concurrency/future · 基础 · 观察

	printf("future value: %d\n", *(int*)xrtFutureValue(pFuture));

xrtFutureError函数

返回失败终态借用的结构化错误,其他状态返回空指针。

const xerror* xrtFutureError(const xfuture* pFuture)

参数

参数方向约束说明
pFuture输入允许空目标 Future
返回值
返回含义失败时状态
非空失败错误借用(存活到 Future 释放)—
NULL非失败终态纯查询
错误
  • 无 — 非失败状态返回空是查询结果

范例已编译验证

network/resolver_future · 失败路径 · 观察

		const xerror* pError = xrtFutureError(pFuture);
取消

xrtFutureCancel函数

请求生产过程协作取消;请求本身不伪造 Future 终态。

bool xrtFutureCancel(xfuture* pFuture)

参数

参数方向约束说明
pFuture输入非空目标 Future
返回值
返回含义失败时状态
true取消请求已发出(幂等)—
false参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

network/tcp_server_sync · 清理 · 观察

		(void)xrtFutureCancel(pAccept);

xrtFutureCancelToken函数

返回增加引用后的取消令牌,调用方使用完毕后必须 xrtCancelDestroy 释放。

xcancel* xrtFutureCancelToken(const xfuture* pFuture)

参数

参数方向约束说明
pFuture输入非空目标 Future
返回值
返回含义失败时状态
非空引用 +1 的令牌—
NULL参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

concurrency/future_combine · 令牌 · 观察

	pFirstCancel = xrtFutureCancelToken(pFirst);

xrtPromiseCancelToken函数

返回增加引用后的生产端取消令牌。

xcancel* xrtPromiseCancelToken(const xpromise* pPromise)

参数

参数方向约束说明
pPromise输入非空目标 Promise
返回值
返回含义失败时状态
非空引用 +1 的令牌—
NULL参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

concurrency/worker · 令牌检查 · 观察

		xcancel* pCancel = xrtPromiseCancelToken(pPromise);

xrtPromiseCancel函数

完成取消终态;令牌请求通知结束后才向等待者发布取消终态。

bool xrtPromiseCancel(xpromise* pPromise)

参数

参数方向约束说明
pPromise输入非空目标 Promise
返回值
返回含义失败时状态
true已发布 CANCELLED 终态—
false已完成或参数非法XERR_STATE / XERR_ARGUMENT
错误
  • XERR_STATE — 已进入终态(Promise 只能完成一次)或对象状态非法
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

concurrency/task_group_scope · 级联 · 观察

		!xrtPromiseCancel(pLeafPromise) ||
		(xrtFutureWait(pDone) != XWAIT_OK) ) {
同步等待

xrtPromiseClose函数

请求生产过程停止,并在令牌通知结束后发布关闭终态。

bool xrtPromiseClose(xpromise* pPromise)

参数

参数方向约束说明
pPromise输入非空目标 Promise
返回值
返回含义失败时状态
true已发布 CLOSED 终态—
false已完成或参数非法XERR_STATE / XERR_ARGUMENT
错误
  • XERR_STATE — 已进入终态(Promise 只能完成一次)或对象状态非法
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

concurrency/worker · 任务关闭 · 观察

	(void)xrtPromiseClose(pJob->Promise);
	xrtPromiseDestroy(pJob->Promise);

xrtPromiseDone函数

判断 Promise 对应的 Future 是否已经完成。

bool xrtPromiseDone(const xpromise* pPromise)

参数

参数方向约束说明
pPromise输入允许空目标 Promise
返回值
返回含义失败时状态
trueFuture 已终态—
false待定或参数非法—
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

concurrency/future_tour · Promise 补集 · 观察

			!xrtPromiseForward(pSource, pFailFut) ||
			!xrtPromiseDone(pSource) ||

xrtFutureWatchInit函数

初始化一个尚未注册的无分配 Future Watch。

bool xrtFutureWatchInit(xfuturewatch* pWatch, xfuturewatchproc pNotify, xfuturewatchreleaseproc pRelease, ptr pData)

参数

参数方向约束说明
pWatch输出非空调用方固定存储(64 字节)
pNotify输入非空终态通知回调
pRelease输入允许空Watch 释放过程(恰好一次)
pData输入任意值原样传给回调
返回值
返回含义失败时状态
trueWatch 已就绪—
false参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

concurrency/future_tour · Watch · 观察

			!xrtFutureWatchInit(&Watch, exampleWatchNotify,
				exampleWatchRelease, NULL) ||

xrtFutureWatchAdd函数

Future 未完成时注册 Watch;READY 时 Watch 未被接管且不执行 Release。

xfuturewatchresult xrtFutureWatchAdd(xfuture* pFuture, xfuturewatch* pWatch)

参数

参数方向约束说明
pFuture输入非空目标 Future
pWatch输入已 Init 且未注册Watch
返回值
返回含义失败时状态
XFUTURE_WATCH_PENDING已进入等待链,完成时执行 Notify—
XFUTURE_WATCH_READYFuture 已终态;回调不执行、Release 不执行—
XFUTURE_WATCH_ERROR参数或状态错误XERR_ARGUMENT / XERR_STATE
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_STATE — Watch 已注册到其他 Future

范例已编译验证

concurrency/future_tour · Watch · 观察

			(xrtFutureWatchAdd(pWF, &Watch) !=
				XFUTURE_WATCH_PENDING) ) {
协程等待

xrtFutureWatchDetach函数

尝试摘除尚未开始通知的 Watch;成功时同步执行 Release。

bool xrtFutureWatchDetach(xfuture* pFuture, xfuturewatch* pWatch)

参数

参数方向约束说明
pFuture输入非空目标 Future
pWatch输入已注册要摘除的 Watch
返回值
返回含义失败时状态
true已摘除并同步执行 Release—
false通知已开始或参数非法XERR_STATE / XERR_ARGUMENT
错误
  • XERR_STATE — 已进入终态(Promise 只能完成一次)或对象状态非法
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

concurrency/future_tour · Watch · 观察

			!xrtFutureWatchDetach(pWF, &Watch) ) {

xrtFutureWatchRemove函数

摘除 Watch 并等待已经开始的通知结束;禁止从自身通知中调用。

void xrtFutureWatchRemove(xfuture* pFuture, xfuturewatch* pWatch)

参数

参数方向约束说明
pFuture输入非空目标 Future
pWatch输入已注册要移除的 Watch
返回值
返回含义失败时状态
无返回后通知不再触发;Release 已执行—
错误
  • XERR_STATE — 已进入终态(Promise 只能完成一次)或对象状态非法(从自身通知回调中调用会自等待死锁)

范例已编译验证

concurrency/future_tour · Watch · 观察

		xrtFutureWatchRemove(pWF, &Watch);

xrtFutureWait函数

等待 Future 进入任一终态。

xwaitresult xrtFutureWait(xfuture* pFuture)

参数

参数方向约束说明
pFuture输入非空目标 Future
返回值
返回含义失败时状态
XWAIT_OK已终态—
XWAIT_ERROR参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

concurrency/future · 基础 · 观察

	if ( xrtFutureWait(pFuture) != XWAIT_OK ) {

xrtFutureWaitFor函数

在相对毫秒数内等待终态。

xwaitresult xrtFutureWaitFor(xfuture* pFuture, int64 iTimeout)

参数

参数方向约束说明
pFuture输入非空目标 Future
iTimeout输入毫秒相对时限
返回值
返回含义失败时状态
XWAIT_OK已终态—
XWAIT_TIMEOUT到期仍待定(不设错)—
XWAIT_ERROR参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

concurrency/future_tour · 延续核对 · 观察

				(xrtFutureWaitFor(pCatch,
					EXAMPLE_TIMEOUT_MS) != XWAIT_OK) ||

xrtFutureWaitForCancel函数

等待首个线性化事件;取消先取得等待锁后不会被迟到终态覆盖。

xwaitresult xrtFutureWaitForCancel(xfuture* pFuture, int64 iTimeout, xcancel* pCancel)

参数

参数方向约束说明
pFuture输入非空目标 Future
iTimeout输入单调时钟绝对截止
pCancel输入允许空取消令牌
返回值
返回含义失败时状态
XWAIT_OK / XWAIT_TIMEOUT终态/到期—
XWAIT_CANCELLED令牌触发(优先于迟到终态)不设错
XWAIT_ERROR参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

concurrency/future_tour · 等待族 · 观察

		(xrtFutureWaitForCancel(pFut1,
			EXAMPLE_TIMEOUT_MS,
			pCancel) != XWAIT_CANCELLED) ) {

xrtFutureAwait函数

在当前调度协程中挂起等待终态,不阻塞调度线程。

xwaitresult xrtFutureAwait(xfuture* pFuture)

参数

参数方向约束说明
pFuture输入非空目标 Future
返回值
返回含义失败时状态
XWAIT_OK已终态—
XWAIT_ERROR参数非法或非协程上下文错误经 xrtGetError() 报告
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_STATE — 不在协程调度器内

范例已编译验证

concurrency/future_coroutine · 挂起 · 观察

	if ( xrtFutureAwait(pFuture) != XWAIT_OK ) {

xrtFutureAwaitFor函数

协程挂起到相对期限。

xwaitresult xrtFutureAwaitFor(xfuture* pFuture, int64 iTimeout)

参数

参数方向约束说明
pFuture输入非空目标 Future
iTimeout输入毫秒相对期限
返回值
返回含义失败时状态
XWAIT_OK / XWAIT_TIMEOUT终态/到期—
XWAIT_ERROR参数/上下文错误错误经 xrtGetError() 报告
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_STATE — 不在协程调度器内

范例已编译验证

concurrency/report · 超时控制 · 观察

	eWait = xrtFutureAwaitFor(pDone, UINT64_C(2000000));

xrtFutureContinue函数

对源的任意终态执行延续过程;过程负责完成或保留输出 Promise。

xfuture* xrtFutureContinue(xfuture* pSource, xfuturecontinueproc pProc, ptr pData)

参数

参数方向约束说明
pSource输入非空源 Future
pProc输入非空延续过程
pData输入任意值原样传给过程
返回值
返回含义失败时状态
非空输出 Future—
NULL参数非法或 OOMXERR_ARGUMENT / XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY

范例已编译验证

concurrency/future_tour · 非 Owned 补齐 · 观察

			pAnyChain = xrtFutureContinue(pPlainF,
				exampleContinueAny, NULL);

xrtFutureContinueOwned函数

执行任意终态延续,并在执行、跳过或取消后释放受理的数据。

xfuture* xrtFutureContinueOwned(xfuture* pSource, xfuturecontinueproc pProc, ptr pData, xfuturefreeproc pDestroy, ptr pDestroyData)

参数

参数方向约束说明
pSource输入非空源 Future
pProc输入非空延续过程
pData输入任意值原样传给过程
pDestroy输入非空受理数据析构(跳过/执行/取消后恰好一次)
pDestroyData输入任意值原样传给析构
返回值
返回含义失败时状态
非空输出 Future—
NULL参数非法或 OOMXERR_ARGUMENT / XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY

范例已编译验证

concurrency/future_tour · Owned 注册 · 观察

		pB = xrtFutureContinueOwned(pA, exampleContinueAny,
			NULL, exampleDestroy, NULL);

xrtFutureContinueOwnedCancelSource函数

对独占源的任意终态执行延续;取消输出时同时请求取消源。只适用于不与其他消费者共享源的组合层。

xfuture* xrtFutureContinueOwnedCancelSource(xfuture* pSource, xfuturecontinueproc pProc, ptr pData, xfuturefreeproc pDestroy, ptr pDestroyData)

参数

参数方向约束说明
pSource输入非空源 Future
pProc输入非空延续过程
pData输入任意值原样传给过程
pDestroy输入非空受理数据析构(跳过/执行/取消后恰好一次)
pDestroyData输入任意值原样传给析构
返回值
返回含义失败时状态
非空输出 Future—
NULL参数非法或 OOMXERR_ARGUMENT / XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY

范例已编译验证

concurrency/future_tour · Owned 注册 · 观察

			xfuture* pG = xrtFutureContinueOwnedCancelSource(
				pD ? pD : pB, exampleContinueAny, NULL,
				exampleDestroy, NULL);

xrtFutureThen函数

仅在源成功时执行延续;其他终态自动透传。

xfuture* xrtFutureThen(xfuture* pSource, xfuturecontinueproc pProc, ptr pData)

参数

参数方向约束说明
pSource输入非空源 Future
pProc输入非空延续过程
pData输入任意值原样传给过程
返回值
返回含义失败时状态
非空输出 Future—
NULL参数非法或 OOMXERR_ARGUMENT / XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY

范例已编译验证

concurrency/future_continue · 串联 · 观察

	pNext = xrtFutureThen(pSource, addFive, &iResult);

xrtFutureThenOwned函数

仅在源成功时执行延续,并负责释放受理的数据。

xfuture* xrtFutureThenOwned(xfuture* pSource, xfuturecontinueproc pProc, ptr pData, xfuturefreeproc pDestroy, ptr pDestroyData)

参数

参数方向约束说明
pSource输入非空源 Future
pProc输入非空延续过程
pData输入任意值原样传给过程
pDestroy输入非空受理数据析构(跳过/执行/取消后恰好一次)
pDestroyData输入任意值原样传给析构
返回值
返回含义失败时状态
非空输出 Future—
NULL参数非法或 OOMXERR_ARGUMENT / XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY

范例已编译验证

concurrency/future_tour · 链 · 观察

		pChain = xrtFutureThenOwned(pPO ? pOk : NULL,
			exampleContinueAdd, NULL, exampleDestroy, NULL);

xrtFutureThenOwnedCancelSource函数

仅在独占源成功时执行延续;取消输出时同时请求取消源。失败/取消/关闭仍按 Then 契约透传。

xfuture* xrtFutureThenOwnedCancelSource(xfuture* pSource, xfuturecontinueproc pProc, ptr pData, xfuturefreeproc pDestroy, ptr pDestroyData)

参数

参数方向约束说明
pSource输入非空源 Future
pProc输入非空延续过程
pData输入任意值原样传给过程
pDestroy输入非空受理数据析构(跳过/执行/取消后恰好一次)
pDestroyData输入任意值原样传给析构
返回值
返回含义失败时状态
非空输出 Future—
NULL参数非法或 OOMXERR_ARGUMENT / XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY

范例已编译验证

concurrency/future_tour · Owned 注册 · 观察

		pD = xrtFutureThenOwnedCancelSource(pC,
			exampleContinueAdd, NULL, exampleDestroy, NULL);

xrtFutureCatch函数

仅在源失败时执行延续;成功、取消和关闭终态自动透传。

xfuture* xrtFutureCatch(xfuture* pSource, xfuturecontinueproc pProc, ptr pData)

参数

参数方向约束说明
pSource输入非空源 Future
pProc输入非空延续过程
pData输入任意值原样传给过程
返回值
返回含义失败时状态
非空输出 Future—
NULL参数非法或 OOMXERR_ARGUMENT / XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY

范例已编译验证

concurrency/future_tour · 非 Owned 补齐 · 观察

			pCatchChain = xrtFutureCatch(pPlainBad,
				exampleContinueRescue, NULL);

xrtFutureCatchOwned函数

仅在源失败时执行延续,并负责释放受理的数据。

xfuture* xrtFutureCatchOwned(xfuture* pSource, xfuturecontinueproc pProc, ptr pData, xfuturefreeproc pDestroy, ptr pDestroyData)

参数

参数方向约束说明
pSource输入非空源 Future
pProc输入非空延续过程
pData输入任意值原样传给过程
pDestroy输入非空受理数据析构(跳过/执行/取消后恰好一次)
pDestroyData输入任意值原样传给析构
返回值
返回含义失败时状态
非空输出 Future—
NULL参数非法或 OOMXERR_ARGUMENT / XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY

范例已编译验证

concurrency/future_tour · 补救 · 观察

			xfuture* pCatch = xrtFutureCatchOwned(pBad,
				exampleContinueRescue, NULL,
				exampleDestroy, NULL);

xrtFutureFinally函数

观察源的任意终态,再把原结果安全透传到输出 Future。

xfuture* xrtFutureFinally(xfuture* pSource, xfuturefinallyproc pProc, ptr pData)

参数

参数方向约束说明
pSource输入非空源 Future
pProc输入非空延续过程
pData输入任意值原样传给过程
返回值
返回含义失败时状态
非空输出 Future—
NULL参数非法或 OOMXERR_ARGUMENT / XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY

范例已编译验证

concurrency/future_tour · 观察 · 观察

			pFin = xrtFutureFinally(pFut2,
				exampleFinallyObserve, NULL);

xrtFutureFinallyOwned函数

观察源的任意终态、透传结果,并负责释放受理的数据。

xfuture* xrtFutureFinallyOwned(xfuture* pSource, xfuturefinallyproc pProc, ptr pData, xfuturefreeproc pDestroy, ptr pDestroyData)

参数

参数方向约束说明
pSource输入非空源 Future
pProc输入非空延续过程
pData输入任意值原样传给过程
pDestroy输入非空受理数据析构(跳过/执行/取消后恰好一次)
pDestroyData输入任意值原样传给析构
返回值
返回含义失败时状态
非空输出 Future—
NULL参数非法或 OOMXERR_ARGUMENT / XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY

范例已编译验证

concurrency/future_tour · Owned 注册 · 观察

			xfuture* pF = xrtFutureFinallyOwned(pE,
				exampleFinallyObserve, NULL,
				exampleDestroy, NULL);
组合器

xrtFutureAny函数

在任一源进入终态后,以 xfuturepick 成功完成;不改变其余源。

xfuture* xrtFutureAny(xfuture* const* pFutures, size_t iCount)

参数

参数方向约束说明
pFutures输入非空数组源 Future 数组
iCount输入> 0源数量
返回值
返回含义失败时状态
非空组合 Future;成功值为 xfuturepick{Index,Future}—
NULL创建失败XERR_ARGUMENT / XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY

范例已编译验证

concurrency/future_combine · Any · 观察

	pAny = xrtFutureAny(arrFuture, 2);

xrtFutureAll函数

在全部源进入终态后,以保序的 xfutureall 成功完成;空集合立即完成。

xfuture* xrtFutureAll(xfuture* const* pFutures, size_t iCount)

参数

参数方向约束说明
pFutures输入允许空(iCount==0)源数组
iCount输入—源数量
返回值
返回含义失败时状态
非空组合 Future;成功值按输入顺序借用全部源—
NULL创建失败XERR_ARGUMENT / XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY

范例已编译验证

concurrency/future_combine · All · 观察

	pAll = xrtFutureAll(arrFuture, 2);

xrtFutureRace函数

在任一源进入终态后完成,并向其余未完成源发出协作取消请求。

xfuture* xrtFutureRace(xfuture* const* pFutures, size_t iCount)

参数

参数方向约束说明
pFutures输入非空数组源 Future 数组
iCount输入> 0源数量
返回值
返回含义失败时状态
非空组合 Future;其余源收到取消请求—
NULL创建失败XERR_ARGUMENT / XERR_MEMORY
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY

范例已编译验证

concurrency/future_combine · Race · 观察

	pRace = xrtFutureRace(arrFuture, 2);
补充参考 · 契约见公共头注释

xrtPromiseProducerBindTakeV1函数

契约注释见公共头文件。

XRT_API bool xrtPromiseProducerBindTakeV1(xpromise* pPromise, xrtownershipref Producer, const xfutureproducerownershipv1* pPolicy)

xrtPromiseProducerBindTakeV2函数

契约注释见公共头文件。

XRT_API bool xrtPromiseProducerBindTakeV2(xpromise* pPromise, xrtownershipref Producer, const xfutureproducerownershipv1* pPolicy, const xfutureproducercancellationv1* pCancellation)

xrtFutureDebugSnapshot函数

契约注释见公共头文件。

XRT_API bool xrtFutureDebugSnapshot(xfuture* pFuture, xfuturedebugsnapshot* pOutput)

xrtFutureDebugNameCopy函数

契约注释见公共头文件。

XRT_API bool xrtFutureDebugNameCopy(xfuture* pFuture, xstrview* pOutput)

xrtFutureDebugSetNameN函数

契约注释见公共头文件。

XRT_API bool xrtFutureDebugSetNameN(xfuture* pFuture, cstr Name, size_t Size)

xrtFutureOwnership函数

契约注释见公共头文件。

XRT_API xrtownershipref xrtFutureOwnership(const xfuture* pFuture)

xrtPromiseOwnership函数

契约注释见公共头文件。

XRT_API xrtownershipref xrtPromiseOwnership(const xpromise* pPromise)

xrtPromiseResolveOwnedPolicyV1函数

契约注释见公共头文件。

XRT_API bool xrtPromiseResolveOwnedPolicyV1(xpromise* pPromise, ptr pValue, const xfuturepayloadownershipv1* pPolicy)

xrtFutureOwnershipAdapterV1函数

契约注释见公共头文件。

XRT_API const xrtownershipadapterv1* xrtFutureOwnershipAdapterV1(xrtownershipref Reference, const xfuturepayloadownershipv1* const* pPolicies, size_t iPolicyCount)

xrtFutureOwnershipAdapterV2函数

契约注释见公共头文件。

XRT_API const xrtownershipadapterv1* xrtFutureOwnershipAdapterV2(xrtownershipref Reference, const xfuturepayloadownershipv1* const* pPolicies, size_t iPolicyCount, const xfutureproducerownershipv1* const* pProducerPolicies, size_t iProducerPolicyCount)

xrtFutureOwnershipAdapterV3函数

契约注释见公共头文件。

XRT_API const xrtownershipadapterv1* xrtFutureOwnershipAdapterV3(xrtownershipref Reference, const xfuturepayloadownershipv1* const* pPolicies, size_t iPolicyCount, const xfutureproducerownershipv1* const* pProducerPolicies, size_t iProducerPolicyCount, const xfuturewatchownershipv1* const* pWatchPolicies, size_t iWatchPolicyCount, const xrtownershippreparationv1** ppPreparation)

xrtFutureWatchInitOwnershipV1函数

契约注释见公共头文件。

XRT_API bool xrtFutureWatchInitOwnershipV1(xfuturewatch* pWatch, ptr pData, const xfuturewatchownershipv1* pPolicy)

xrtFutureWatchInitOwnershipV2函数

契约注释见公共头文件。

XRT_API bool xrtFutureWatchInitOwnershipV2(xfuturewatch* pWatch, ptr pData, const xfuturewatchownershipv2* pPolicy)

xrtFutureOwnershipAdapterV4函数

契约注释见公共头文件。

XRT_API const xrtownershipadapterv1* xrtFutureOwnershipAdapterV4(xrtownershipref Reference, const xfutureownershipadmissionv1* pAdmission, const xrtownershippreparationv1** ppPreparation)

xrtPromiseResolveOwnedTraced函数

契约注释见公共头文件。

XRT_API bool xrtPromiseResolveOwnedTraced(xpromise* pPromise, ptr pValue, xfuturefreeproc pDestroy, ptr pDestroyData, xfutureownershiptrace pTrace)

xrtFutureWatchInitTraced函数

契约注释见公共头文件。

XRT_API bool xrtFutureWatchInitTraced(xfuturewatch* pWatch, xfuturewatchproc pNotify, xfuturewatchreleaseproc pRelease, ptr pData, xrtownershiptrace pTrace)

xrtFutureWatchInitPhased函数

契约注释见公共头文件。

XRT_API bool xrtFutureWatchInitPhased(xfuturewatch* pWatch, xfuturewatchproc pNotify, xfuturewatchreleaseproc pRelease, ptr pData, xrtownershiptrace pTrace)

xrtFutureAllMapOwnedTraced函数

契约注释见公共头文件。

XRT_API xfuture* xrtFutureAllMapOwnedTraced(xfuture* const* pFutures, size_t iCount, xfutureallmapproc pMap, ptr pData, xfuturefreeproc pDestroy, ptr pDestroyData, xfutureownershiptrace pTrace)

xrtFutureAnyMapOwnedTraced函数

契约注释见公共头文件。

XRT_API xfuture* xrtFutureAnyMapOwnedTraced(xfuture* const* pFutures, size_t iCount, xfuturepickmapproc pMap, ptr pData, xfuturefreeproc pDestroy, ptr pDestroyData, xfutureownershiptrace pTrace)

xrtFutureRaceMapOwnedTraced函数

契约注释见公共头文件。

XRT_API xfuture* xrtFutureRaceMapOwnedTraced(xfuture* const* pFutures, size_t iCount, xfuturepickmapproc pMap, ptr pData, xfuturefreeproc pDestroy, ptr pDestroyData, xfutureownershiptrace pTrace)

xrtFutureAllMapOwnedPolicyV1函数

契约注释见公共头文件。

XRT_API xfuture* xrtFutureAllMapOwnedPolicyV1(xfuture* const* pFutures, size_t iCount, ptr pData, const xfuturecombineownershipv1* pPolicy)

xrtFutureAnyMapOwnedPolicyV1函数

契约注释见公共头文件。

XRT_API xfuture* xrtFutureAnyMapOwnedPolicyV1(xfuture* const* pFutures, size_t iCount, ptr pData, const xfuturecombineownershipv1* pPolicy)

xrtFutureRaceMapOwnedPolicyV1函数

契约注释见公共头文件。

XRT_API xfuture* xrtFutureRaceMapOwnedPolicyV1(xfuture* const* pFutures, size_t iCount, ptr pData, const xfuturecombineownershipv1* pPolicy)

xrtFutureCombineProducerPolicyV1Get函数

契约注释见公共头文件。

XRT_API const xfutureproducerownershipv1* xrtFutureCombineProducerPolicyV1Get()

xrtFutureCombineWatchPolicyV2Get函数

契约注释见公共头文件。

XRT_API const xfuturewatchownershipv2* xrtFutureCombineWatchPolicyV2Get()

xrtFutureCombineCancelPolicyV1Get函数

契约注释见公共头文件。

XRT_API const xcancelwatchownershipv1* xrtFutureCombineCancelPolicyV1Get()

xrtFutureCombineAllPayloadPolicyV1Get函数

契约注释见公共头文件。

XRT_API const xfuturepayloadownershipv1* xrtFutureCombineAllPayloadPolicyV1Get()

xrtFutureCombinePickPayloadPolicyV1Get函数

契约注释见公共头文件。

XRT_API const xfuturepayloadownershipv1* xrtFutureCombinePickPayloadPolicyV1Get()

xrtFutureCombineOwnershipAdapterV1函数

契约注释见公共头文件。

XRT_API const xrtownershipadapterv1* xrtFutureCombineOwnershipAdapterV1(xrtownershipref Reference, const xfuturecombineownershipv1* const* pPolicies, size_t iPolicyCount, const xrtownershippreparationv1** ppPreparation)

xrtFutureCombineWaitV1函数

契约注释见公共头文件。

XRT_API bool xrtFutureCombineWaitV1(xrtownershipref Reference, const void* pToken, xfuturecombinewaitv1* pWait)

常量索引常量

以下常量在本页所属头文件中定义,语义见公共头注释。

常量说明
XFUTURE_CANCELLED见头文件注释
XFUTURE_CLOSED见头文件注释
XFUTURE_FAILED见头文件注释
XFUTURE_PENDING见头文件注释
XFUTURE_RESOLVED见头文件注释
XFUTURE_WAIT_ALL_TERMINAL见头文件注释
XFUTURE_WAIT_ANY_TERMINAL见头文件注释
XFUTURE_WATCH_ERROR见头文件注释
XFUTURE_WATCH_PENDING见头文件注释
XFUTURE_WATCH_READY见头文件注释
XRT_FUTURE_WATCH_STORAGE_SIZE见头文件注释