fuchsia.sysmem2

添加时间:12

协议

分配器

fuchsia.sysmem2/allocator.fidl 中定义

分配系统内存缓冲区。

此协议不使用墓碑。

添加时间:19

AllocateNonSharedCollection

代表单个客户端(也称为 发起方),而对方也是唯一参与者(从 sysmem)。

此调用主要用于临时/测试目的。此调用会跳过 fuchsia.sysmem2/BufferCollectionToken 阶段,因此 允许其他参与者指定其限制条件。

我们鼓励真实客户使用 fuchsia.sysmem2/Allocator.AllocateSharedCollection 与 让相关参与者直接表达他们对 系统通过向这些参与者发送 BufferCollectionToken 来启动系统。

请求

名称类型
payload AllocatorAllocateNonSharedCollectionRequest

AllocateSharedCollection

创建一个根 fuchsia.sysmem2/BufferCollectionToken

BufferCollectionToken可以“复制”分发到 参与者 fuchsia.sysmem2/BufferCollectionToken.Duplicate。每个 BufferCollectionToken 可以转换为 使用 fuchsia.sysmem2.BufferCollection fuchsia.sysmem2/Allocator.BindSharedCollection

可以通过 fuchsia.sysmem2/BufferCollection.SetConstraints

可以使用缓冲区填充缓冲区集合成功/失败的情况 确定自 fuchsia.sysmem2/BufferCollection.WaitForAllBuffersAllocated

关闭 BufferCollectionToken 的客户端,或 BufferCollection(先没有 Release)会导致所有客户端都失败 同一故障域,该域默认为 缓冲区收集。请参阅 fuchsia.sysmem2/BufferCollection.SetDispensablefuchsia.sysmem2/BufferCollection.AttachToken,用于创建 单独的故障域。

请求

名称类型
payload AllocatorAllocateSharedCollectionRequest

BindSharedCollection

fuchsia.sysmem2/BufferCollectionToken 转换为 fuchsia.sysmem2/BufferCollection

在发送此消息时,缓冲区收集尚未 缓冲区 - 参与者必须先发送 fuchsia.sysmem2/BufferCollection.SetConstraints(通过 BufferCollection 客户端结束。

从根目录复制了所有 BufferCollectionToken BufferCollectionToken(通过 AllocateSharedCollection 创建)必须是 “已交”通过 BindSharedCollection(或 Releaseed) 现有BufferCollection客户端必须已发送 SetConstraints 之前,逻辑 BufferCollection 将会填充缓冲区(或 会失败)。

请求

名称类型
payload AllocatorBindSharedCollectionRequest

GetVmoInfo

如果给定 sysmem 提供的 VMO 的句柄,这会返回额外的信息 相应 sysmem 逻辑缓冲区的信息。

大多数调用方会先复制一个 VMO 句柄,然后将副本发送到 这场通话

如果客户端为 sysmem 提供的 VMO 创建了子 VMO,则 子 VMO 不被视为“系统内存 VMO”将用于此次调用

  • 请求 vmo:系统内存提供的 VMO 的句柄(或查看错误)。
  • 响应 buffer_collection_id 缓冲区集合 ID,即 每次启动时,每个逻辑缓冲区集合都是唯一的。
  • response buffer_index:缓冲区内缓冲区的缓冲区索引, 缓冲区收集。该索引与 内缓冲区的索引相同。 fuchsia.sysmem2/BufferCollectionInfo.buffersbuffer_index 对于 sysmem 传送的所有 VMO,它们都是相同的 逻辑缓冲区(即使 VMO 组合不同)。buffer_index为 在一个缓冲区集合的各个缓冲区中唯一唯一。对于给定的缓冲区 buffer_collection_idbuffer_index 的组合是唯一的 每次启动时。
  • 响应 close_weak_asap Iff vmo 是弱系统 VMO 的句柄, close_weak_asap 字段将在响应中设置。此标识名 当所有弱 VMO 句柄ZX_EVENTPAIR_PEER_CLOSED 应尽快关闭缓冲区。收到信号 缓冲区的所有强系统内存 VMO 很快就会关闭 (包括通过强有力的BufferCollectionToken或 强 BufferCollection)。未能关闭所有弱系统 VMO 在 ZX_EVENTPAIR_PEER_CLOSED 发生后快速处理缓冲区 被视为因客户端仍保持较弱的系统系统而导致 VMO 泄露 VMO 会处理并导致系统对日志发出很大的投诉。通过 可以单独释放集合的缓冲区。通过 ZX_EVENTPAIR_PEER_CLOSED可能在 响应到达客户端客户端不准备处理 弱系统内存 VMO,在看到此字段设置时可以关闭所有句柄 缓冲区并使所有关联的请求失败。
  • 错误 [fuchsia.sysmem2/Error.NOT_FOUND] - vmo 不是系统内存 VMO。强和弱系统内存 VMO 都可以传递给此调用,并且 传入此调用本身的 VMO 句柄会保留 VMO 的信息 才能响应此调用。因此 ZX_ERR_NOT_FOUND 错误不会含糊不清(即使 调用 VMO 的句柄;即使其他标识名已关闭 在 GetVmoInfo 响应到达客户端之前)。
  • 错误[fuchsia.sysmem2/Error.HANDLE_ACCESS_DENIED]vmo 不是 能够与 GetVmoInfo 搭配使用(因为拥有相关权利/功能) 该 VMO 需要能够与 zx_vmo_get_info 配合使用,且 主题 ZX_INFO_HANDLE_BASIC
  • 错误 [fuchsia.sysmem2/Error.UNSPECIFIED] 对于 未指明的原因。如需了解详情,请参阅日志。
  • 错误 [fuchsia.sysmem2/Error.PROTOCOL_DEVIATION]vmo 字段 或者请求字段存在其他问题。

请求

名称类型
payload AllocatorGetVmoInfoRequest

响应

名称类型
payload Allocator_GetVmoInfo_Result

SetDebugClientInfo

将有关 sysmem 可以使用的当前客户端的信息设置为 帮助诊断泄漏的内存和等待 发送 fuchsia.sysmem2/BufferCollection.SetConstraints

这会在所有 fuchsia.sysmem2/Node 上设置调试客户端信息 由这个fuchsia.sysmem2/分配器创建。 包括通过fuchsia.sysmem2BufferCollection fuchsia.sysmem2/Allocator.BindSharedCollection(在缺少 之前对 fuchsia.sysmem2/Allocator.SetDebugClientInfo 的任何调用, 这些BufferCollection与 上交令牌以创建 BufferCollection)。

随后,此信息可以按Node替换 发送 fuchsia.sysmem2/Node.SetDebugClientInfo

发送 fuchsia.sysmem2/Allocator.SetDebugClientInfo 一次 Allocator是确保所有 fuchsia.sysmem2/节点将至少包含一些调试客户端信息 而且比单独发送相同的调试信息更高效 通过 fuchsia.sysmem2/Node.SetDebugClientInfo 获取每个客户端信息 已创建 fuchsia.sysmem2/Node

  • 请求 name,可以是任意字符串,但当前 进程名称(请参阅 fsl::GetCurrentProcessName)是一个很好的默认值。
  • 请求 id 这可以是任意 ID,也可以是当前的进程 ID (请参阅 fsl::GetCurrentProcessKoid)是一个很好的默认值。

请求

名称类型
payload AllocatorSetDebugClientInfoRequest

ValidateBufferCollectionToken

检查 fuchsia.sysmem2/BufferCollectionToken 是否已知 sysmem 服务器。

通过此调用,客户端可以确定传入令牌是否为 系统内存服务器已知的真实 sysmem 令牌,不存在任何风险 无时无刻不等待可能虚假的令牌完成操作 fuchsia.sysmem2/BufferCollectionToken.DuplicateSyncfuchsia.sysmem2/BufferCollectionToken.Sync(或任何其他双向 FIDL 消息)。在客户端信任令牌来源的情况下 提供真实令牌, 调试。

如果验证有时会失败,但其他时间成功, 令牌本身可能没有调用 fuchsia.sysmem2/BufferCollectionToken.Syncfuchsia.sysmem2/BufferCollection.Sync(创建/复制 令牌,但在将令牌发送到当前客户端之前。可能 便于来源使用 要复制的 fuchsia.sysmem2/BufferCollectionToken.DuplicateSync 令牌,因为该调用已内置同步步骤。或者, 在系统处理此调用之前,收集可能失败 因为缓冲区收集失败会清理 sysmem 对 相关令牌。

此调用对任何令牌都没有任何影响。

  • 请求 token_server_koid 通道服务器端的 koid 可能是 BufferCollectionToken 渠道。这可以通过 经由zx_object_get_info ZX_INFO_HANDLE_BASIC related_koid
  • 响应 is_known true 表示系统内存当时知道令牌 系统内存处理了请求,但无法保证令牌 在客户端收到回复时仍然有效。功能 令牌至少是真实令牌, 对令牌的调用不会永久停止(会失败或公平成功) 而不是停滞不前)。如果 令牌的来源可以得到信任,以提供真实令牌。false 值表示 sysmem 在 sysmem 时不知道该令牌 处理了此调用,但令牌之前可能有效,或者 可能尚未生效。或者,如果令牌的发送者不受信任, 提供真实令牌,则该令牌可能是假的。我们的责任是 与 sysmem 同步,以确保 创建/复制的令牌在发送 传送给其他参与者。

请求

名称类型
payload AllocatorValidateBufferCollectionTokenRequest

响应

名称类型
payload Allocator_ValidateBufferCollectionToken_Result

BufferCollection

fuchsia.sysmem2/collection.fidl 中定义

fuchsia.sysmem2/BufferCollection 是直接从 系统启动的缓冲区收集;缓冲区收集 与拥有自己的BufferCollection的其他参与者共享 与同一缓冲区集合关联的客户端。也就是说, BufferCollection 接口的实例是缓冲区的视图 而不是缓冲区集合本身。

存在 BufferCollection 连接以便异步指示 当缓冲区集合已填充缓冲区时。

此外,系统内存服务器关闭通道可指示 客户端应关闭从 BufferCollection

某些缓冲区集合可能会占用足够的内存,因此值得避免使用 分配重叠(时间上)使用 fuchsia.sysmem2/BufferCollection.AttachLifetimeTracking 以便接收 发起者可以判断是否已获得缓冲区集合的足够缓冲区 在启动器分配新的缓冲区集合之前完全取消分配。

此协议不使用墓碑。

添加时间:19

AttachLifetimeTracking

设置事件对,以便在发生以下情况时发出信号 (ZX_EVENTPAIR_PEER_CLOSED) 缓冲区,且只有指定数量的缓冲区(或者 较少的内容)保留在缓冲区集合中。

fuchsia.sysmem2/BufferCollection.AttachLifetimeTracking 允许接收 等待旧缓冲区收集全部或大部分时间 然后再尝试分配新的缓冲区集合。通过 只有当其他缓冲区已完全加载和/或播放完毕时, 取消分配(不仅是客户端取消引用,而是所有内存资源 已完全回收/回收),或 树或子树的分配或逻辑分配失败,包括 此 fuchsia.sysmem2/BufferCollection

在分配或逻辑分配之前,事件对不会发出信号 已完成;该集合的当前缓冲区计数为 已忽略。

如果附加的子树的逻辑分配失败(使用 fuchsia.sysmem2/BufferCollection.AttachToken), 事件对会在该失败期间关闭 缓冲区有可能在整个缓冲区集合中分配。这是 以确保逻辑分配与正常分配保持一致。

由此事件发出的生命周期包括对 分配的缓冲区,并且这种异步清理只能在所有 缓冲区的 VMO 句柄的持有者已关闭这些 VMO 句柄。 因此,客户端应小心谨慎,以免被永久屏蔽 如果 ZX_EVENTPAIR_PEER_CLOSED 有任何 使用逻辑缓冲区集合的参与者的可信度较低或 可靠性降低。未能分配新的/替换缓冲区集合 总比被困住要好得多。

此机制旨在与具有 类似的 AttachLifetimeTracking 消息;相同的条目 eventpair 句柄(服务器端)可通过多个 AttachLifetimeTracking 消息发送到不同的协议,而 ZX_EVENTPAIR_PEER_CLOSED 当所有 所有重复关键字 服务器端句柄。此外,由于事件对端点的工作原理, 可在不阻止 ZX_EVENTPAIR_PEER_CLOSED 信号。

服务器故意不“信任”信号 server_end。该机制有意仅使用 ZX_EVENTPAIR_PEER_CLOSED:无法“提前”设置,且只设置 当服务器端事件对的所有句柄都关闭时触发。“无意义” 与任何其他信号相关联,客户端应忽略所有信号, eventpair 任意一端的其他信号位。

server_end 可能缺少 ZX_RIGHT_SIGNALZX_RIGHT_SIGNAL_PEER, 但必须包含 ZX_RIGHT_DUPLICATE(且必须有 ZX_RIGHT_TRANSFER 到 则不会导致 BufferCollection 信道故障)。

目前,所有表字段均为必填字段。

  • 请求 server_end 此事件对句柄将由 系统内存服务器, 缓冲区数量小于或等于 buffers_remaining
  • 请求 buffers_remaining 等待除 buffers_remaining 以外的所有请求(或者 需要完全取消分配的缓冲区。大于零的数字可以 在已知数量的缓冲区 以便继续使用数据 例如在界面中显示上一个可用的视频帧 即使视频流使用的是受保护的输出缓冲区也是如此。时间是 超出了 BufferCollection 接口的范围(至少对于 现在)来确定可以在不关闭的情况下持有的缓冲区数量,但是 该值通常介于 0-2 之间。

请求

名称类型
payload BufferCollectionAttachLifetimeTrackingRequest

AttachToken

创建新令牌,将新参与者添加到现有逻辑 缓冲区收集,如果现有集合的缓冲区计数, 且参与者允许。

这对于替换失败的参与者和/或 缓冲结束后添加/重新添加参与者 已分配。

使用 fuchsia.sysmem2/BufferCollection.AttachToken 时,子 位于附加的 fuchsia.sysmem2/BufferCollectionToken 的树 会按照常规流程设置限制条件或 fuchsia.sysmem2/Node 上,然后出现从 客户的尽管所有缓冲区都有可能 之前实际分配的这个过程称为“逻辑” 分配”。“分配”的大多数实例其他消息的文档 也可理解为“分配或逻辑分配”而 但我们在这里只说“分配”在大多数地方都是为了简洁/简洁 以及“逻辑分配”的详细信息剩余时间 请参阅 AttachToken 上的文档。

附加的 Node 失败不会传播到 已附加“Node”。更常见的情况是,子级 Node 的失败会被屏蔽 如果子级已附加,则它不会到达其父级 Node,或者 子项是可判的,且故障在逻辑分配后发生 (请参阅 fuchsia.sysmem2/BufferCollectionToken.SetDispensable)。

在某些情况下,参与者可能会选择先使用 为委托参与者的指定实例分配的令牌,以及 之后,如果该受托参与者的第一个实例失败, 该委托参与者在新的第二例中,我会收到一个令牌 使用 AttachToken 创建。

fuchsia.sysmem2/BufferCollectionToken 的角度来看 令牌的作用与任何其他令牌相同。客户端可以 根据需要使用 fuchsia.sysmem2/BufferCollectionToken.Duplicate 令牌。 并且可以将令牌发送给其他进程/参与者。通过 BufferCollectionToken Node 应转换为 BufferCollection Node照常发送 fuchsia.sysmem2/Allocator.BindSharedCollection,或者可以关闭 在不会导致子树故障的情况下 fuchsia.sysmem2/BufferCollectionToken.Release。假设前者, fuchsia.sysmem2/BufferCollection.SetConstraints 消息或 fuchsia.sysmem2/BufferCollection.Release 消息应发送到 BufferCollection

在子树中, fuchsia.sysmem2/BufferCollection.WaitForAllBuffersAllocated 表示 子树参与者的使用 已有缓冲区收集,则已建立的 fuchsia.sysmem2/BufferCollectionInfo(包括映像格式) 以及现有的其他参与者(已添加 通过成功的逻辑分配)及其指定的缓冲区计数, 存在的局限性失败结果意味着新参与者的 限制来满足使用现有缓冲区集合的要求,并且 已经添加的参与者。您可以改为创建新集合 允许所有参与者的要满足约束条件,假设 SetDispensable 代替 AttachToken,或常规令牌 。

使用 AttachToken 创建的令牌通过 当前对缓冲区收集有效的所有约束条件,加上 正在考虑的附加令牌加上附件下的子令牌 令牌本身不是附加的令牌,也不在此类令牌之下。 此子树下的其他子树被视为逻辑树 分配。

将现有缓冲区分配给参与者 fuchsia.sysmem2/BufferCollectionConstraints.min_buffer_count_for_camping 等采用先到先得的原则,但子级无法在逻辑上分配 在其所有父级都发送 SetConstraints 之前。

另请参阅 fuchsia.sysmem2/BufferCollectionToken.SetDispensable, 与 AttachToken 不同,创建的令牌为 Node + 子代 Node(s)(位于已创建的子树中,但不在此其下的任何子树中) 子树)与其父项一起参与约束条件聚合 父实体的分配或逻辑分配期间发生的事件。

fuchsia.sysmem2/BufferCollectionToken.Duplicate 类似, 新创建的令牌需要 fuchsia.sysmem2/Node.Sync 才能 sysmem,才能将新令牌传递给 BindSharedCollection。通过 Sync 的新令牌可通过 转换已创建的 fuchsia.sysmem2/BufferCollection.Sync 后, BufferCollectionToken 转换为 BufferCollection。此外, 还针对新令牌设置了 fuchsia.sysmem2/BufferCollectionToken.Sync 工作。或使用 fuchsia.sysmem2/BufferCollectionToken.DuplicateSync 工作。像往常一样,BufferCollectionToken.Sync 可在任何 BufferCollectionToken.Duplicate邮件已通过新的 将这些额外的令牌同步到 sysmem,方法是使用 单程往返。

目前,所有表字段均为必填字段。

  • 请求 rights_attentuation_mask。这样可降低 VMO 子树的权利。这些“rights_attenuation_mask”的值 不会减弱(请注意,此列表中不包含 0): <ph type="x-smartling-placeholder">
      </ph>
    • ZX_RIGHT_SAME_RIGHTS(首选)
    • 0xFFFFFFFF(在计算衰减掩码时这很合理)
  • 请求 token_request BufferCollectionToken 的服务器端 。客户端保留客户端。

请求

名称类型
payload BufferCollectionAttachTokenRequest

CheckAllBuffersAllocated

在轮询中检查是否分配了所有缓冲区 。

添加时间:HEAD

请求

<空>

响应

名称类型
payload BufferCollection_CheckAllBuffersAllocated_Result

GetBufferCollectionId

获取缓冲区集合 ID。此 ID 也可从 fuchsia.sysmem2/Allocator.GetVmoInfo(以及 buffer_index) )。

此通话主要在以下情形下非常有用: fuchsia.sysmem2/BufferCollectionTokenfuchsia.sysmem2/BufferCollection,但只能传输 VMO 句柄,该句柄可与 BufferCollection 客户端端重新联接起来 通过其他路径创建的 ID。更希望通过 BufferCollectionTokenBufferCollection(如果可行)。

信任 sysmem 以外的来源的 buffer_collection_id 值 类似于信任锆石之外的其他来源的 Koid 值。 除非确实有必要,否则都应该避免同时使用这两种方法,并且都要求 注意。在某些情况下,引用 BufferCollectionbuffer_collection_id通过 但传入的值声称 仅凭 buffer_collection_id 不足以证明授予 buffer_collection_id 任意功能的发送端。发件人必须 先向接收者证明发送者有/有 VMO,或者有/有 BufferCollectionToken。 sysmem 确认是否是有效的 sysmem 句柄,以及哪个 sysmem 映射到 buffer_collection_id 值。接收方应小心避免 假设发送者有 BufferCollectionToken,且 因为发送方仅能证明其有 VMO。

  • 响应 buffer_collection_id 此 ID 在每个缓冲区中是唯一的 每次启动时收集。每个缓冲区均由 同时使用 buffer_collection_idbuffer_index

请求

<空>

响应

名称类型
payload Node_GetBufferCollectionId_Result

GetNodeRef

这会获取一个句柄 在任何设备上调用 fuchsia.sysmem2/Node.IsAlternateFor fuchsia.sysmem2/Node。此标识名仅用于证明 客户端已从此 Node 获取此标识名。

由于这是 get 设置,因此没有 fuchsia.sysmem2/Node.Sync GetNodeRefIsAlternateFor 调用之间所需的函数, 尽管这两个调用通常在不同的渠道上进行,

另请参阅 fuchsia.sysmem2/Node.IsAlternateFor

目前,所有表字段均为必填字段。

  • 响应 node_ref 此句柄可通过 IsAlternateFor 不同的 Node 频道,用于证明客户端获得了标识名 来自此Node

请求

<空>

响应

名称类型
payload Node_GetNodeRef_Result

IsAlternateFor

检查调用方 fuchsia.sysmem2/Node 是否在子树中 根植于共同父标记的不同子标记 fuchsia.sysmem2/BufferCollectionTokenGroup 传入 node_ref

此通话用于协助执行准入控制去重,以及 以及调试。

node_ref 必须使用 fuchsia.sysmem2/Node.GetNodeRef

node_ref 可以是重复的句柄;因此无需调用 每次调用 fuchsia.sysmem2/Node.IsAlternateFor 时返回 GetNodeRef

如果调用令牌由于 可能是恶意/不受信任的令牌提供程序,调用 fuchsia.sysmem2/Allocator.ValidateBufferCollectionToken 而不是在发生 IsAlternateFor 时无限期卡住 由于调用令牌不是真正的令牌(并非真正的令牌), 与 sysmem 通信)。另一种方法是 fuchsia.sysmem2/Allocator.BindSharedCollection 中包含此令牌 这也会验证令牌并将其转换为 fuchsia.sysmem2/BufferCollection,然后调用 IsAlternateFor

目前,所有表字段均为必填字段。

  • 回答 is_alternate <ph type="x-smartling-placeholder">
      </ph>
    • true:调用节点和 node_ref Node 是一个 BufferCollectionTokenGroup。这意味着 发起调用的 Nodenode_ref Node 不会同时具有两者 其约束条件适用,而 sysmem 会选择其中一种 约束条件 - 不能两者都选。这是因为 在逻辑期间选择了 BufferCollectionTokenGroup 并且只有一个子树的子树促成 约束汇总。
    • false:调用方 Node 之间共有的第一个父节点 并且 node_ref Node 不是 BufferCollectionTokenGroup。 目前,这意味着共同的第一个父节点是 BufferCollectionTokenBufferCollection(无论是否为 Releaseed)。这意味着,调用的 Nodenode_ref Node 在约束条件期间可能同时应用这两个约束条件 逻辑分配的聚合(如果两个 Node 都符合) 由所涉及的任何父级BufferCollectionTokenGroup选择。在 在此示例中,没有任何 BufferCollectionTokenGroup 可 直接阻止两个 Node 同时被选中并 它们的约束条件都已汇总,但即使值为 false,也可以将其中一个或两个都汇总 如果其中有一项或两项,Node仍有可能被排除在考虑范围外 Node有直接或间接父级 BufferCollectionTokenGroup,用于选择另一个子子树 与包含调用 Nodenode_ref Node 的子树相比。
  • 错误 [fuchsia.sysmem2/Error.NOT_FOUND] node_ref 不是 与调用 Node 的缓冲区集合相关联。 导致此错误的另一个原因是,如果 node_refzx.Handle.EVENT 处理具有足够的权限,但实际上并不是 从 GetNodeRef 获得的实 node_ref
  • 错误 [fuchsia.sysmem2/Error.PROTOCOL_DEVIATION] 调用方传递了 node_ref 不是 zx.Handle:EVENT 句柄,或者不是 所需的权利。node_ref
  • 此调用不会返回其他失败的状态代码。不过, sysmem 将来可能会添加其他代码,因此客户端应该 对任何失败的状态代码进行合理的默认处理。

请求

名称类型
payload NodeIsAlternateForRequest

响应

名称类型
payload Node_IsAlternateFor_Result

版本

fuchsia.sysmem2/BufferCollectionToken 通道上:

通常,参与者会将 BufferCollectionToken 转换为 fuchsia.sysmem2/BufferCollection,但参与者可以改为发送 Release(然后立即关闭渠道,或者 稍后响应服务器关闭服务器端), 以免导致缓冲区收集失败。如果没有之前的 Release, 关闭 BufferCollectionToken 客户端会导致缓冲 收集失败。

fuchsia.sysmem2/BufferCollection 通道上:

默认情况下,服务器会处理 fuchsia.sysmem2/BufferCollection 客户端端(不含 Release) 首先)使缓冲区收集失败。在一定程度上是为了加快 当有任何参与者失败时,关闭 VMO 句柄以回收内存。如果 参与者想要在没有BufferCollection 导致缓冲区收集失败,参与者可以发送 Release 然后再关闭 BufferCollection 客户端。Release可以 发生在 SetConstraints 之前或之后。如果早于 SetConstraints, 缓冲区收集不需要此节点的约束即可 分配。如果晚于 SetConstraints,系统会保留约束条件, 尽管在 BufferCollection 约束汇总时间。

fuchsia.sysmem2/BufferCollectionTokenGroup 通道上:

默认情况下,BufferCollectionTokenGroup 客户端意外关闭 end(先没有 Release)会导致缓冲区故障 。在不采用任何规则的情况下关闭 BufferCollectionTokenGroup 渠道 缓冲区收集失败,请确保已对 AllChildrenPresent() 执行 已发送,并在关闭BufferCollectionTokenGroup前发送 Release 客户端。

如果 Release 出现于 [fuchsia.sysmem2/BufferCollectionTokenGroup.AllChildrenPresent], the buffer collection will fail (triggered by reception of 释放without priorAllChildrenPresent). This is intentionally not analogous to how <a class='link' href='../fuchsia.sysmem2/'>fuchsia.sysmem2</a>/<a class='link' href='../fuchsia.sysmem2/#BufferCollection.Release'>BufferCollection.Release</a> without <a class='link' href='../fuchsia.sysmem2/'>fuchsia.sysmem2</a>/<a class='link' href='../fuchsia.sysmem2/#BufferCollection.SetConstraints'>BufferCollection.SetConstraints</a> first doesn't cause buffer collection failure. For a BufferCollectionTokenGroup, clean close requires AllChildrenPresent(if not already sent), then Release`,然后关闭客户端。

如果 Release 发生在 AllChildrenPresent 之后,则子项和所有 其约束条件保持不变(就像如果 BufferCollectionTokenGroup 渠道仍保持打开状态),且客户端 结束关闭不会导致缓冲区收集失败。

在所有 fuchsia.sysmem2/Node 通道上(上述任何一种):

为简单起见,上文中针对每频道协议的段落会忽略 一个单独的故障域 fuchsia.sysmem2/BufferCollectionToken.SetDispensablefuchsia.sysmem2/BufferCollection.AttachToken。当客户端结束 意外关闭(没有先 Release),且客户端是 而不是使整个缓冲区收集失败 表示故障域失败,但缓冲区收集本身 与故障域故障隔离开来此类故障域 嵌套,在这种情况下,只有最内层的故障域 Node 驻留失败。

请求

<空>

SetConstraints

向缓冲区提供 fuchsia.sysmem2/BufferCollectionConstraints

参与者只能通话 fuchsia.sysmem2/BufferCollection.SetConstraints,最多一次 fuchsia.sysmem2/BufferCollection

要尝试分配缓冲区, BufferCollection 客户端需要先调用 SetConstraints,然后再调用 sysmem 将尝试分配缓冲区。

  • 请求 constraints。这些是对缓冲区的约束条件 由发送客户/参与者强加的数据收集。通过 无需设置 constraints 字段。如果未设置,客户端 没有设置任何实际限制条件,但表示 无需设置任何限制条件。未设置 constraints 字段不会收到任何 VMO 句柄,但仍然可以找到 分配了多少个缓冲区,并且仍然可以通过 buffer_index

请求

名称类型
payload BufferCollectionSetConstraintsRequest

SetDebugClientInfo

将有关 sysmem 可以使用的当前客户端的信息设置为 帮助诊断泄漏的内存和等待 发送 fuchsia.sysmem2/BufferCollection.SetConstraints

这会在此 fuchsia.sysmem2/Node 和所有节点上设置调试客户端信息。 Node派生自此Node,除非被 fuchsia.sysmem2/Allocator.SetDebugClientInfo 或更高版本 fuchsia.sysmem2/Node.SetDebugClientInfo

发送 fuchsia.sysmem2/Allocator.SetDebugClientInfo 一次 Allocator是确保所有 fuchsia.sysmem2/节点将至少包含一些调试客户端信息 而且比单独发送相同的调试信息更高效 通过 fuchsia.sysmem2/Node.SetDebugClientInfo 获取每个客户端信息 已创建 fuchsia.sysmem2/Node

也在启用详细日志记录功能(请参阅 SetVerboseLogging)时使用,用于 指明哪个客户最先关闭其渠道,从而转到子树 失败(如果子树的用途已过,这是正常现象,但 如果发生时间早于预期,则客户端渠道专用名称 帮助诊断故障最初来自何处 )。

目前,所有表字段均为必填字段。

  • 请求 name,可以是任意字符串,但当前 进程名称(请参阅 fsl::GetCurrentProcessName)是一个很好的默认值。
  • 请求 id 这可以是任意 ID,也可以是当前的进程 ID (请参阅 fsl::GetCurrentProcessKoid)是一个很好的默认值。

请求

名称类型
payload NodeSetDebugClientInfoRequest

SetDebugTimeoutLogDeadline

如果未检测到 sysmem,系统会记录警告 所有客户端的 fuchsia.sysmem2/BufferCollection.SetConstraints

客户端可以调用此方法来更改输出日志的时间。如果 多个客户端设置了截止时间,但未指定哪个截止期限 生效。

在大多数情况下,使用默认值即可。

目前,所有表字段均为必填字段。

  • 请求 deadline:系统内存开始尝试记录日志的时间 除非那时所有限制条件都与 sysmem 相关,否则系统会返回该警告。

请求

名称类型
payload NodeSetDebugTimeoutLogDeadlineRequest

SetName

为此缓冲区集合中的 VMO 设置名称。

如果名称在 ZX_MAX_NAME_LEN 中容纳不下,vmo 本身的名称 将被截断为适合大小。vmo 的名称将以 集合中的缓冲区索引(如果后缀适合放在 ZX_MAX_NAME_LEN).此处指定的名称(不截断)将 。

名称只会影响设置名称后分配的 VMO;这场通话 不会重命名现有 VMO。如果多个客户设置了不同的名称 则较大的优先级值将胜出使用 与先前名称相同优先级不会更改名称。

目前,所有表字段均为必填字段。

  • 请求 priority。仅当这是第一个 SetName 时,才会设置名称 或者如果 priority 大于任何之前 priority 的值 此缓冲区集合的所有 Node 之前的 SetName 调用。
  • request name 在此缓冲区集合下创建的 VMO 的名称。

请求

名称类型
payload NodeSetNameRequest

SetVerboseLogging

这会为缓冲区收集启用详细日志记录功能。

详细日志记录包括通过 每个客户端的 fuchsia.sysmem2/BufferCollection.SetConstraints 以及通过 fuchsia.sysmem2/Node.SetDebugClientInfo(或 fuchsia.sysmem2/Allocator.SetDebugClientInfoNode 的树。

通常,在汇总时,系统仅输出一行投诉 仅显示汇总失败的具体详细原因 几乎不需要周围的上下文。虽然这通常足以诊断问题 如果只进行了细微的更改并且一切正常,就会出现问题 在进行这项小更改之前 这通常不是特别有用 新的缓冲区集合。尤其是 更为复杂的节点树,涉及 fuchsia.sysmem2/BufferCollection.AttachTokenfuchsia.sysmem2/BufferCollectionToken.SetDispensablefuchsia.sysmem2/BufferCollectionTokenGroup 节点以及 详细日志记录可能有助于诊断节点的 原因、为什么逻辑分配失败, 子树的失败时间早于预期。

额外记录的目的是为了能在演出中获得 这一假设,假设仅启用了详细日志记录功能 。如果不跟踪错误 我们不应发送此消息。

请求

<空>

SetWeak

设置当前 fuchsia.sysmem2/Node 和所有子级 Node 弱,这意味着客户端的 Node 客户端(或此消息后创建的子级)并不孤单 使分配的 VMO 保持活跃状态。

从安全系数低的“Node”获取的所有 VMO 都是安全系数低的系统 VMO。另请参阅 close_weak_asap

系统只允许在Node准备好以下数据之前发送此消息: 分配(否则,服务器使用 ZX_ERR_BAD_STATE 关闭通道):

  • BufferCollectionToken:任何时间
  • BufferCollectionSetConstraints之前
  • BufferCollectionTokenGroupAllChildrenPresent之前

目前,在就绪后,未从强Node转换为弱Node 但客户端可以创建 在分配和设置该额外值之前,额外指定 Node Node 转换为弱 Release 并关闭客户端强 Node 的客户端,但是 保留客户端的弱 Node

零强 Node 和零强 VMO 句柄将导致缓冲区 收集失败(所有 Node 个客户端都将看到 ZX_CHANNEL_PEER_CLOSED以及全部 close_weak_asapclient_end将会 看到 ZX_EVENTPAIR_PEER_CLOSED,但 sysmem(有意)不会注意到 这种情况,直到所有 Node 都做好分配准备。对于 才能成功分配,至少要存在一个强 Node 但在该客户端收到 VMO 句柄之后, 客户端可以 BufferCollection.Release 并关闭客户端,而不用 导致此类故障。

这也暗示了 fuchsia.sysmem2/Node.SetWeakOk,但不意味着 暗示 SetWeakOkfor_children_also true,这可以发送 视情况进行单独调整。

请求

<空>

SetWeakOk

这可告知系统,客户端已准备好关注 close_weak_asap

如果发送,此邮件必须早于 fuchsia.sysmem2/BufferCollection.WaitForAllBuffersAllocated

所有使用弱 fuchsia.sysmem2/BufferCollection 的参与者都必须 请在 WaitForAllBuffersAllocated之前发送此消息,或者让家长发送此消息 Node 必须发送 fuchsia.sysmem2/Node.SetWeakOk 以及 for_child_nodes_also true,否则 WaitForAllBuffersAllocated 将 触发缓冲区收集失败。

此消息必不可少,因为系统并非总是 老客户没有意识到需要关注 close_weak_asapZX_EVENTPAIR_PEER_CLOSED并关闭所有剩余项 sysmem 弱 VMO 会尽快处理。收到此消息并要求 表明他们接受总体评分的这一方面, 因此会避免旧版客户端收到信号较弱的情况 VMO 无法让 sysmem 以任何方式使该 VMO 稍后快速关闭 (并且基于每个缓冲区)。

不处理 close_weak_asap 和也不处理的参与者 通过 WaitForAllBuffersAllocated 检索任何 VMO 句柄,不需要 发送 SetWeakOk(不需要让父级发送 NodeSetWeakOkfor_child_nodes_also 为 true)。但是,如果 同一参与者有一个检索 VMO 的子项/委托, 子级/受托人需要提前发送 SetWeakOk WaitForAllBuffersAllocated

  • 请求 for_child_nodes_also 如果存在且 true,则表示直接 在此消息之后创建的该节点的子节点以及所有子节点 这些节点的后代的行为将如同 SetWeakOk 这些节点在此节点之前创建的任何子节点 消息。此设置是“固定的” 不含此布尔值且设置为 true 的后续 SetWeakOk 不会重置 服务器端布尔值。如果这会给参与者带来问题, 解决方法是对子级执行 SetWeakOk 并将 for_child_nodes_also 设为 true 令牌。参与者只能设置 for_child_nodes_also:如果参与者确实能够承诺 针对其自身较弱的 VMO 句柄,遵循 close_weak_asap,并且 参与者持有相应子节点的 VMO 句柄持有较弱的 VMO 句柄 Node。设置 for_child_nodes_also 后,后代 Node 使用 sysmem(1) 的容器可能较弱,尽管它们的客户端 sysmem1 Node 无法通过任何直接方式连接到 SetWeakOk 或任何 了解 close_weak_asap 的直接方式。这仅适用于 使用 sysmem(1) 的此 Node 的后代,而不是此 直接从 sysmem2 令牌转换为 sysmem(1) 时为 Node 令牌,除非此 Node 的祖先实体,否则会导致分配失败 指定的 for_child_nodes_also 为 true。

请求

名称类型
payload NodeSetWeakOkRequest

同步

确保之前的邮件已在服务器端收到。这是 在之前有创建新令牌的消息之后, 因为在发送 将令牌发送给其他参与者。

对符合以下条件的令牌调用 fuchsia.sysmem2/BufferCollectionToken.Sync: 不是/不是有效令牌,可能会导致 Sync 永久停止。请参阅 fuchsia.sysmem2/Allocator.ValidateBufferCollectionToken(单向) 降低恶意/仿冒攻击的可能性 fuchsia.sysmem2/BufferCollectionToken,需支付一次往返的费用。 另一种方法是将令牌传递给 fuchsia.sysmem2/Allocator/BindSharedCollection,该集合还会验证 作为交换 fuchsia.sysmem2/BufferCollection 渠道,以及 然后可以放心地使用 fuchsia.sysmem2/BufferCollection.Sync 出现卡顿。

创建一个或多个 fuchsia.sysmem2/BufferCollectionToken 后 然后启动并完成Sync,就可以放心地将 BufferCollectionToken客户端结束给知道 其他服务器在发送令牌时 发送到系统内存的 fuchsia.sysmem2/Allocator.BindSharedCollection 消息。这是一个 创建令牌的高效方法,同时避免不必要的往返。

其他选项包括等待每个 fuchsia.sysmem2/BufferCollectionToken.Duplicate 需要完成 单独调用(在每个后面单独调用 Sync),或者调用 fuchsia.sysmem2/BufferCollection.Sync 令牌 已通过以下方式转换为BufferCollectionfuchsia.sysmem2/Allocator.BindSharedCollection 或使用 fuchsia.sysmem2/BufferCollectionToken.DuplicateSync,其中包含 可以一次创建多个令牌

请求

<空>

响应

名称类型
payload Node_Sync_Result

WaitForAllBuffersAllocated

等待所有缓冲区分配完毕。

此 FIDL 调用在缓冲区分配完成时或完成时完成 以及一些失败详情。

在分配缓冲区之前必须发生以下情况:

  • 结果 buffer_collection_info。VMO 处理 信息。
  • 错误 [fuchsia.sysmem2/Error.NO_MEMORY] 请求有效, 无法完成。
  • 错误 [fuchsia.sysmem2/Error.PROTOCOL_DEVIATION] 请求 格式错误。
  • 错误 [fuchsia.sysmem2/Error.CONSTRAINTS_INTERSECTION_EMPTY] 请求有效但无法得到满足,可能是由于硬件 限制。如果参与者与 Google 员工不兼容, 约束条件(大致来说就是空的交集)。请参阅 。在参与者可能会受到治疗的情况下 (可选),请参阅 BufferCollectionTokenGroup。使用 fuchsia.sysmem2/BufferCollection.AttachToken,作为 如果既有缓冲区内又没有足够的缓冲区, 来满足附加的令牌设置的约束条件, 从附加的令牌派生的任何令牌子树。

请求

<空>

响应

名称类型
payload BufferCollection_WaitForAllBuffersAllocated_Result

BufferCollectionToken

fuchsia.sysmem2/collection.fidl 中定义

fuchsia.sysmem2/BufferCollectionToken 不是缓冲区集合,但 而是一种识别特定的潜在共享缓冲区集合的方法, 以及将潜在的共享缓冲区集合分发到 额外参与者,然后再分配任意对象。 缓冲区。

此协议不使用墓碑。

我们为 BufferCollectionToken 使用通道,而不是单个通道 eventpair(配对),因为这样我们可以检测出错误情况,例如 创建失败。

添加时间:19

CreateBufferCollectionTokenGroup

在一组令牌(称为 fuchsia.sysmem2/BufferCollectionTokenGroup

大多数系统内存客户端和许多参与者不需要关注这一点 消息或关于BufferCollectionTokenGroup的内容。但在某些情况下 参与者想要添加一组受托人 但如果这些约束条件无法以这种方式成功组合, 会回退到一组不同的(可能重叠)委托 和/或采用要求较低的策略(就 fuchisa.sysmem2/BufferCollectionConstraints 的严格程度如何? 所有相关的受托人参与测试)。在这种情况下, BufferCollectionTokenGroup 非常有用。

BufferCollectionTokenGroup 用于创建 N 的 1 或 N 子级 fuchsia.sysmem2/BufferCollectionToken。子令牌 在聚合过程中未选择的选项将失败(关闭), 潜在参与者应该注意自己的BufferCollection 通道客户端端点看到 PEER_CLOSED,从而允许参与者 清理最终没有发生的推测性使用行为(这是 类似于正常的 BufferCollection 服务器端在失败时关闭 分配逻辑缓冲区集合,或之后缓冲区异步失败 集合)。

请参阅关于 BufferCollectionTokenGroup 协议的注释。

任何rights_attenuation_maskAttachToken/SetDispensable 只需编写一个 BufferCollectionToken 作为 BufferCollectionTokenGroup

目前,所有表字段均为必填字段。

  • 请求 group_request 请求的服务器端 BufferCollectionTokenGroup 个频道。

请求

名称类型
payload BufferCollectionTokenCreateBufferCollectionTokenGroupRequest

复制

在此基础上创建一个额外的 fuchsia.sysmem2/BufferCollectionToken 一个,表示同一个缓冲区集合。

创建的令牌是该令牌的 fuchsia.sysmem2/节点层次结构。

此方法可用于添加参与者,方法是转移新的 将创建的令牌发送给其他参与者。

可以使用此单向消息来代替双向消息 fuchsia.sysmem2/BufferCollectionToken.DuplicateSync FIDL 调用 您并不希望等待这些实例 要响应的系统 fuchsia.sysmem2/BufferCollectionToken.DuplicateSync,或者 客户端代码的结构不健全,因此无法轻松复制所有必要的 一次性令牌。

在发送一条或多条 Duplicate 消息之后、发送 将新创建的子令牌提供给其他参与者(或其他参与者), fuchsia.sysmem2/Allocator 通道进行连接),客户端必须发送 fuchsia.sysmem2/Node.Sync 并等待 Sync 响应。通过 可以对令牌或 BufferCollection 进行 Sync 调用 (通过将此令牌传递给 BindSharedCollection 获得)。两者 确保服务器知道通过 Duplicate 创建的令牌 其他参与者通过单独的命令将令牌发送到服务器之前, Allocator频道。

所有令牌都必须通过 fuchsia.sysmem2/Allocator.BindSharedCollectionfuchsia.sysmem2/Node.Release(对于 BufferCollection ) 成功分配缓冲区。

目前,所有表字段均为必填字段。

  • 请求 rights_attenuation_mask 中 可通过 客户端结束token_request。这样,发起者或 以表明 受托人。这不允许参与者获得权利 应用。值 ZX_RIGHT_SAME_RIGHTS 用于指定 。
    • 以下为 Rights_attenuation_mask 值不会导致衰减: <ph type="x-smartling-placeholder">
        </ph>
      • ZX_RIGHT_SAME_RIGHTS(首选)
      • 0xFFFFFFFF(如果衰减掩码 计算)
      • 0(已弃用 - 请勿使用 0 - 错误会记录到日志)
  • 请求 token_requestBufferCollectionToken 的服务器端 。此渠道的客户端是 共享缓冲区集合。

请求

名称类型
payload BufferCollectionTokenDuplicateRequest

DuplicateSync

据此创建其他 fuchsia.sysmem2/BufferCollectionToken 一个,表示同一个缓冲区集合。

创建的令牌在 fuchsia.sysmem2/节点层次结构。

此方法可用于添加更多参与者,方法是将 将新创建的令牌发送给其他参与者。

系统将为 rights_attenuation_masks 数组。

如果由于请求原因,调用的令牌实际上可能不是有效令牌, 可能是恶意/不可信的令牌提供商,请考虑使用 fuchsia.sysmem2/Allocator.ValidateBufferCollectionToken 而不是在发生问题时 fuchsia.sysmem2/BufferCollectionToken.DuplicateSync 始终不会响应 因为调用令牌不是真实令牌。

fuchsia.sysmem2/BufferCollectionToken.Duplicate 相反,没有 调用该方法后,需要单独的 fuchsia.sysmem2/Node.Sync 方法,因为同步步骤包含在此调用中,代价是 在此次通话期间往返。

必须通过 fuchsia.sysmem2/Allocator.BindSharedCollectionfuchsia.sysmem2/Node.Release(对于 BufferCollection ) 成功分配缓冲区(或在 包含 fuchsia.sysmem2/BufferCollectionToken.AttachToken

目前,所有表字段均为必填字段。

  • 请求 rights_attenuation_mask。在 rights_attenuation_masks,则不存在 0 的权利位 缓冲区 VMO 权利(可通过相应的返回内容获取) 令牌。这样,发起者或中间参与者可以 会削弱参与者的权利。因此,不允许 获得该参与者所不具备的权利。 值 ZX_RIGHT_SAME_RIGHTS 可用于指定 因此应该应用弱音
  • 响应 tokens 每个新创建的令牌的客户端结束。

请求

名称类型
payload BufferCollectionTokenDuplicateSyncRequest

响应

名称类型
payload BufferCollectionToken_DuplicateSync_Result

GetBufferCollectionId

获取缓冲区集合 ID。此 ID 也可从 fuchsia.sysmem2/Allocator.GetVmoInfo(以及 buffer_index) )。

此通话主要在以下情形下非常有用: fuchsia.sysmem2/BufferCollectionTokenfuchsia.sysmem2/BufferCollection,但只能传输 VMO 句柄,该句柄可与 BufferCollection 客户端端重新联接起来 通过其他路径创建的 ID。更希望通过 BufferCollectionTokenBufferCollection(如果可行)。

信任 sysmem 以外的来源的 buffer_collection_id 值 类似于信任锆石之外的其他来源的 Koid 值。 除非确实有必要,否则都应该避免同时使用这两种方法,并且都要求 注意。在某些情况下,引用 BufferCollectionbuffer_collection_id通过 但传入的值声称 仅凭 buffer_collection_id 不足以证明授予 buffer_collection_id 任意功能的发送端。发件人必须 先向接收者证明发送者有/有 VMO,或者有/有 BufferCollectionToken。 sysmem 确认是否是有效的 sysmem 句柄,以及哪个 sysmem 映射到 buffer_collection_id 值。接收方应小心避免 假设发送者有 BufferCollectionToken,且 因为发送方仅能证明其有 VMO。

  • 响应 buffer_collection_id 此 ID 在每个缓冲区中是唯一的 每次启动时收集。每个缓冲区均由 同时使用 buffer_collection_idbuffer_index

请求

<空>

响应

名称类型
payload Node_GetBufferCollectionId_Result

GetNodeRef

这会获取一个句柄 在任何设备上调用 fuchsia.sysmem2/Node.IsAlternateFor fuchsia.sysmem2/Node。此标识名仅用于证明 客户端已从此 Node 获取此标识名。

由于这是 get 设置,因此没有 fuchsia.sysmem2/Node.Sync GetNodeRefIsAlternateFor 调用之间所需的函数, 尽管这两个调用通常在不同的渠道上进行,

另请参阅 fuchsia.sysmem2/Node.IsAlternateFor

目前,所有表字段均为必填字段。

  • 响应 node_ref 此句柄可通过 IsAlternateFor 不同的 Node 频道,用于证明客户端获得了标识名 来自此Node

请求

<空>

响应

名称类型
payload Node_GetNodeRef_Result

IsAlternateFor

检查调用方 fuchsia.sysmem2/Node 是否在子树中 根植于共同父标记的不同子标记 fuchsia.sysmem2/BufferCollectionTokenGroup 传入 node_ref

此通话用于协助执行准入控制去重,以及 以及调试。

node_ref 必须使用 fuchsia.sysmem2/Node.GetNodeRef

node_ref 可以是重复的句柄;因此无需调用 每次调用 fuchsia.sysmem2/Node.IsAlternateFor 时返回 GetNodeRef

如果调用令牌由于 可能是恶意/不受信任的令牌提供程序,调用 fuchsia.sysmem2/Allocator.ValidateBufferCollectionToken 而不是在发生 IsAlternateFor 时无限期卡住 由于调用令牌不是真正的令牌(并非真正的令牌), 与 sysmem 通信)。另一种方法是 fuchsia.sysmem2/Allocator.BindSharedCollection 中包含此令牌 这也会验证令牌并将其转换为 fuchsia.sysmem2/BufferCollection,然后调用 IsAlternateFor

目前,所有表字段均为必填字段。

  • 回答 is_alternate <ph type="x-smartling-placeholder">
      </ph>
    • true:调用节点和 node_ref Node 是一个 BufferCollectionTokenGroup。这意味着 发起调用的 Nodenode_ref Node 不会同时具有两者 其约束条件适用,而 sysmem 会选择其中一种 约束条件 - 不能两者都选。这是因为 在逻辑期间选择了 BufferCollectionTokenGroup 并且只有一个子树的子树促成 约束汇总。
    • false:调用方 Node 之间共有的第一个父节点 并且 node_ref Node 不是 BufferCollectionTokenGroup。 目前,这意味着共同的第一个父节点是 BufferCollectionTokenBufferCollection(无论是否为 Releaseed)。这意味着,调用的 Nodenode_ref Node 在约束条件期间可能同时应用这两个约束条件 逻辑分配的聚合(如果两个 Node 都符合) 由所涉及的任何父级BufferCollectionTokenGroup选择。在 在此示例中,没有任何 BufferCollectionTokenGroup 可 直接阻止两个 Node 同时被选中并 它们的约束条件都已汇总,但即使值为 false,也可以将其中一个或两个都汇总 如果其中有一项或两项,Node仍有可能被排除在考虑范围外 Node有直接或间接父级 BufferCollectionTokenGroup,用于选择另一个子子树 与包含调用 Nodenode_ref Node 的子树相比。
  • 错误 [fuchsia.sysmem2/Error.NOT_FOUND] node_ref 不是 与调用 Node 的缓冲区集合相关联。 导致此错误的另一个原因是,如果 node_refzx.Handle.EVENT 处理具有足够的权限,但实际上并不是 从 GetNodeRef 获得的实 node_ref
  • 错误 [fuchsia.sysmem2/Error.PROTOCOL_DEVIATION] 调用方传递了 node_ref 不是 zx.Handle:EVENT 句柄,或者不是 所需的权利。node_ref
  • 此调用不会返回其他失败的状态代码。不过, sysmem 将来可能会添加其他代码,因此客户端应该 对任何失败的状态代码进行合理的默认处理。

请求

名称类型
payload NodeIsAlternateForRequest

响应

名称类型
payload Node_IsAlternateFor_Result

版本

fuchsia.sysmem2/BufferCollectionToken 通道上:

通常,参与者会将 BufferCollectionToken 转换为 fuchsia.sysmem2/BufferCollection,但参与者可以改为发送 Release(然后立即关闭渠道,或者 稍后响应服务器关闭服务器端), 以免导致缓冲区收集失败。如果没有之前的 Release, 关闭 BufferCollectionToken 客户端会导致缓冲 收集失败。

fuchsia.sysmem2/BufferCollection 通道上:

默认情况下,服务器会处理 fuchsia.sysmem2/BufferCollection 客户端端(不含 Release) 首先)使缓冲区收集失败。在一定程度上是为了加快 当有任何参与者失败时,关闭 VMO 句柄以回收内存。如果 参与者想要在没有BufferCollection 导致缓冲区收集失败,参与者可以发送 Release 然后再关闭 BufferCollection 客户端。Release可以 发生在 SetConstraints 之前或之后。如果早于 SetConstraints, 缓冲区收集不需要此节点的约束即可 分配。如果晚于 SetConstraints,系统会保留约束条件, 尽管在 BufferCollection 约束汇总时间。

fuchsia.sysmem2/BufferCollectionTokenGroup 通道上:

默认情况下,BufferCollectionTokenGroup 客户端意外关闭 end(先没有 Release)会导致缓冲区故障 。在不采用任何规则的情况下关闭 BufferCollectionTokenGroup 渠道 缓冲区收集失败,请确保已对 AllChildrenPresent() 执行 已发送,并在关闭BufferCollectionTokenGroup前发送 Release 客户端。

如果 Release 出现于 [fuchsia.sysmem2/BufferCollectionTokenGroup.AllChildrenPresent], the buffer collection will fail (triggered by reception of 释放without priorAllChildrenPresent). This is intentionally not analogous to how <a class='link' href='../fuchsia.sysmem2/'>fuchsia.sysmem2</a>/<a class='link' href='../fuchsia.sysmem2/#BufferCollection.Release'>BufferCollection.Release</a> without <a class='link' href='../fuchsia.sysmem2/'>fuchsia.sysmem2</a>/<a class='link' href='../fuchsia.sysmem2/#BufferCollection.SetConstraints'>BufferCollection.SetConstraints</a> first doesn't cause buffer collection failure. For a BufferCollectionTokenGroup, clean close requires AllChildrenPresent(if not already sent), then Release`,然后关闭客户端。

如果 Release 发生在 AllChildrenPresent 之后,则子项和所有 其约束条件保持不变(就像如果 BufferCollectionTokenGroup 渠道仍保持打开状态),且客户端 结束关闭不会导致缓冲区收集失败。

在所有 fuchsia.sysmem2/Node 通道上(上述任何一种):

为简单起见,上文中针对每频道协议的段落会忽略 一个单独的故障域 fuchsia.sysmem2/BufferCollectionToken.SetDispensablefuchsia.sysmem2/BufferCollection.AttachToken。当客户端结束 意外关闭(没有先 Release),且客户端是 而不是使整个缓冲区收集失败 表示故障域失败,但缓冲区收集本身 与故障域故障隔离开来此类故障域 嵌套,在这种情况下,只有最内层的故障域 Node 驻留失败。

请求

<空>

SetDebugClientInfo

将有关 sysmem 可以使用的当前客户端的信息设置为 帮助诊断泄漏的内存和等待 发送 fuchsia.sysmem2/BufferCollection.SetConstraints

这会在此 fuchsia.sysmem2/Node 和所有节点上设置调试客户端信息。 Node派生自此Node,除非被 fuchsia.sysmem2/Allocator.SetDebugClientInfo 或更高版本 fuchsia.sysmem2/Node.SetDebugClientInfo

发送 fuchsia.sysmem2/Allocator.SetDebugClientInfo 一次 Allocator是确保所有 fuchsia.sysmem2/节点将至少包含一些调试客户端信息 而且比单独发送相同的调试信息更高效 通过 fuchsia.sysmem2/Node.SetDebugClientInfo 获取每个客户端信息 已创建 fuchsia.sysmem2/Node

也在启用详细日志记录功能(请参阅 SetVerboseLogging)时使用,用于 指明哪个客户最先关闭其渠道,从而转到子树 失败(如果子树的用途已过,这是正常现象,但 如果发生时间早于预期,则客户端渠道专用名称 帮助诊断故障最初来自何处 )。

目前,所有表字段均为必填字段。

  • 请求 name,可以是任意字符串,但当前 进程名称(请参阅 fsl::GetCurrentProcessName)是一个很好的默认值。
  • 请求 id 这可以是任意 ID,也可以是当前的进程 ID (请参阅 fsl::GetCurrentProcessKoid)是一个很好的默认值。

请求

名称类型
payload NodeSetDebugClientInfoRequest

SetDebugTimeoutLogDeadline

如果未检测到 sysmem,系统会记录警告 所有客户端的 fuchsia.sysmem2/BufferCollection.SetConstraints

客户端可以调用此方法来更改输出日志的时间。如果 多个客户端设置了截止时间,但未指定哪个截止期限 生效。

在大多数情况下,使用默认值即可。

目前,所有表字段均为必填字段。

  • 请求 deadline:系统内存开始尝试记录日志的时间 除非那时所有限制条件都与 sysmem 相关,否则系统会返回该警告。

请求

名称类型
payload NodeSetDebugTimeoutLogDeadlineRequest

SetDispensable

将此 fuchsia.sysmem2/BufferCollectionToken 设置为可不需。

BufferCollectionToken 转换为 fuchsia.sysmem2/BufferCollection,但这种可粉的状态适用于 BufferCollection

通常,如果客户端关闭 fuchsia.sysmem2/BufferCollection 而无需发送 fuchsia.sysmem2/BufferCollection.Release 先是 BufferCollection fuchisa.sysmem2/Node 将会失败,这也会 将失败传播到父级 fuchsia.sysmem2/Node,依此类推 到根 Node,这会导致整个缓冲区收集失败。在 相比之下,在分配缓冲区后,可分配的 Node 可能会失败 而不会导致 fuchsia.sysmem2/Node 中的父级出现故障 层次结构。

可省略的 Node 会参与约束条件汇总 与父实体相关联。如果可饮用Node 在分配缓冲区之前失败,此故障将传播到 Node的父级。

分配缓冲区后,可消耗的 Node(或任何 可饮用 Node 的子级)不会传播到可饮用的茶饮料 Node的家长。失败会从 将纸张 Node 转换为纸张 Node。孩子失败是 如果使用 fuchsia.sysmem2/BufferCollection.AttachToken,或者如果子级是 且失败发生在分配之后。

如果参与者需要这样做,可以使用非必要的 Node。 提供约束条件,但在分配缓冲区后,参与者 可以失败,而不会导致父级缓冲区收集失败 Node的观点。

相比之下,BufferCollection.AttachToken 可用于创建 BufferCollectionToken,即未参与约束条件 与其父级 Node 进行聚合,并且其在任何时候都会失败 不会传播到其父级 Node,并且其可能的延迟 约束条件不会阻止父级 Node 完成其 缓冲区分配。

发起者(根资源Node的创建者,使用 fuchsia.sysmem2/Allocator.AllocateSharedCollection)中 场景选择首先使用可消耗的 Node。 之后,如果该参与者的第一个实例 该参与者失败后,系统会将该参与者的第二个新实例提供给我 使用 AttachToken 创建的 BufferCollectionToken

通常,客户端会在 BufferCollectionToken 上执行 SetDispensable 操作 将可饮用的BufferCollectionToken发送给 受托人。由于 SetDispensable 会阻止传播 子级 Node 未能映射到父级 Node(如果客户端依赖于 根据Node 客户端,可能需要改为通过其他方式发现故障。 如果其他方式不可用/不方便,客户可以改为 保留可分配的 Node 并在其下创建一个子级 Node, 发送给受托参与者,保留此 Node 以便 通过此 Node 的根在此 Node 处的子树会发现故障 ZX_CHANNEL_PEER_CLOSED 信号,并采取适当的措施 (例如,启动受托人的新实例并递给它 BufferCollectionToken(使用 fuchsia.sysmem2/BufferCollection.AttachToken,或传播失败 并以客户特定的方式进行清理)。

虽然可以在一个网页上SetDispensable BufferCollectionTokenGroup Node 的直接子项,则无法 替换掉原来直接子代故障的Node 使用 AttachToken 创建带有新令牌的 BufferCollectionTokenGroup (因为组没有 AttachToken)。相反,要启用 在本例中,AttachToken 替换,请再创建一个 作为该组的直接子项的非必需令牌, 现有可分配的令牌是额外令牌的子令牌。这样, 作为组的直接子项的额外令牌具有 BufferCollection.AttachToken,可用于替换失败的 一次性令牌。

对已经不可取的令牌的 SetDispensable 具有幂等性。

请求

<空>

SetName

为此缓冲区集合中的 VMO 设置名称。

如果名称在 ZX_MAX_NAME_LEN 中容纳不下,vmo 本身的名称 将被截断为适合大小。vmo 的名称将以 集合中的缓冲区索引(如果后缀适合放在 ZX_MAX_NAME_LEN).此处指定的名称(不截断)将 。

名称只会影响设置名称后分配的 VMO;这场通话 不会重命名现有 VMO。如果多个客户设置了不同的名称 则较大的优先级值将胜出使用 与先前名称相同优先级不会更改名称。

目前,所有表字段均为必填字段。

  • 请求 priority。仅当这是第一个 SetName 时,才会设置名称 或者如果 priority 大于任何之前 priority 的值 此缓冲区集合的所有 Node 之前的 SetName 调用。
  • request name 在此缓冲区集合下创建的 VMO 的名称。

请求

名称类型
payload NodeSetNameRequest

SetVerboseLogging

这会为缓冲区收集启用详细日志记录功能。

详细日志记录包括通过 每个客户端的 fuchsia.sysmem2/BufferCollection.SetConstraints 以及通过 fuchsia.sysmem2/Node.SetDebugClientInfo(或 fuchsia.sysmem2/Allocator.SetDebugClientInfoNode 的树。

通常,在汇总时,系统仅输出一行投诉 仅显示汇总失败的具体详细原因 几乎不需要周围的上下文。虽然这通常足以诊断问题 如果只进行了细微的更改并且一切正常,就会出现问题 在进行这项小更改之前 这通常不是特别有用 新的缓冲区集合。尤其是 更为复杂的节点树,涉及 fuchsia.sysmem2/BufferCollection.AttachTokenfuchsia.sysmem2/BufferCollectionToken.SetDispensablefuchsia.sysmem2/BufferCollectionTokenGroup 节点以及 详细日志记录可能有助于诊断节点的 原因、为什么逻辑分配失败, 子树的失败时间早于预期。

额外记录的目的是为了能在演出中获得 这一假设,假设仅启用了详细日志记录功能 。如果不跟踪错误 我们不应发送此消息。

请求

<空>

SetWeak

设置当前 fuchsia.sysmem2/Node 和所有子级 Node 弱,这意味着客户端的 Node 客户端(或此消息后创建的子级)并不孤单 使分配的 VMO 保持活跃状态。

从安全系数低的“Node”获取的所有 VMO 都是安全系数低的系统 VMO。另请参阅 close_weak_asap

系统只允许在Node准备好以下数据之前发送此消息: 分配(否则,服务器使用 ZX_ERR_BAD_STATE 关闭通道):

  • BufferCollectionToken:任何时间
  • BufferCollectionSetConstraints之前
  • BufferCollectionTokenGroupAllChildrenPresent之前

目前,在就绪后,未从强Node转换为弱Node 但客户端可以创建 在分配和设置该额外值之前,额外指定 Node Node 转换为弱 Release 并关闭客户端强 Node 的客户端,但是 保留客户端的弱 Node

零强 Node 和零强 VMO 句柄将导致缓冲区 收集失败(所有 Node 个客户端都将看到 ZX_CHANNEL_PEER_CLOSED以及全部 close_weak_asapclient_end将会 看到 ZX_EVENTPAIR_PEER_CLOSED,但 sysmem(有意)不会注意到 这种情况,直到所有 Node 都做好分配准备。对于 才能成功分配,至少要存在一个强 Node 但在该客户端收到 VMO 句柄之后, 客户端可以 BufferCollection.Release 并关闭客户端,而不用 导致此类故障。

这也暗示了 fuchsia.sysmem2/Node.SetWeakOk,但不意味着 暗示 SetWeakOkfor_children_also true,这可以发送 视情况进行单独调整。

请求

<空>

SetWeakOk

这可告知系统,客户端已准备好关注 close_weak_asap

如果发送,此邮件必须早于 fuchsia.sysmem2/BufferCollection.WaitForAllBuffersAllocated

所有使用弱 fuchsia.sysmem2/BufferCollection 的参与者都必须 请在 WaitForAllBuffersAllocated之前发送此消息,或者让家长发送此消息 Node 必须发送 fuchsia.sysmem2/Node.SetWeakOk 以及 for_child_nodes_also true,否则 WaitForAllBuffersAllocated 将 触发缓冲区收集失败。

此消息必不可少,因为系统并非总是 老客户没有意识到需要关注 close_weak_asapZX_EVENTPAIR_PEER_CLOSED并关闭所有剩余项 sysmem 弱 VMO 会尽快处理。收到此消息并要求 表明他们接受总体评分的这一方面, 因此会避免旧版客户端收到信号较弱的情况 VMO 无法让 sysmem 以任何方式使该 VMO 稍后快速关闭 (并且基于每个缓冲区)。

不处理 close_weak_asap 和也不处理的参与者 通过 WaitForAllBuffersAllocated 检索任何 VMO 句柄,不需要 发送 SetWeakOk(不需要让父级发送 NodeSetWeakOkfor_child_nodes_also 为 true)。但是,如果 同一参与者有一个检索 VMO 的子项/委托, 子级/受托人需要提前发送 SetWeakOk WaitForAllBuffersAllocated

  • 请求 for_child_nodes_also 如果存在且 true,则表示直接 在此消息之后创建的该节点的子节点以及所有子节点 这些节点的后代的行为将如同 SetWeakOk 这些节点在此节点之前创建的任何子节点 消息。此设置是“固定的” 不含此布尔值且设置为 true 的后续 SetWeakOk 不会重置 服务器端布尔值。如果这会给参与者带来问题, 解决方法是对子级执行 SetWeakOk 并将 for_child_nodes_also 设为 true 令牌。参与者只能设置 for_child_nodes_also:如果参与者确实能够承诺 针对其自身较弱的 VMO 句柄,遵循 close_weak_asap,并且 参与者持有相应子节点的 VMO 句柄持有较弱的 VMO 句柄 Node。设置 for_child_nodes_also 后,后代 Node 使用 sysmem(1) 的容器可能较弱,尽管它们的客户端 sysmem1 Node 无法通过任何直接方式连接到 SetWeakOk 或任何 了解 close_weak_asap 的直接方式。这仅适用于 使用 sysmem(1) 的此 Node 的后代,而不是此 直接从 sysmem2 令牌转换为 sysmem(1) 时为 Node 令牌,除非此 Node 的祖先实体,否则会导致分配失败 指定的 for_child_nodes_also 为 true。

请求

名称类型
payload NodeSetWeakOkRequest

同步

确保之前的邮件已在服务器端收到。这是 在之前有创建新令牌的消息之后, 因为在发送 将令牌发送给其他参与者。

对符合以下条件的令牌调用 fuchsia.sysmem2/BufferCollectionToken.Sync: 不是/不是有效令牌,可能会导致 Sync 永久停止。请参阅 fuchsia.sysmem2/Allocator.ValidateBufferCollectionToken(单向) 降低恶意/仿冒攻击的可能性 fuchsia.sysmem2/BufferCollectionToken,需支付一次往返的费用。 另一种方法是将令牌传递给 fuchsia.sysmem2/Allocator/BindSharedCollection,该集合还会验证 作为交换 fuchsia.sysmem2/BufferCollection 渠道,以及 然后可以放心地使用 fuchsia.sysmem2/BufferCollection.Sync 出现卡顿。

创建一个或多个 fuchsia.sysmem2/BufferCollectionToken 后 然后启动并完成Sync,就可以放心地将 BufferCollectionToken客户端结束给知道 其他服务器在发送令牌时 发送到系统内存的 fuchsia.sysmem2/Allocator.BindSharedCollection 消息。这是一个 创建令牌的高效方法,同时避免不必要的往返。

其他选项包括等待每个 fuchsia.sysmem2/BufferCollectionToken.Duplicate 需要完成 单独调用(在每个后面单独调用 Sync),或者调用 fuchsia.sysmem2/BufferCollection.Sync 令牌 已通过以下方式转换为BufferCollectionfuchsia.sysmem2/Allocator.BindSharedCollection 或使用 fuchsia.sysmem2/BufferCollectionToken.DuplicateSync,其中包含 可以一次创建多个令牌

请求

<空>

响应

名称类型
payload Node_Sync_Result

BufferCollectionTokenGroup

fuchsia.sysmem2/collection.fidl 中定义

系统内存实现与 分配 / 逻辑分配如下所示:

与往常一样,逻辑分配会考虑根节点以及所有具有 不传输 fuchsia.sysmem2/Node 的根连接 使用 fuchsia.sysmem2/BufferCollection.AttachToken 或子树创建 源于与以下账号相关联的 AttachToken Node 和所有 Node 不传输另一个 AttachToken 的子树。这称为 剪枝的逻辑分配子树,简称剪枝的子树。

在约束汇总期间,每个 fuchsia.sysmem2/BufferCollectionTokenGroup 将选择单个子级 Node。其余子元素将对 逻辑分配失败,而所选子级可能会成功。

如果总BufferCollectionTokenGroup 剪枝的逻辑分配子树,两个组之间的相对优先级 相当于它们在树的 DFS 预订单迭代中的排序, 父项的优先级高于子项,而左子项的优先级高于子项 优先级高于右侧子级。

选择某个组的特定子级时(无论是临时在 约束汇总尝试,或作为最终选择), 如果未选择群组的其他子项,则会“隐藏”任何其他群组 未选中的子项下。

在逻辑分配中,首先尝试通过临时 选择优先级最高的群组的子级 0,然后选择下一个优先级最高的子级 0 不会因临时选择而隐藏的最高优先级群组 远等

如果该汇总尝试失败,则系统将尝试对 所有相同组(除最低优先级的非隐藏组外)的序数 0 子项 组将暂时选择其序数 1 的子项(然后选择子项 2) 等等)。如果将优先级最低的新群组取消隐藏为临时群组 选择会更新,新取消隐藏的最低优先级群组 在更改临时选择之前,按顺序考虑其子项 之前优先级最低的群组中就结果而言 到系统化枚举 中所有可能的选择组合, 类似计数的顺序最频繁地更新优先级最低的群体, 优先级最高的群组出现的频率最低。我们并不实际尝试 我们可以跳过组合, 是多余的/等效的,因为它们会在不对结果进行任何更改的情况下隐藏。

尝试对枚举的非等效组合进行约束聚合 的选择以这种方式继续,直到 (a) 所有汇总尝试 失败,在这种情况下,整个逻辑分配会失败,或者 (b) 直到 尝试的汇总成功,此时会分配缓冲区(如果需要; 如果这是根位于整体根 Node 的已剪枝子树,则其值为 已尝试一次。如果基于第一个成功的缓冲区分配 约束聚合失败,则整个逻辑分配会失败( 没有缓冲区分配重试 / 重试)。如果缓冲区分配成功 (或者由于是经过剪除的子树,不包含 root),则逻辑分配会成功。

如果这个优先级方案无法合理地用于 系统管理人员,请随时与系统管理人员联系,讨论 从而轻松实现目标

请避免为每个网页创建大量BufferCollectionTokenGroup 逻辑分配,尤其是在总子项数量较多的情况下,以及 尤其是在合理预期聚合时, 使用序数 0 的子节点失败,之后的子节点可能也会失败。 系统可以降低评估过多项所需的高时间复杂性 在过多的组中选择子项组合/选择,只是简单地失败 超出某个(相当高,但不算大)最大数值的逻辑分配 一组经过考虑的组子级组合/选择。更高级(以及更多 (复杂),但预计缓解措施实际上没有必要; 值得增加的复杂性。如果最大限额为 或者如果您预计它会受到攻击 选项。

最好在一个文件中使用多个 fuchsia.sysmem2/ImageFormatConstraints 单个 fuchsia.sysmem2/BufferCollectionConstraints(如果可行, 参与者只需表达与 单个 fuchsia.images2/PixelFormat,通过系统内存来选择 PixelFormat 供所有参与者支持的工具使用)。

类似于 fuchsia.sysmem2/BufferCollectionTokenfuchsia.sysmem2/BufferCollectionBufferCollectionTokenGroup 个频道,但不发送 先调用 fuchsia.sysmem2/Node.Release 会导致缓冲区收集失败 (如果使用 fuchsia.sysmem2/BufferCollectionToken.SetDispensablefuchsia.sysmem2/BufferCollection.AttachTokenBufferCollectionTokenGroup 属于某个节点下的子树, 不会将失败传播到其父级)。

此协议不使用墓碑。

添加时间:19

AllChildrenPresent

表示将不再创建子项。

创建完所有子节点后,客户端应发送 fuchsia.sysmem2/BufferCollectionTokenGroup.AllChildrenPresent 向 通知 sysmem 不会再创建子项,这样 sysmem 可以 知道何时开始聚合约束条件。

不允许在 AllChildrenPresent 之后发送 CreateChild;这将 失败群组的子树并关闭连接。

如果要发送 fuchsia.sysmem2/Node.Release,也应发送 在 AllChildrenPresent 之后,否则该组的子树将失败 触发。我们故意这样做,这与未使用 Release 的 之前的 fuchsia.sysmem2/BufferCollection.SetConstraints 不会导致 子树故障。

请求

<空>

CreateChild

创建一个子级 fuchsia.sysmem2/BufferCollectionToken。只有一个孩子 (包括其子项)在分配期间将被选中(或 分配)。

在将此令牌的客户端传递给 fuchsia.sysmem2/Allocator.BindSharedCollection,完成 fuchsia.sysmem2/Node.Sync 之后 必须提供 fuchsia.sysmem2/BufferCollectionTokenGroup.CreateChild。 或者,客户端可以使用 fuchsia.sysmem2/BufferCollectionTokenGroup.CreateChildrenSync 实质上包含 Sync

不允许在 AllChildrenPresent 之后发送 CreateChild;这将 失败群组的子树并关闭连接。

创建完所有子项后,发送 AllChildrenPresent。

  • 请求 token_request 新令牌通道的服务器端。
  • 请求 rights_attenuation_mask 如果 ZX_RIGHT_SAME_RIGHTS,则创建的 令牌让持有者获得与原先的 父令牌。如果值不是 ZX_RIGHT_SAME_RIGHTS,值被解释为具有 0 的位掩码 位确保相应权利已得到关注,因此 0xFFFFFFFF 只是 代表 ZX_RIGHT_SAME_RIGHTS。系统特意不允许使用值 0 会导致子树故障。

请求

名称类型
payload BufferCollectionTokenGroupCreateChildRequest

CreateChildrenSync

一次同步创建 1 个或多个子令牌。与此相反, fuchsia.sysmem2/BufferCollectionTokenGroup.CreateChild,否 在将客户端传递至客户端之前,必须指定 fuchsia.sysmem2/Node.Sync 传递给 fuchsia.sysmem2/Allocator/BindSharedCollection

索引较低的子令牌的优先级高于(尝试更快) 索引较高的子词元。

按照所有子令牌,成功的聚合将仅选择一个子令牌 在所有已创建的儿童中 可能会多次调用 fuchsia.sysmem2/BufferCollectionTokenGroup.CreateChildfuchsia.sysmem2/BufferCollectionTokenGroup.CreateChildrenSync)。

每个群组允许的儿童总数上限 整个树中(从根节点开始)的节点数量设有上限 无法通过这些协议进行配置

不允许在 AllChildrenPresent 之后发送 CreateChildrenSync; 这样会使该组的子树失败并关闭连接。

创建完所有子项后,发送 AllChildrenPresent。

  • 请求 rights_attentuation_masksrights_attentuation_masks 确定创建的子项数量 词元。值 ZX_RIGHT_SAME_RIGHTS 不会削弱任何权利。 值 0xFFFFFFFF 是 ZX_RIGHT_SAME_RIGHTS 的同义词。不限 另一个值,掩码中的每个 0 位都会削弱该右侧对应的值。
  • 响应 tokens 创建的子令牌。

请求

名称类型
payload BufferCollectionTokenGroupCreateChildrenSyncRequest

响应

名称类型
payload BufferCollectionTokenGroup_CreateChildrenSync_Result

GetBufferCollectionId

获取缓冲区集合 ID。此 ID 也可从 fuchsia.sysmem2/Allocator.GetVmoInfo(以及 buffer_index) )。

此通话主要在以下情形下非常有用: fuchsia.sysmem2/BufferCollectionTokenfuchsia.sysmem2/BufferCollection,但只能传输 VMO 句柄,该句柄可与 BufferCollection 客户端端重新联接起来 通过其他路径创建的 ID。更希望通过 BufferCollectionTokenBufferCollection(如果可行)。

信任 sysmem 以外的来源的 buffer_collection_id 值 类似于信任锆石之外的其他来源的 Koid 值。 除非确实有必要,否则都应该避免同时使用这两种方法,并且都要求 注意。在某些情况下,引用 BufferCollectionbuffer_collection_id通过 但传入的值声称 仅凭 buffer_collection_id 不足以证明授予 buffer_collection_id 任意功能的发送端。发件人必须 先向接收者证明发送者有/有 VMO,或者有/有 BufferCollectionToken。 sysmem 确认是否是有效的 sysmem 句柄,以及哪个 sysmem 映射到 buffer_collection_id 值。接收方应小心避免 假设发送者有 BufferCollectionToken,且 因为发送方仅能证明其有 VMO。

  • 响应 buffer_collection_id 此 ID 在每个缓冲区中是唯一的 每次启动时收集。每个缓冲区均由 同时使用 buffer_collection_idbuffer_index

请求

<空>

响应

名称类型
payload Node_GetBufferCollectionId_Result

GetNodeRef

这会获取一个句柄 在任何设备上调用 fuchsia.sysmem2/Node.IsAlternateFor fuchsia.sysmem2/Node。此标识名仅用于证明 客户端已从此 Node 获取此标识名。

由于这是 get 设置,因此没有 fuchsia.sysmem2/Node.Sync GetNodeRefIsAlternateFor 调用之间所需的函数, 尽管这两个调用通常在不同的渠道上进行,

另请参阅 fuchsia.sysmem2/Node.IsAlternateFor

目前,所有表字段均为必填字段。

  • 响应 node_ref 此句柄可通过 IsAlternateFor 不同的 Node 频道,用于证明客户端获得了标识名 来自此Node

请求

<空>

响应

名称类型
payload Node_GetNodeRef_Result

IsAlternateFor

检查调用方 fuchsia.sysmem2/Node 是否在子树中 根植于共同父标记的不同子标记 fuchsia.sysmem2/BufferCollectionTokenGroup 传入 node_ref

此通话用于协助执行准入控制去重,以及 以及调试。

node_ref 必须使用 fuchsia.sysmem2/Node.GetNodeRef

node_ref 可以是重复的句柄;因此无需调用 每次调用 fuchsia.sysmem2/Node.IsAlternateFor 时返回 GetNodeRef

如果调用令牌由于 可能是恶意/不受信任的令牌提供程序,调用 fuchsia.sysmem2/Allocator.ValidateBufferCollectionToken 而不是在发生 IsAlternateFor 时无限期卡住 由于调用令牌不是真正的令牌(并非真正的令牌), 与 sysmem 通信)。另一种方法是 fuchsia.sysmem2/Allocator.BindSharedCollection 中包含此令牌 这也会验证令牌并将其转换为 fuchsia.sysmem2/BufferCollection,然后调用 IsAlternateFor

目前,所有表字段均为必填字段。

  • 回答 is_alternate <ph type="x-smartling-placeholder">
      </ph>
    • true:调用节点和 node_ref Node 是一个 BufferCollectionTokenGroup。这意味着 发起调用的 Nodenode_ref Node 不会同时具有两者 其约束条件适用,而 sysmem 会选择其中一种 约束条件 - 不能两者都选。这是因为 在逻辑期间选择了 BufferCollectionTokenGroup 并且只有一个子树的子树促成 约束汇总。
    • false:调用方 Node 之间共有的第一个父节点 并且 node_ref Node 不是 BufferCollectionTokenGroup。 目前,这意味着共同的第一个父节点是 BufferCollectionTokenBufferCollection(无论是否为 Releaseed)。这意味着,调用的 Nodenode_ref Node 在约束条件期间可能同时应用这两个约束条件 逻辑分配的聚合(如果两个 Node 都符合) 由所涉及的任何父级BufferCollectionTokenGroup选择。在 在此示例中,没有任何 BufferCollectionTokenGroup 可 直接阻止两个 Node 同时被选中并 它们的约束条件都已汇总,但即使值为 false,也可以将其中一个或两个都汇总 如果其中有一项或两项,Node仍有可能被排除在考虑范围外 Node有直接或间接父级 BufferCollectionTokenGroup,用于选择另一个子子树 与包含调用 Nodenode_ref Node 的子树相比。
  • 错误 [fuchsia.sysmem2/Error.NOT_FOUND] node_ref 不是 与调用 Node 的缓冲区集合相关联。 导致此错误的另一个原因是,如果 node_refzx.Handle.EVENT 处理具有足够的权限,但实际上并不是 从 GetNodeRef 获得的实 node_ref
  • 错误 [fuchsia.sysmem2/Error.PROTOCOL_DEVIATION] 调用方传递了 node_ref 不是 zx.Handle:EVENT 句柄,或者不是 所需的权利。node_ref
  • 此调用不会返回其他失败的状态代码。不过, sysmem 将来可能会添加其他代码,因此客户端应该 对任何失败的状态代码进行合理的默认处理。

请求

名称类型
payload NodeIsAlternateForRequest

响应

名称类型
payload Node_IsAlternateFor_Result

版本

fuchsia.sysmem2/BufferCollectionToken 通道上:

通常,参与者会将 BufferCollectionToken 转换为 fuchsia.sysmem2/BufferCollection,但参与者可以改为发送 Release(然后立即关闭渠道,或者 稍后响应服务器关闭服务器端), 以免导致缓冲区收集失败。如果没有之前的 Release, 关闭 BufferCollectionToken 客户端会导致缓冲 收集失败。

fuchsia.sysmem2/BufferCollection 通道上:

默认情况下,服务器会处理 fuchsia.sysmem2/BufferCollection 客户端端(不含 Release) 首先)使缓冲区收集失败。在一定程度上是为了加快 当有任何参与者失败时,关闭 VMO 句柄以回收内存。如果 参与者想要在没有BufferCollection 导致缓冲区收集失败,参与者可以发送 Release 然后再关闭 BufferCollection 客户端。Release可以 发生在 SetConstraints 之前或之后。如果早于 SetConstraints, 缓冲区收集不需要此节点的约束即可 分配。如果晚于 SetConstraints,系统会保留约束条件, 尽管在 BufferCollection 约束汇总时间。

fuchsia.sysmem2/BufferCollectionTokenGroup 通道上:

默认情况下,BufferCollectionTokenGroup 客户端意外关闭 end(先没有 Release)会导致缓冲区故障 。在不采用任何规则的情况下关闭 BufferCollectionTokenGroup 渠道 缓冲区收集失败,请确保已对 AllChildrenPresent() 执行 已发送,并在关闭BufferCollectionTokenGroup前发送 Release 客户端。

如果 Release 出现于 [fuchsia.sysmem2/BufferCollectionTokenGroup.AllChildrenPresent], the buffer collection will fail (triggered by reception of 释放without priorAllChildrenPresent). This is intentionally not analogous to how <a class='link' href='../fuchsia.sysmem2/'>fuchsia.sysmem2</a>/<a class='link' href='../fuchsia.sysmem2/#BufferCollection.Release'>BufferCollection.Release</a> without <a class='link' href='../fuchsia.sysmem2/'>fuchsia.sysmem2</a>/<a class='link' href='../fuchsia.sysmem2/#BufferCollection.SetConstraints'>BufferCollection.SetConstraints</a> first doesn't cause buffer collection failure. For a BufferCollectionTokenGroup, clean close requires AllChildrenPresent(if not already sent), then Release`,然后关闭客户端。

如果 Release 发生在 AllChildrenPresent 之后,则子项和所有 其约束条件保持不变(就像如果 BufferCollectionTokenGroup 渠道仍保持打开状态),且客户端 结束关闭不会导致缓冲区收集失败。

在所有 fuchsia.sysmem2/Node 通道上(上述任何一种):

为简单起见,上文中针对每频道协议的段落会忽略 一个单独的故障域 fuchsia.sysmem2/BufferCollectionToken.SetDispensablefuchsia.sysmem2/BufferCollection.AttachToken。当客户端结束 意外关闭(没有先 Release),且客户端是 而不是使整个缓冲区收集失败 表示故障域失败,但缓冲区收集本身 与故障域故障隔离开来此类故障域 嵌套,在这种情况下,只有最内层的故障域 Node 驻留失败。

请求

<空>

SetDebugClientInfo

将有关 sysmem 可以使用的当前客户端的信息设置为 帮助诊断泄漏的内存和等待 发送 fuchsia.sysmem2/BufferCollection.SetConstraints

这会在此 fuchsia.sysmem2/Node 和所有节点上设置调试客户端信息。 Node派生自此Node,除非被 fuchsia.sysmem2/Allocator.SetDebugClientInfo 或更高版本 fuchsia.sysmem2/Node.SetDebugClientInfo

发送 fuchsia.sysmem2/Allocator.SetDebugClientInfo 一次 Allocator是确保所有 fuchsia.sysmem2/节点将至少包含一些调试客户端信息 而且比单独发送相同的调试信息更高效 通过 fuchsia.sysmem2/Node.SetDebugClientInfo 获取每个客户端信息 已创建 fuchsia.sysmem2/Node

也在启用详细日志记录功能(请参阅 SetVerboseLogging)时使用,用于 指明哪个客户最先关闭其渠道,从而转到子树 失败(如果子树的用途已过,这是正常现象,但 如果发生时间早于预期,则客户端渠道专用名称 帮助诊断故障最初来自何处 )。

目前,所有表字段均为必填字段。

  • 请求 name,可以是任意字符串,但当前 进程名称(请参阅 fsl::GetCurrentProcessName)是一个很好的默认值。
  • 请求 id 这可以是任意 ID,也可以是当前的进程 ID (请参阅 fsl::GetCurrentProcessKoid)是一个很好的默认值。

请求

名称类型
payload NodeSetDebugClientInfoRequest

SetDebugTimeoutLogDeadline

如果未检测到 sysmem,系统会记录警告 所有客户端的 fuchsia.sysmem2/BufferCollection.SetConstraints

客户端可以调用此方法来更改输出日志的时间。如果 多个客户端设置了截止时间,但未指定哪个截止期限 生效。

在大多数情况下,使用默认值即可。

目前,所有表字段均为必填字段。

  • 请求 deadline:系统内存开始尝试记录日志的时间 除非那时所有限制条件都与 sysmem 相关,否则系统会返回该警告。

请求

名称类型
payload NodeSetDebugTimeoutLogDeadlineRequest

SetName

为此缓冲区集合中的 VMO 设置名称。

如果名称在 ZX_MAX_NAME_LEN 中容纳不下,vmo 本身的名称 将被截断为适合大小。vmo 的名称将以 集合中的缓冲区索引(如果后缀适合放在 ZX_MAX_NAME_LEN).此处指定的名称(不截断)将 。

名称只会影响设置名称后分配的 VMO;这场通话 不会重命名现有 VMO。如果多个客户设置了不同的名称 则较大的优先级值将胜出使用 与先前名称相同优先级不会更改名称。

目前,所有表字段均为必填字段。

  • 请求 priority。仅当这是第一个 SetName 时,才会设置名称 或者如果 priority 大于任何之前 priority 的值 此缓冲区集合的所有 Node 之前的 SetName 调用。
  • request name 在此缓冲区集合下创建的 VMO 的名称。

请求

名称类型
payload NodeSetNameRequest

SetVerboseLogging

这会为缓冲区收集启用详细日志记录功能。

详细日志记录包括通过 每个客户端的 fuchsia.sysmem2/BufferCollection.SetConstraints 以及通过 fuchsia.sysmem2/Node.SetDebugClientInfo(或 fuchsia.sysmem2/Allocator.SetDebugClientInfoNode 的树。

通常,在汇总时,系统仅输出一行投诉 仅显示汇总失败的具体详细原因 几乎不需要周围的上下文。虽然这通常足以诊断问题 如果只进行了细微的更改并且一切正常,就会出现问题 在进行这项小更改之前 这通常不是特别有用 新的缓冲区集合。尤其是 更为复杂的节点树,涉及 fuchsia.sysmem2/BufferCollection.AttachTokenfuchsia.sysmem2/BufferCollectionToken.SetDispensablefuchsia.sysmem2/BufferCollectionTokenGroup 节点以及 详细日志记录可能有助于诊断节点的 原因、为什么逻辑分配失败, 子树的失败时间早于预期。

额外记录的目的是为了能在演出中获得 这一假设,假设仅启用了详细日志记录功能 。如果不跟踪错误 我们不应发送此消息。

请求

<空>

SetWeak

设置当前 fuchsia.sysmem2/Node 和所有子级 Node 弱,这意味着客户端的 Node 客户端(或此消息后创建的子级)并不孤单 使分配的 VMO 保持活跃状态。

从安全系数低的“Node”获取的所有 VMO 都是安全系数低的系统 VMO。另请参阅 close_weak_asap

系统只允许在Node准备好以下数据之前发送此消息: 分配(否则,服务器使用 ZX_ERR_BAD_STATE 关闭通道):

  • BufferCollectionToken:任何时间
  • BufferCollectionSetConstraints之前
  • BufferCollectionTokenGroupAllChildrenPresent之前

目前,在就绪后,未从强Node转换为弱Node 但客户端可以创建 在分配和设置该额外值之前,额外指定 Node Node 转换为弱 Release 并关闭客户端强 Node 的客户端,但是 保留客户端的弱 Node

零强 Node 和零强 VMO 句柄将导致缓冲区 收集失败(所有 Node 个客户端都将看到 ZX_CHANNEL_PEER_CLOSED以及全部 close_weak_asapclient_end将会 看到 ZX_EVENTPAIR_PEER_CLOSED,但 sysmem(有意)不会注意到 这种情况,直到所有 Node 都做好分配准备。对于 才能成功分配,至少要存在一个强 Node 但在该客户端收到 VMO 句柄之后, 客户端可以 BufferCollection.Release 并关闭客户端,而不用 导致此类故障。

这也暗示了 fuchsia.sysmem2/Node.SetWeakOk,但不意味着 暗示 SetWeakOkfor_children_also true,这可以发送 视情况进行单独调整。

请求

<空>

SetWeakOk

这可告知系统,客户端已准备好关注 close_weak_asap

如果发送,此邮件必须早于 fuchsia.sysmem2/BufferCollection.WaitForAllBuffersAllocated

所有使用弱 fuchsia.sysmem2/BufferCollection 的参与者都必须 请在 WaitForAllBuffersAllocated之前发送此消息,或者让家长发送此消息 Node 必须发送 fuchsia.sysmem2/Node.SetWeakOk 以及 for_child_nodes_also true,否则 WaitForAllBuffersAllocated 将 触发缓冲区收集失败。

此消息必不可少,因为系统并非总是 老客户没有意识到需要关注 close_weak_asapZX_EVENTPAIR_PEER_CLOSED并关闭所有剩余项 sysmem 弱 VMO 会尽快处理。收到此消息并要求 表明他们接受总体评分的这一方面, 因此会避免旧版客户端收到信号较弱的情况 VMO 无法让 sysmem 以任何方式使该 VMO 稍后快速关闭 (并且基于每个缓冲区)。

不处理 close_weak_asap 和也不处理的参与者 通过 WaitForAllBuffersAllocated 检索任何 VMO 句柄,不需要 发送 SetWeakOk(不需要让父级发送 NodeSetWeakOkfor_child_nodes_also 为 true)。但是,如果 同一参与者有一个检索 VMO 的子项/委托, 子级/受托人需要提前发送 SetWeakOk WaitForAllBuffersAllocated

  • 请求 for_child_nodes_also 如果存在且 true,则表示直接 在此消息之后创建的该节点的子节点以及所有子节点 这些节点的后代的行为将如同 SetWeakOk 这些节点在此节点之前创建的任何子节点 消息。此设置是“固定的” 不含此布尔值且设置为 true 的后续 SetWeakOk 不会重置 服务器端布尔值。如果这会给参与者带来问题, 解决方法是对子级执行 SetWeakOk 并将 for_child_nodes_also 设为 true 令牌。参与者只能设置 for_child_nodes_also:如果参与者确实能够承诺 针对其自身较弱的 VMO 句柄,遵循 close_weak_asap,并且 参与者持有相应子节点的 VMO 句柄持有较弱的 VMO 句柄 Node。设置 for_child_nodes_also 后,后代 Node 使用 sysmem(1) 的容器可能较弱,尽管它们的客户端 sysmem1 Node 无法通过任何直接方式连接到 SetWeakOk 或任何 了解 close_weak_asap 的直接方式。这仅适用于 使用 sysmem(1) 的此 Node 的后代,而不是此 直接从 sysmem2 令牌转换为 sysmem(1) 时为 Node 令牌,除非此 Node 的祖先实体,否则会导致分配失败 指定的 for_child_nodes_also 为 true。

请求

名称类型
payload NodeSetWeakOkRequest

同步

确保之前的邮件已在服务器端收到。这是 在之前有创建新令牌的消息之后, 因为在发送 将令牌发送给其他参与者。

对符合以下条件的令牌调用 fuchsia.sysmem2/BufferCollectionToken.Sync: 不是/不是有效令牌,可能会导致 Sync 永久停止。请参阅 fuchsia.sysmem2/Allocator.ValidateBufferCollectionToken(单向) 降低恶意/仿冒攻击的可能性 fuchsia.sysmem2/BufferCollectionToken,需支付一次往返的费用。 另一种方法是将令牌传递给 fuchsia.sysmem2/Allocator/BindSharedCollection,该集合还会验证 作为交换 fuchsia.sysmem2/BufferCollection 渠道,以及 然后可以放心地使用 fuchsia.sysmem2/BufferCollection.Sync 出现卡顿。

创建一个或多个 fuchsia.sysmem2/BufferCollectionToken 后 然后启动并完成Sync,就可以放心地将 BufferCollectionToken客户端结束给知道 其他服务器在发送令牌时 发送到系统内存的 fuchsia.sysmem2/Allocator.BindSharedCollection 消息。这是一个 创建令牌的高效方法,同时避免不必要的往返。

其他选项包括等待每个 fuchsia.sysmem2/BufferCollectionToken.Duplicate 需要完成 单独调用(在每个后面单独调用 Sync),或者调用 fuchsia.sysmem2/BufferCollection.Sync 令牌 已通过以下方式转换为BufferCollectionfuchsia.sysmem2/Allocator.BindSharedCollection 或使用 fuchsia.sysmem2/BufferCollectionToken.DuplicateSync,其中包含 可以一次创建多个令牌

请求

<空>

响应

名称类型
payload Node_Sync_Result

节点

fuchsia.sysmem2/collection.fidl 中定义

此协议是所建立树中所有节点的父协议 (通过创建 fuchsia.sysmem2/BufferCollectionTokenfuchsia.sysmem2/BufferCollectionTokenGroup 创建,包括 fuchsia.sysmem2/BufferCollectionToken(此后已转换) 传递到 fuchsia.sysmem2/BufferCollection 渠道。

此协议不使用墓碑。

添加时间:19

GetBufferCollectionId

获取缓冲区集合 ID。此 ID 也可从 fuchsia.sysmem2/Allocator.GetVmoInfo(以及 buffer_index) )。

此通话主要在以下情形下非常有用: fuchsia.sysmem2/BufferCollectionTokenfuchsia.sysmem2/BufferCollection,但只能传输 VMO 句柄,该句柄可与 BufferCollection 客户端端重新联接起来 通过其他路径创建的 ID。更希望通过 BufferCollectionTokenBufferCollection(如果可行)。

信任 sysmem 以外的来源的 buffer_collection_id 值 类似于信任锆石之外的其他来源的 Koid 值。 除非确实有必要,否则都应该避免同时使用这两种方法,并且都要求 注意。在某些情况下,引用 BufferCollectionbuffer_collection_id通过 但传入的值声称 仅凭 buffer_collection_id 不足以证明授予 buffer_collection_id 任意功能的发送端。发件人必须 先向接收者证明发送者有/有 VMO,或者有/有 BufferCollectionToken。 sysmem 确认是否是有效的 sysmem 句柄,以及哪个 sysmem 映射到 buffer_collection_id 值。接收方应小心避免 假设发送者有 BufferCollectionToken,且 因为发送方仅能证明其有 VMO。

  • 响应 buffer_collection_id 此 ID 在每个缓冲区中是唯一的 每次启动时收集。每个缓冲区均由 同时使用 buffer_collection_idbuffer_index

请求

<空>

响应

名称类型
payload Node_GetBufferCollectionId_Result

GetNodeRef

这会获取一个句柄 在任何设备上调用 fuchsia.sysmem2/Node.IsAlternateFor fuchsia.sysmem2/Node。此标识名仅用于证明 客户端已从此 Node 获取此标识名。

由于这是 get 设置,因此没有 fuchsia.sysmem2/Node.Sync GetNodeRefIsAlternateFor 调用之间所需的函数, 尽管这两个调用通常在不同的渠道上进行,

另请参阅 fuchsia.sysmem2/Node.IsAlternateFor

目前,所有表字段均为必填字段。

  • 响应 node_ref 此句柄可通过 IsAlternateFor 不同的 Node 频道,用于证明客户端获得了标识名 来自此Node

请求

<空>

响应

名称类型
payload Node_GetNodeRef_Result

IsAlternateFor

检查调用方 fuchsia.sysmem2/Node 是否在子树中 根植于共同父标记的不同子标记 fuchsia.sysmem2/BufferCollectionTokenGroup 传入 node_ref

此通话用于协助执行准入控制去重,以及 以及调试。

node_ref 必须使用 fuchsia.sysmem2/Node.GetNodeRef

node_ref 可以是重复的句柄;因此无需调用 每次调用 fuchsia.sysmem2/Node.IsAlternateFor 时返回 GetNodeRef

如果调用令牌由于 可能是恶意/不受信任的令牌提供程序,调用 fuchsia.sysmem2/Allocator.ValidateBufferCollectionToken 而不是在发生 IsAlternateFor 时无限期卡住 由于调用令牌不是真正的令牌(并非真正的令牌), 与 sysmem 通信)。另一种方法是 fuchsia.sysmem2/Allocator.BindSharedCollection 中包含此令牌 这也会验证令牌并将其转换为 fuchsia.sysmem2/BufferCollection,然后调用 IsAlternateFor

目前,所有表字段均为必填字段。

  • 回答 is_alternate <ph type="x-smartling-placeholder">
      </ph>
    • true:调用节点和 node_ref Node 是一个 BufferCollectionTokenGroup。这意味着 发起调用的 Nodenode_ref Node 不会同时具有两者 其约束条件适用,而 sysmem 会选择其中一种 约束条件 - 不能两者都选。这是因为 在逻辑期间选择了 BufferCollectionTokenGroup 并且只有一个子树的子树促成 约束汇总。
    • false:调用方 Node 之间共有的第一个父节点 并且 node_ref Node 不是 BufferCollectionTokenGroup。 目前,这意味着共同的第一个父节点是 BufferCollectionTokenBufferCollection(无论是否为 Releaseed)。这意味着,调用的 Nodenode_ref Node 在约束条件期间可能同时应用这两个约束条件 逻辑分配的聚合(如果两个 Node 都符合) 由所涉及的任何父级BufferCollectionTokenGroup选择。在 在此示例中,没有任何 BufferCollectionTokenGroup 可 直接阻止两个 Node 同时被选中并 它们的约束条件都已汇总,但即使值为 false,也可以将其中一个或两个都汇总 如果其中有一项或两项,Node仍有可能被排除在考虑范围外 Node有直接或间接父级 BufferCollectionTokenGroup,用于选择另一个子子树 与包含调用 Nodenode_ref Node 的子树相比。
  • 错误 [fuchsia.sysmem2/Error.NOT_FOUND] node_ref 不是 与调用 Node 的缓冲区集合相关联。 导致此错误的另一个原因是,如果 node_refzx.Handle.EVENT 处理具有足够的权限,但实际上并不是 从 GetNodeRef 获得的实 node_ref
  • 错误 [fuchsia.sysmem2/Error.PROTOCOL_DEVIATION] 调用方传递了 node_ref 不是 zx.Handle:EVENT 句柄,或者不是 所需的权利。node_ref
  • 此调用不会返回其他失败的状态代码。不过, sysmem 将来可能会添加其他代码,因此客户端应该 对任何失败的状态代码进行合理的默认处理。

请求

名称类型
payload NodeIsAlternateForRequest

响应

名称类型
payload Node_IsAlternateFor_Result

版本

fuchsia.sysmem2/BufferCollectionToken 通道上:

通常,参与者会将 BufferCollectionToken 转换为 fuchsia.sysmem2/BufferCollection,但参与者可以改为发送 Release(然后立即关闭渠道,或者 稍后响应服务器关闭服务器端), 以免导致缓冲区收集失败。如果没有之前的 Release, 关闭 BufferCollectionToken 客户端会导致缓冲 收集失败。

fuchsia.sysmem2/BufferCollection 通道上:

默认情况下,服务器会处理 fuchsia.sysmem2/BufferCollection 客户端端(不含 Release) 首先)使缓冲区收集失败。在一定程度上是为了加快 当有任何参与者失败时,关闭 VMO 句柄以回收内存。如果 参与者想要在没有BufferCollection 导致缓冲区收集失败,参与者可以发送 Release 然后再关闭 BufferCollection 客户端。Release可以 发生在 SetConstraints 之前或之后。如果早于 SetConstraints, 缓冲区收集不需要此节点的约束即可 分配。如果晚于 SetConstraints,系统会保留约束条件, 尽管在 BufferCollection 约束汇总时间。

fuchsia.sysmem2/BufferCollectionTokenGroup 通道上:

默认情况下,BufferCollectionTokenGroup 客户端意外关闭 end(先没有 Release)会导致缓冲区故障 。在不采用任何规则的情况下关闭 BufferCollectionTokenGroup 渠道 缓冲区收集失败,请确保已对 AllChildrenPresent() 执行 已发送,并在关闭BufferCollectionTokenGroup前发送 Release 客户端。

如果 Release 出现于 [fuchsia.sysmem2/BufferCollectionTokenGroup.AllChildrenPresent], the buffer collection will fail (triggered by reception of 释放without priorAllChildrenPresent). This is intentionally not analogous to how <a class='link' href='../fuchsia.sysmem2/'>fuchsia.sysmem2</a>/<a class='link' href='../fuchsia.sysmem2/#BufferCollection.Release'>BufferCollection.Release</a> without <a class='link' href='../fuchsia.sysmem2/'>fuchsia.sysmem2</a>/<a class='link' href='../fuchsia.sysmem2/#BufferCollection.SetConstraints'>BufferCollection.SetConstraints</a> first doesn't cause buffer collection failure. For a BufferCollectionTokenGroup, clean close requires AllChildrenPresent(if not already sent), then Release`,然后关闭客户端。

如果 Release 发生在 AllChildrenPresent 之后,则子项和所有 其约束条件保持不变(就像如果 BufferCollectionTokenGroup 渠道仍保持打开状态),且客户端 结束关闭不会导致缓冲区收集失败。

在所有 fuchsia.sysmem2/Node 通道上(上述任何一种):

为简单起见,上文中针对每频道协议的段落会忽略 一个单独的故障域 fuchsia.sysmem2/BufferCollectionToken.SetDispensablefuchsia.sysmem2/BufferCollection.AttachToken。当客户端结束 意外关闭(没有先 Release),且客户端是 而不是使整个缓冲区收集失败 表示故障域失败,但缓冲区收集本身 与故障域故障隔离开来此类故障域 嵌套,在这种情况下,只有最内层的故障域 Node 驻留失败。

请求

<空>

SetDebugClientInfo

将有关 sysmem 可以使用的当前客户端的信息设置为 帮助诊断泄漏的内存和等待 发送 fuchsia.sysmem2/BufferCollection.SetConstraints

这会在此 fuchsia.sysmem2/Node 和所有节点上设置调试客户端信息。 Node派生自此Node,除非被 fuchsia.sysmem2/Allocator.SetDebugClientInfo 或更高版本 fuchsia.sysmem2/Node.SetDebugClientInfo

发送 fuchsia.sysmem2/Allocator.SetDebugClientInfo 一次 Allocator是确保所有 fuchsia.sysmem2/节点将至少包含一些调试客户端信息 而且比单独发送相同的调试信息更高效 通过 fuchsia.sysmem2/Node.SetDebugClientInfo 获取每个客户端信息 已创建 fuchsia.sysmem2/Node

也在启用详细日志记录功能(请参阅 SetVerboseLogging)时使用,用于 指明哪个客户最先关闭其渠道,从而转到子树 失败(如果子树的用途已过,这是正常现象,但 如果发生时间早于预期,则客户端渠道专用名称 帮助诊断故障最初来自何处 )。

目前,所有表字段均为必填字段。

  • 请求 name,可以是任意字符串,但当前 进程名称(请参阅 fsl::GetCurrentProcessName)是一个很好的默认值。
  • 请求 id 这可以是任意 ID,也可以是当前的进程 ID (请参阅 fsl::GetCurrentProcessKoid)是一个很好的默认值。

请求

名称类型
payload NodeSetDebugClientInfoRequest

SetDebugTimeoutLogDeadline

如果未检测到 sysmem,系统会记录警告 所有客户端的 fuchsia.sysmem2/BufferCollection.SetConstraints

客户端可以调用此方法来更改输出日志的时间。如果 多个客户端设置了截止时间,但未指定哪个截止期限 生效。

在大多数情况下,使用默认值即可。

目前,所有表字段均为必填字段。

  • 请求 deadline:系统内存开始尝试记录日志的时间 除非那时所有限制条件都与 sysmem 相关,否则系统会返回该警告。

请求

名称类型
payload NodeSetDebugTimeoutLogDeadlineRequest

SetName

为此缓冲区集合中的 VMO 设置名称。

如果名称在 ZX_MAX_NAME_LEN 中容纳不下,vmo 本身的名称 将被截断为适合大小。vmo 的名称将以 集合中的缓冲区索引(如果后缀适合放在 ZX_MAX_NAME_LEN).此处指定的名称(不截断)将 。

名称只会影响设置名称后分配的 VMO;这场通话 不会重命名现有 VMO。如果多个客户设置了不同的名称 则较大的优先级值将胜出使用 与先前名称相同优先级不会更改名称。

目前,所有表字段均为必填字段。

  • 请求 priority。仅当这是第一个 SetName 时,才会设置名称 或者如果 priority 大于任何之前 priority 的值 此缓冲区集合的所有 Node 之前的 SetName 调用。
  • request name 在此缓冲区集合下创建的 VMO 的名称。

请求

名称类型
payload NodeSetNameRequest

SetVerboseLogging

这会为缓冲区收集启用详细日志记录功能。

详细日志记录包括通过 每个客户端的 fuchsia.sysmem2/BufferCollection.SetConstraints 以及通过 fuchsia.sysmem2/Node.SetDebugClientInfo(或 fuchsia.sysmem2/Allocator.SetDebugClientInfoNode 的树。

通常,在汇总时,系统仅输出一行投诉 仅显示汇总失败的具体详细原因 几乎不需要周围的上下文。虽然这通常足以诊断问题 如果只进行了细微的更改并且一切正常,就会出现问题 在进行这项小更改之前 这通常不是特别有用 新的缓冲区集合。尤其是 更为复杂的节点树,涉及 fuchsia.sysmem2/BufferCollection.AttachTokenfuchsia.sysmem2/BufferCollectionToken.SetDispensablefuchsia.sysmem2/BufferCollectionTokenGroup 节点以及 详细日志记录可能有助于诊断节点的 原因、为什么逻辑分配失败, 子树的失败时间早于预期。

额外记录的目的是为了能在演出中获得 这一假设,假设仅启用了详细日志记录功能 。如果不跟踪错误 我们不应发送此消息。

请求

<空>

SetWeak

设置当前 fuchsia.sysmem2/Node 和所有子级 Node 弱,这意味着客户端的 Node 客户端(或此消息后创建的子级)并不孤单 使分配的 VMO 保持活跃状态。

从安全系数低的“Node”获取的所有 VMO 都是安全系数低的系统 VMO。另请参阅 close_weak_asap

系统只允许在Node准备好以下数据之前发送此消息: 分配(否则,服务器使用 ZX_ERR_BAD_STATE 关闭通道):

  • BufferCollectionToken:任何时间
  • BufferCollectionSetConstraints之前
  • BufferCollectionTokenGroupAllChildrenPresent之前

目前,在就绪后,未从强Node转换为弱Node 但客户端可以创建 在分配和设置该额外值之前,额外指定 Node Node 转换为弱 Release 并关闭客户端强 Node 的客户端,但是 保留客户端的弱 Node

零强 Node 和零强 VMO 句柄将导致缓冲区 收集失败(所有 Node 个客户端都将看到 ZX_CHANNEL_PEER_CLOSED以及全部 close_weak_asapclient_end将会 看到 ZX_EVENTPAIR_PEER_CLOSED,但 sysmem(有意)不会注意到 这种情况,直到所有 Node 都做好分配准备。对于 才能成功分配,至少要存在一个强 Node 但在该客户端收到 VMO 句柄之后, 客户端可以 BufferCollection.Release 并关闭客户端,而不用 导致此类故障。

这也暗示了 fuchsia.sysmem2/Node.SetWeakOk,但不意味着 暗示 SetWeakOkfor_children_also true,这可以发送 视情况进行单独调整。

请求

<空>

SetWeakOk

这可告知系统,客户端已准备好关注 close_weak_asap

如果发送,此邮件必须早于 fuchsia.sysmem2/BufferCollection.WaitForAllBuffersAllocated

所有使用弱 fuchsia.sysmem2/BufferCollection 的参与者都必须 请在 WaitForAllBuffersAllocated之前发送此消息,或者让家长发送此消息 Node 必须发送 fuchsia.sysmem2/Node.SetWeakOk 以及 for_child_nodes_also true,否则 WaitForAllBuffersAllocated 将 触发缓冲区收集失败。

此消息必不可少,因为系统并非总是 老客户没有意识到需要关注 close_weak_asapZX_EVENTPAIR_PEER_CLOSED并关闭所有剩余项 sysmem 弱 VMO 会尽快处理。收到此消息并要求 表明他们接受总体评分的这一方面, 因此会避免旧版客户端收到信号较弱的情况 VMO 无法让 sysmem 以任何方式使该 VMO 稍后快速关闭 (并且基于每个缓冲区)。

不处理 close_weak_asap 和也不处理的参与者 通过 WaitForAllBuffersAllocated 检索任何 VMO 句柄,不需要 发送 SetWeakOk(不需要让父级发送 NodeSetWeakOkfor_child_nodes_also 为 true)。但是,如果 同一参与者有一个检索 VMO 的子项/委托, 子级/受托人需要提前发送 SetWeakOk WaitForAllBuffersAllocated

  • 请求 for_child_nodes_also 如果存在且 true,则表示直接 在此消息之后创建的该节点的子节点以及所有子节点 这些节点的后代的行为将如同 SetWeakOk 这些节点在此节点之前创建的任何子节点 消息。此设置是“固定的” 不含此布尔值且设置为 true 的后续 SetWeakOk 不会重置 服务器端布尔值。如果这会给参与者带来问题, 解决方法是对子级执行 SetWeakOk 并将 for_child_nodes_also 设为 true 令牌。参与者只能设置 for_child_nodes_also:如果参与者确实能够承诺 针对其自身较弱的 VMO 句柄,遵循 close_weak_asap,并且 参与者持有相应子节点的 VMO 句柄持有较弱的 VMO 句柄 Node。设置 for_child_nodes_also 后,后代 Node 使用 sysmem(1) 的容器可能较弱,尽管它们的客户端 sysmem1 Node 无法通过任何直接方式连接到 SetWeakOk 或任何 了解 close_weak_asap 的直接方式。这仅适用于 使用 sysmem(1) 的此 Node 的后代,而不是此 直接从 sysmem2 令牌转换为 sysmem(1) 时为 Node 令牌,除非此 Node 的祖先实体,否则会导致分配失败 指定的 for_child_nodes_also 为 true。

请求

名称类型
payload NodeSetWeakOkRequest

同步

确保之前的邮件已在服务器端收到。这是 在之前有创建新令牌的消息之后, 因为在发送 将令牌发送给其他参与者。

对符合以下条件的令牌调用 fuchsia.sysmem2/BufferCollectionToken.Sync: 不是/不是有效令牌,可能会导致 Sync 永久停止。请参阅 fuchsia.sysmem2/Allocator.ValidateBufferCollectionToken(单向) 降低恶意/仿冒攻击的可能性 fuchsia.sysmem2/BufferCollectionToken,需支付一次往返的费用。 另一种方法是将令牌传递给 fuchsia.sysmem2/Allocator/BindSharedCollection,该集合还会验证 作为交换 fuchsia.sysmem2/BufferCollection 渠道,以及 然后可以放心地使用 fuchsia.sysmem2/BufferCollection.Sync 出现卡顿。

创建一个或多个 fuchsia.sysmem2/BufferCollectionToken 后 然后启动并完成Sync,就可以放心地将 BufferCollectionToken客户端结束给知道 其他服务器在发送令牌时 发送到系统内存的 fuchsia.sysmem2/Allocator.BindSharedCollection 消息。这是一个 创建令牌的高效方法,同时避免不必要的往返。

其他选项包括等待每个 fuchsia.sysmem2/BufferCollectionToken.Duplicate 需要完成 单独调用(在每个后面单独调用 Sync),或者调用 fuchsia.sysmem2/BufferCollection.Sync 令牌 已通过以下方式转换为BufferCollectionfuchsia.sysmem2/Allocator.BindSharedCollection 或使用 fuchsia.sysmem2/BufferCollectionToken.DuplicateSync,其中包含 可以一次创建多个令牌

请求

<空>

响应

名称类型
payload Node_Sync_Result

结构体

BufferCollection_CheckAllBuffersAllocated_Response

fuchsia.sysmem2/collection.fidl 中定义

<空>

Node_Sync_Response

fuchsia.sysmem2/collection.fidl 中定义

<空>

PixelFormatAndModifier

fuchsia.sysmem2/constraints.fidl 中定义

字段类型说明默认
pixel_format fuchsia.images2/PixelFormat

如果参与者在发送到 sysmem 的消息中指定,可以为此字段指定任意值。 PixelFormat 值。指定 不允许使用 kInvalid

参与者可以指定 fuchsia.images2/PixelFormat.DO_NOT_CARE 如果参与者需要指定 ImageFormatConstraints 而不指定 限制 pixel_format

无默认设置
pixel_format_modifier fuchsia.images2/PixelFormatModifier

特定修饰符(不仅仅是标志),或 FORMAT_MODIFIER_DO_NOT_CARE, 从 fuchsia.images2 format_modifier.fidl 中定义的一组值中提取。

无默认设置

精英

CoherencyDomain 柔性环境

类型:uint32

fuchsia.sysmem2/constraints.fidl 中定义

INACCESSIBLE 仅适用于没有 CPU 访问 缓冲区。

无法从 CPU 访问的设备本地内存为 CoherencyDomain INACCESSIBLE,即使可能会使设备(实体或实体设备) virtual)将数据从 INACCESSIBLE 缓冲区复制到 对 CPU 可见换句话说,INACCESSIBLE 并不意味着安全 而安全则意味着无法访问

CPU 表示提供方必须确保使用方可以读取生成的数据 使用 CPU,且使用者无需额外执行缓存操作 已由制作人(根据需要)执行

RAM 表示生产者必须确保生成的数据完全存在 没有任何脏 CPU 缓存行,且使用方必须使使用方失效 (或者通常刷新和失效)CPU 缓存,然后使用 CPURAM 域名可能比 CPU 域名更快, 这种访问方式是通过硬件 DMA 进行的,因为在这种情况下,不需要 CPU 缓存操作, 因为没有参与者实际使用 CPU 执行读取/写入操作

添加时间:19

名称说明
0
1
2

错误:柔性环境

类型:uint32

fuchsia.sysmem2/error.fidl 中定义

无论错误代码是什么,任何客户端重试时间都应该非常有限, 数字(如果有)。

Error 值绝不应存储在 zx_status_t 中,因为正值 已弃用。

添加时间:19

名称说明
0

这在此错误枚举中不是有效的错误值。服务器将 切勿将此值作为失败代码发送。该值不会被视为 “success”。在某些语言中,本地默认初始化的 Error 实例将具有此值,直到使用有效的 正错误代码。

1

未指明的错误。

如果该错误代码不适用其他错误代码,则使用此错误代码 可能不是因为通过 出现此错误的渠道。

客户端应以一般错误的形式处理此错误。

例如,当另一个客户端渠道具有 意外关闭(未发送 fuchsia.sysmem2/Node.Release),因此会导致任何 节点相同。在这种用法中, 不是接收客户端的“错”- 没有理由 因为接收客户端可能只能执行 处理错误的方法,至少不是直接的。

再举一例,如果系统调用正常 预期会成功的操作意外失败,并且 不明确的原因 “追责”客户端。

客户端绝不应要求 / 依赖导致错误的特定原因 将导致 UNSPECIFIED 继续,因为任何特定的错误原因都可能 则可能导致以后出现更具体的错误代码。

2

某个必填字段未设置或指定的值无效。请参阅 日志以获取更多信息。

当在 顺序错误或与协议规则不符。

3

未找到客户指定的对象或 ID。

4

该对象句柄没有足够的权限来执行请求。

5

由于缺少可用内存,无法满足分配条件。

内存耗尽可能特定于所选的堆 因此在某些情况下,可能会发生此错误 尽管正常的系统 RAM 并没有即将耗尽, 配置和选择的堆。

6

请求有效,但无法满足,可能是由于硬件 限制。如果参与该分配流程的参与者 具有不兼容的约束条件(大致来说就是空的交集)。 如需了解详情,请参阅日志。如果参与者可能 可能会被视为可选,请参阅 BufferCollectionTokenGroup

如果现有的缓冲区空间不足, 集合来满足额外令牌(包括派生的子树) 使用 fuchsia.sysmem2/BufferCollection.AttachToken 创建。

如果客户端的节点位于某个组下,而另一个组 会改为选择群组下级群组

7

系统尚未尝试分配。正在呼叫 fuchsia.sysmem2/BufferCollection.WaitForAllBuffersAllocated 会 屏蔽。

8

BufferCollectionTokenGroup 个子词元选择组合过多 并被考虑,导致 sysmem 放弃分配 而不是枚举其余部分。

表格

AllocatorAllocateNonSharedCollectionRequest 资源

fuchsia.sysmem2/allocator.fidl 中定义

Ordinal字段类型说明
collection_request server_end<BufferCollection>

AllocatorAllocateSharedCollectionRequest 资源

fuchsia.sysmem2/allocator.fidl 中定义

Ordinal字段类型说明
token_request server_end<BufferCollectionToken>

AllocatorBindSharedCollectionRequest 资源

fuchsia.sysmem2/allocator.fidl 中定义

Ordinal字段类型说明
token BufferCollectionToken
buffer_collection_request server_end<BufferCollection>

AllocatorGetVmoInfoRequest 资源

fuchsia.sysmem2/allocator.fidl 中定义

Ordinal字段类型说明
vmo handle<vmo>

需要设置 vmo;所有权转移给服务器 因此在大多数情况下,客户端会复制一个标识名并将 重复。

AllocatorSetDebugClientInfoRequest

fuchsia.sysmem2/allocator.fidl 中定义

Ordinal字段类型说明
name string[256]
id uint64

AllocatorValidateBufferCollectionTokenRequest

fuchsia.sysmem2/allocator.fidl 中定义

Ordinal字段类型说明
token_server_koid zx/Koid

Allocator_GetVmoInfo_Response 资源

fuchsia.sysmem2/allocator.fidl 中定义

Ordinal字段类型说明
buffer_collection_id uint64
buffer_index uint64
close_weak_asap handle<eventpair>

Allocator_ValidateBufferCollectionToken_Response

fuchsia.sysmem2/allocator.fidl 中定义

Ordinal字段类型说明
is_known bool

BufferCollectionAttachLifetimeTrackingRequest 资源

fuchsia.sysmem2/collection.fidl 中定义

Ordinal字段类型说明
server_end handle<eventpair>
buffers_remaining uint32

BufferCollectionAttachTokenRequest 资源

fuchsia.sysmem2/collection.fidl 中定义

Ordinal字段类型说明
rights_attenuation_mask zx/Rights
token_request server_end<BufferCollectionToken>

BufferCollectionConstraints

fuchsia.sysmem2/constraints.fidl 中定义

对分配的缓冲区的约束条件以及对图像的约束条件(可选) 存储在缓冲区中的资源。可以按参与者指定这些限制。 sysmem 服务会实现来自多个 参与者。

添加时间:19

Ordinal字段类型说明
usage BufferUsage

usage 是对系统的提示,它有可能有助于 最优 fuchsia.images2/PixelFormat 和/或 pixel_format_modifier 如果存在多个兼容选项,则会发生此错误。

汇总 fuchsia.sysmem2/BufferCollectionConstraints 时, 按位-OR。

必须至少指定一个 usage 位(不过,对于 fuchsia.sysmem2/BufferCollection.SetConstraints 请求是 未设置请求 constraints 字段,在这种情况下,kNoneUsage 为 是默认值,参与者没有任何限制)。

如果指定 kNoneUsage,它必须是唯一的已设置位,并且没有 VMO 将作为 fuchsia.sysmem2/BufferCollection.WaitForAllBuffersAllocated

min_buffer_count_for_camping uint32

每位参与者可同时享受的缓冲数量 专属使用时间超过暂时性(露营)即可。 在这种情况下,“暂时的”“时长”是指看完视频所需的时间 运行一小段非阻塞代码来完成传输 对相应缓冲区的所有权。例如,从存储空间读取内容、等待 或者执行类似 帧编码或解码不会被视为瞬时时长,即使 有时可能很快就能完成

例如,视频解码器会(至少)指定 的参考帧 + 目前正在解码为 1 帧的帧。但不包括 1 个 异步运行且快速提供 已解码的帧,即使该帧可能归属于某个已解码的帧, 同时对下一帧进行解码时的瞬时时长。

参与者不得露营超过此处指定的缓冲区(但 暂时使用),否则处理可能会卡住。

在聚合 BufferCollectionConstraints 时,这些值会相加。

在测试场景中,对于任何 Transformer 来说, (在此例中,一次屏幕刷新周期是“显著”的) 上下文)可能会(理想情况下会)被标记为失败。测试中 向参与者提供的缓冲区不得超过 。

min_buffer_count_for_dedicated_slack uint32

每个参与者所需的 Slack 缓冲区数量下限 以便提高处理重叠率 / 提高性能。

在聚合 BufferCollectionConstraints 时,这些值会相加。

参与者通常应在此处指定 0 或 1,通常是 0 为 如果 min_buffer_count_for_camping 已足以保持 20% 的时间处于忙碌状态 而如果缓冲区比严格需要多 1 个,则 1 个比较合适 因为你需要充分休息,确保 100% 的时间都处于忙碌状态 (稍微落后于没有额外缓冲的较低百分比)。

在测试场景中,可能强制将此字段设为 0, 预计参与者可以继续工作,而不会遇到困难。如果 正向进度原因需要一个缓冲区,该缓冲区应该 计入min_buffer_count_for_camping

min_buffer_count_for_shared_slack uint32

min_buffer_count_for_dedicated_slack类似,不同之处在于 汇总这些值最大值(而不是添加)。此处的值不是 已与任何参与者的min_buffer_count_for_dedicated_slack共享。

参与者可以指定 >如果参与者希望确保 但整体上还存在一些 Slack,但不需要将它用于专用状态。

选择是使用 min_buffer_count_for_dedicated_slack 还是 min_buffer_count_for_shared_slack(或两者)通常约为 额外的 Slack 对性能的提升程度。

在测试场景中,可能强制将此字段设为 0, 预计参与者可以继续工作,而不会遇到困难。如果 正向进度原因需要一个缓冲区,该缓冲区应该 计入min_buffer_count_for_camping

min_buffer_count uint32

挑剔的参与者很不幸,可能需要 buffer_count 的较小范围,甚至是特定的 buffer_count。这个 字段应保持 0,除非参与者确实必须将此字段设置为 约束整体 BufferCollectionInfo.buffer_count。任何此类 参与者仍应填写 min_buffer_count_for_* 字段, 适当的选择。

如果未设置此字段,则逻辑 min_buffer_count 为 0。

max_buffer_count uint32

挑剔的参与者很不幸,可能需要 buffer_count 的较小范围,甚至是特定的 buffer_count。这个 字段应保持 0,除非参与者确实必须将此字段设置为 约束整体 BufferCollectionInfo.buffer_count。任何此类 参与者仍应填写 min_buffer_count_for_* 字段。

如果未设置此字段,则逻辑 max_buffer_count 为 0xFFFFFFFF。

buffer_memory_constraints BufferMemoryConstraints

BufferCollectionSettings.buffer_settings 的可选约束条件。

有意设置“image_format_constraints”的参与者将会 通常通过以下方法隐式指定最小缓冲区空间: image_format_constraints,并且可能仅指定最大缓冲区 通过 buffer_memory_constraints 上传。

如果未设置,客户端会指定“随意”关于任何缓冲区内存 限制条件。

image_format_constraints vector<ImageFormatConstraints>[64]

对所存储图片的图片格式参数的可选限制 该集合的缓冲区中这包括 fuchsia.images2/PixelFormatpixel_format_modifier(用于平铺) 等)。这些约束条件可按 pixel_formatpixel_format_modifier。已复制 pixel_format 不允许使用 pixel_format_modifier 对。

汇总时,只有 pixel_formatpixel_format_modifier 对 由所有参与者指定,其中包含非零值 大小为 image_format_constraints(非 null) BufferCollectionConstraints)。

参与者可以指定pixel_format fuchsia.images2/PixelFormat.DO_NOT_CARE 和/或 pixel_format_modifier fuchsia.images2/FORMAT_MODIFIER_DO_NOT_CARE 允许选择任意值,但必须至少有一个参与者 指定一种特定的格式,这样整体分配才能成功。

在 SetConstraints 消息中,未设置或长度为零意味着无图片格式 限制条件;如果没有其他参与者,则可以分配原始缓冲区 指定任何 image_format_constraints 条目。

BufferCollectionInfo 资源

fuchsia.sysmem2/results.fidl 中定义

缓冲区集合及其缓冲区的相关信息。

添加时间:19

Ordinal字段类型说明
settings SingleBufferSettings

这些设置会应用于初始缓冲区中的所有缓冲区 分配。

此字段将始终由 sysmem 设置。

buffers vector<VmoBuffer>[128]

VMO 处理 中每个缓冲区的 VMO 处理 。

该矢量的大小是 buffer_count(不会发送 buffer_count)。 )。

所有缓冲区 VMO 句柄的大小和访问权限都相同。尺寸 位于 settings.buffer_settings.size_bytes 中。

VMO 访问权限取决于 分配缓冲区集合时指定的客户端。例如, 表示为只读使用情况的客户端将收到未写入的 VMO 权利。此外,通过上述 参数, BufferCollectionToken.Duplicate() 调用。

此字段始终包含 VmoBuffer(s),即使参与者也是如此 指定不需要 VMO 句柄的用法。这样一来, vmo_usable_start 值,以防出现任何 提供给参与者

此字段将始终由 sysmem 设置,即使参与者并未设置也是如此 指定所有缓冲区使用情况(但 fuchsia.sysmem2/VmoBuffer.vmo 子字段)。

buffer_collection_id uint64

此编号在每次启动时的所有逻辑缓冲区集合中都是唯一的。

所有 BufferCollectionToken 的此 ID 号都是相同的, BufferCollection 和 BufferCollectionTokenGroup 相同的逻辑缓冲区集合(派生自相同的根令牌) 使用 fuchsia.sysmem2.Allocator.CreateSharedCollection 创建,或使用 CreateNonSharedCollection 的一部分。

您可以从 BufferCollectionToken 中检索相同的 ID, BufferCollection 或 BufferCollectionTokenGroup GetBufferCollectionId(以往返于 sysmem 的往返为代价)。

此字段将始终由 sysmem 设置。

BufferCollectionSetConstraintsRequest 资源

fuchsia.sysmem2/collection.fidl 中定义

Ordinal字段类型说明
constraints BufferCollectionConstraints

BufferCollectionTokenCreateBufferCollectionTokenGroupRequest 资源

fuchsia.sysmem2/collection.fidl 中定义

Ordinal字段类型说明
group_request server_end<BufferCollectionTokenGroup>

BufferCollectionTokenDuplicateRequest 资源

fuchsia.sysmem2/collection.fidl 中定义

Ordinal字段类型说明
rights_attenuation_mask zx/Rights
token_request server_end<BufferCollectionToken>

BufferCollectionTokenDuplicateSyncRequest

fuchsia.sysmem2/collection.fidl 中定义

Ordinal字段类型说明
rights_attenuation_masks vector<zx/Rights>[64]

BufferCollectionTokenGroupCreateChildRequest 资源

fuchsia.sysmem2/collection.fidl 中定义

Ordinal字段类型说明
token_request server_end<BufferCollectionToken>

必须设置。

rights_attenuation_mask zx/Rights

如果未设置,则默认值为 ZX_RIGHT_SAME_RIGHTS

BufferCollectionTokenGroupCreateChildrenSyncRequest

fuchsia.sysmem2/collection.fidl 中定义

Ordinal字段类型说明
rights_attenuation_masks vector<zx/Rights>[64]

BufferCollectionTokenGroup_CreateChildrenSync_Response 资源

fuchsia.sysmem2/collection.fidl 中定义

Ordinal字段类型说明
tokens vector<BufferCollectionToken>[64]

BufferCollectionToken_DuplicateSync_Response 资源

fuchsia.sysmem2/collection.fidl 中定义

Ordinal字段类型说明
tokens vector<BufferCollectionToken>[64]

BufferCollection_WaitForAllBuffersAllocations_Response 资源

fuchsia.sysmem2/collection.fidl 中定义

Ordinal字段类型说明
buffer_collection_info BufferCollectionInfo

BufferMemoryConstraints

fuchsia.sysmem2/constraints.fidl 中定义

添加时间:19

Ordinal字段类型说明
min_size_bytes uint64

将被视为 1

max_size_bytes uint64

unset 被视为 0xFFFFFFFFFFFFFFFF。

physically_contiguous_required bool

如果为 false,缓冲区 VMO 的物理页面可以是非连续的。时间 true,缓冲区 VMO 的物理页面必须依序连续。答 不需要物理连续 VMO 的客户端仍必须接受 物理连续虚拟机VMO。

secure_required bool

如果为 true,则参与者需要安全内存。

汇总 BufferCollectionConstraints 时,这些值为布尔值 OR。

cpu_domain_supported bool

如果为 true(或 BufferMemoryConstraints 不存在时),则 参与者可以由 sysmem 选择 CPU 域。

如果选择了 CPU 网域,参与者必须确保 CPU 可以读取 或将数据写入缓冲区,而无需 。

换言之,如果生产者参与者将数据 DMA 直接 非缓存一致性架构(例如 arm),生产者必须确保 CPU 缓存已清理。DMA 写入前的缓冲区,以及 在 DMA 写入后、指示 其他参与者就可以发送该缓冲区了如果消费者参与者 在非缓存一致性架构(例如 arm,使用方必须在 DMA 之前刷新 CPU 缓存 阅读。

不执行任何 DMA 且仅使用 CPU 的参与者只能写入和读取 缓冲区(在应该缓存时),而无需执行任何 CPU 缓存操作。

ram_domain_supported bool

如果为 true,参与者可以由系统内存选择 RAM 域。

如果选择了 RAM 域,则 RAM 中必须有提供方数据 (采用 CPU 缓存状态,使 RAM 数据不会被 脏 CPU 缓存行将不正确的数据写入 RAM)和消耗方 使用 CPU 读取必须在读取之前使 CPU 缓存失效( 生产者不保证不会过时的“干净”缓存行)。

换言之,如果生产者参与者使用 CPU 来 非缓存一致性架构(例如 arm),生产方必须刷新 先将数据传输到 RAM,然后再通知另一个参与者 准备就绪。如果消费者参与者使用 CPU 读取 非缓存一致性架构(如 arm),参与者必须 失效(通常是刷新+失效,同时知道没有缓存 脏数据行)读取缓冲区。

不对缓冲区进行任何 CPU 访问的仅使用 RAM 的参与者可以 只需在应该缓冲区与缓冲区进行 DMA 操作时,无需 执行任何 CPU 缓存操作

inaccessible_domain_supported bool

如果为 true,参与者可以由系统内存选择“无法访问” 网域。

如果选择“无法访问的域”,CPU 将读取和写入数据 被阻止。尝试通过 CPU 读取/写入数据可能会导致 UB 中和/或进程终止。

如果选择“无法访问的网域”,则参与者只能操作 使用硬件执行的特定媒体市场区域,或针对具体平台的 DMA 安全环境(将执行所需的 CPU 缓存操作) 类似于 RAM 域参与者的操作方式)。

安全堆仅支持 INACCESSIBLE 网域,并且会导致分配失败 如果除NONE_USAGE以外的BufferUsage的任何参与者未 将 in access_domain_supported 设置为 true。

如果选择“无法访问的域”,参与者(外部 (安全/DRM 环境)均不得尝试映射缓冲区, 不会尝试执行任何 CPU 缓存操作。就这一点而言 类似于 RAM 域,所有参与者仅执行 DMA, 进行 CPU 访问的参与者。

permitted_heaps vector<Heap>[64]

参与者可以接受哪些堆。未参加活动的参与者 请注意在哪个堆内存上分配了内存应保持未设置此字段。答 只有在所有参与者都明确指示时,才会选择安全堆 安全堆可通过 heap_permitted 接受,或指定 NONE_USAGE

BufferMemorySettings

fuchsia.sysmem2/results.fidl 中定义

这些设置是针对缓冲区集合的所有缓冲区的内存相关设置。

添加时间:19

Ordinal字段类型说明
size_bytes uint64

此字段将始终由 sysmem 设置。

is_physically_contiguous bool

此字段将始终由 sysmem 设置。

is_secure bool

此字段将始终由 sysmem 设置。

coherency_domain CoherencyDomain

此字段将始终由 sysmem 设置。

heap Heap

从中分配缓冲区的特定堆。

此字段将始终由 sysmem 设置。

BufferUsage

fuchsia.sysmem2/usages.fidl 中定义

描述客户端如何访问缓冲区的内容。

添加时间:19

Ordinal字段类型说明
none uint32

如果客户端设置了此字段,则客户端不应设置任何其他 字段。此字段中的唯一有效位是 NONE_USAGE(如果设置了此字段,则必须设置此字段)。这里的 和此字段中设置的 1 位实质上 客户端实际上意味着它们不会使用缓冲区,因此无需 任何 VMO(不仅仅是未能填写表格)。

cpu uint32

如果设置,则会保留 CPU 使用率。请参阅 usages.fidl 中的 CPU_USAGE_* 标志。

vulkan uint32

如果设置,则会存储 vulkan 用法位。请参阅VULKAN_IMAGE_*和 Usages.fidl 中的 VULKAN_BUFFER_* 位。VULKAN_USAGE_* 位 “定义/名称”已被弃用。

display uint32

如果设置,则会保留显示屏使用位。在以下位置查看 DISPLAY_USAGE_* 位 usages.fidl.

video uint32

如果设置,则会存储视频使用位。请参阅 usages.fidl 中的 VIDEO_USAGE_* 位。

配置

fuchsia.sysmem2/config.fidl 中定义

此类型在 sysmem_config.persistent_fidl 文件中进行了 fidl::Persist() 处理 由汇编工具在 sysmem 网域配置中读取,而由 sysmem 读取

一般情况下,最好使用 json[5],但我们要生成这个配置 使用 FIDL 类型进行 Rust 开发(以避免重复并利用 FIDL rust codegen),并且没有适用于 FIDL 类型的 JSON 架构。

目前没有机制可以在运行时更改此配置中的任何内容 还是从启动到启动的整个过程。每次运行汇编工具时,此配置都是静态的。

请参阅 src/lib/assembly/config_schema/src/platform_config/sysmem_config.rs 系统内存配置的各个方面,直接在板信息中内嵌指定 或组装平台配置sysmem 配置的两个部分 重叠。此处的配置适用于 sysmem 配置的各个方面, 过于冗长,无法直接包含在主板信息或组装平台中 配置。此外,部分/大多数像素格式费用条目 以编程方式生成(根据本注释)。

在按汇编工具进行聚合之前,有多个 .persistent_fidl 每个文件存储自己的 Config 实例。板信息和组装 平台配置会列出包含板信息的输入 Persistent_fidl 文件 逻辑上,然后再进行组装平台配置。整个文件列表 以便之后的文件可以替换/替换之前文件中的信息。

由于此类型仅适用于持续存在的音效,其中 序列化实例的长度没有限制,我们不必限制 矢量元素计数。

已添加:NEXT

Ordinal字段类型说明
format_costs vector<FormatCostEntry>

这是将会考虑的 FormatCost 条目的有序列表 由系统内存来打破所有参与者支持的内容形式之间的联系 缓冲区集合

在配置汇总期间,如果后续条目具有匹配的 FormatCostKey, 系统会省略/移除较早的条目。这样,以后的文件就可以 覆盖之前文件中的条目,并允许 汇编平台配置,以覆盖在 面板信息。

此矢量通常不会有两个匹配的条目。 配置中的 pixel_format、pixel_format_modifier 和 buffer_usage_bits 由 sysmem 从 sysmem_config.persistent_fidl 加载的实例。如果不知道 这两个字段中确实有两个条目匹配,则 sysmem 可以忽略除一个外的所有其他条目 任意选择的条目

FormatCostEntry

fuchsia.sysmem2/config.fidl 中定义

FormatCostEntry 可用于影响 PixelFormatAndModifier 用于缓冲区收集,可以选择将 BufferUsage 考虑在内。

默认费用为 f32::MAX,即任何具有非 MAX 值的指定费用 会优先使用指定的格式 FormatCost 条目。

具有相同 pixel_format、pixel_format_modifier 和 required_usage_bits 作为前一个条目将覆盖该条目。 为便于匹配,如果缺少 pixel_format_modifier 就会与 LINEAR 匹配,并且 缺失 required_buffer_usage_bits 则匹配全 0 使用位。

板级信息 sysmem_defaults 条目在逻辑上早于平台 sysmem 条目。

在以下情况下,Sysmem 将使用生成的 FormatCostEntry 汇总列表 打破了所有 缓冲区集合的参与者。对于每种相互支持的格式 系统会忽略格式不匹配的条目, 系统将忽略 buffer_usage_bits 设置。在其余条目中,该条目 与汇总的参与者使用情况数据最多的是 决定费用(如果相等,则以较晚者为准)。然后, 会选择费用最低的广告格式如果费用相当(费用相等),则 会随意断开,但并非随机。

但这并不作为一种机制,用于阻止用户选择存在 缓冲区集合的所有参与者都支持。如果参与者 声称支持某种格式,但未能正确处理该格式, 应进行修正以正确处理该格式,或者进行更改以停止声明版权 支持该格式

此机制旨在影响广告格式选择 更高效的格式、更低的内存带宽占用、 等等,并考虑到可能出现的怪异行为, 指定主板或整体平台配置所独有

已添加:NEXT

Ordinal字段类型说明
key FormatCostKey

必须设置。如果两个条目具有逻辑上相等的键(在字段之后) 默认值),后一个条目会覆盖前一个条目。

cost float32

必须设置。费用较低者胜出,但也会看到 FormatCostKey 字段 re. 先按格式和用法位数过滤条目。

当两个视频条目(每个条目的 所有参与者均支持其格式)时, 具有不同的成本,成本较低的条目(及其 格式)。

对于非测试场景,请仅使用费用值 >0.0(通常至少为 1.0),其中包含 0.0, 测试。

FormatCostKey

fuchsia.sysmem2/config.fidl 中定义

具有相同 pixel_format、pixel_format_modifier 和 required_usage_bits 作为前一个条目将覆盖该条目。 为便于匹配,如果缺少 pixel_format_modifier 就会与 LINEAR 匹配,并且 缺失 required_buffer_usage_bits 则匹配全 0 使用位。

已添加:NEXT

Ordinal字段类型说明
pixel_format fuchsia.images2/PixelFormat

Pixel_format 和 pixel_format_modifier 是此 需遵守 FormatCost 条目。

必须设置。

pixel_format_modifier fuchsia.images2/PixelFormatModifier

Pixel_format 和 pixel_format_modifier 是此 需遵守 FormatCost 条目。

如果未设置,等同于 LINEAR。

buffer_usage_bits BufferUsage

设置后,仅当缓冲区集合的 至少设置过这些使用位

缓冲区集合具有聚合的 BufferUsage,即并集 每个参与者的 BufferUsage 位数。FormatCost 条目数和 设置位会被忽略。在其他广告中,格式匹配的 最多的使用量位设置决定了 缓冲区收集。

然后,在 该模式的所有参与者共同支持的格式 缓冲区收集。

此字段的主要用途是允许“挥手关闭”一种 可以用,但是效果不佳。 在这种情况下,如果有问题的组合 使用位的比例。如果此格式是 缓冲区参与者之间唯一相互支持的格式 。

如果未设置任何使用位,则等同于设置零使用位,即应用相应条目 除非适用另一个具有更具体的用法的条目。

在某些情况下,让所有条目都省略此字段是一种合理的做法, 当/如果仅根据格式费用选择格式(忽略使用情况),为 。

FormatCosts

fuchsia.sysmem2/config.fidl 中定义

这是格式成本文件中持久性 Fid 的根源。格式 汇编工具读取成本文件,然后合并为 sysmem 网域配置中的 sysmem_config.persistent_fidl 文件(请参阅“配置”) )。

一般情况下,最好使用 json[5],但我们要生成这个配置 使用 FIDL 类型进行 Rust 开发(以避免重复并利用 FIDL rust codegen),并且没有适用于 FIDL 类型的 JSON 架构。

虽然生成的 sysmem_config.persistent_fidl 是单个文件 包含 sysmem 配置的多个方面,这与格式成本文件不同 仅包含格式费用。我们不介意 但最好是将 sysmem 的域配置下载到单个文件 。

已添加:NEXT

Ordinal字段类型说明
format_costs vector<FormatCostEntry>

这些条目将以 ['fuchsia.sysmem2.Config.format_costs'](参见上文),除非被替换为 后续条目(可以在同一个矢量中,也可以在后续处理的文件中) 由汇编工具在汇总期间触发)。

fuchsia.sysmem2/constraints.fidl 中定义

对堆实例的引用。

一个给定的堆实例可以有多个 Heap,这些实例可用于 引用了堆实例在不知情的情况下比较 Heap 个表 用这些 Heap 别名确定是否有两个 Heap 表的可靠方法并不可靠 引用同一堆(匹配表示是,但不匹配则表示可能)。 允许堆别名可更轻松地重命名 Heap.type

添加时间:19

Ordinal字段类型说明
heap_type string[128]

堆的类型,使用根据 此 API 的注释中介绍了 fuchsia.sysmem.heap.bind 文件。

示例:

  • &quot;fuchsia.sysmem.heap.HEAP_TYPE.SYSTEM_RAM&quot;
  • &quot;fuchsia.goldfish.platform.sysmem.heap.HEAP_TYPE.HOST_VISIBLE&quot;
id uint64

堆的 uint64 ID。只需为每个(类型、 启动)元组。也就是说,指定的堆 ID 仅在 机器的当前启动(而不是跨多次启动),并且仅在 Heap.type

对于引用单例堆的 Heap.type,参与者可以是 指定单例堆 fuchsia.sysmem2.BufferMemoryConstraints.permitted_heaps 可能会保留 取消设置此字段,或者将其设为 0。系统始终会填写此 指定的堆的 fuchsia.sysmem2.BufferMemmorySettings.heap(适用于单例堆, id 字段会被 sysmem 设置为 0)。

ImageFormatConstraints

fuchsia.sysmem2/constraints.fidl 中定义

描述了对缓冲区中图像数据布局的约束。

Ordinal字段类型说明
pixel_format fuchsia.images2/PixelFormat

存在以下限制的 fuchsia.images2/PixelFormat

pixel_formatpixel_format_modifier 字段加起来为 会被服务器视为一个额外的 pixel_format_and_modifiers, 条目。

一位参与者可以有多个 fuchsia.sysmem2/PixelFormatAndModifier

  • 如果不同位置的图片约束条件相同 PixelFormatAndModifier,参与者可以列出更多 PixelFormatAndModifier pixel_format_and_modifiers 字段。这样可以减少 ImageFormatConstraints,而无需更改 意思是将一堆 ImageFormatConstraints 只是 pixel_formatpixel_format_modifier(总体指定相同的列表) PixelFormatAndModifier)。
  • 如果不同 PixelFormatAndModifier 的图片约束条件不同, 参与者可以使用单独的 image_format_constraints中有 ImageFormatConstraints 个条目,每个条目 具有不同图片的一组 PixelFormatAndModifier 限制条件。
  • 参与者可以拥有两个 image_format_constraints 但这种 并不是表示这种情况的最简洁的方式, 可以通过指定两个 单个 ImageFormatConstraints 中的 PixelFormatAndModifier

ImageFormatConstraints 的其他字段经常会 相差 pixel_formatpixel_format_modifier - 例如, 线性格式,以支持比平铺格式更小的大小上限。

另请参阅 fuchsia.sysmem2/ImageFormatConstraints.pixel_format_and_modifiers.

此字段必须设置为 fuchsia.images2/PixelFormat.INVALID pixel_format_and_modifiers 不为空。也就是说, 每 ImageFormatConstraints 至少一个 PixelFormatAndModifier。如果 已设置 pixel_format_modifier,还必须设置此字段。

参与者可以指定 fuchsia.images2/PixelFormat.DO_NOT_CARE 如果参与者需要指定 ImageFormatConstraints 而不指定 限制 pixel_format

pixel_format_modifier fuchsia.images2/PixelFormatModifier

应用以下约束条件的像素格式修饰符。

pixel_formatpixel_format_modifier 字段加起来为 会被服务器视为一个额外的 pixel_format_and_modifiers, 条目。

这个值来自 fuchsia.images2 format_modifier.fidl, 与 pixel_format 一同提供。

另请参阅 pixel_format_and_modifiers

如果设置了 pixel_format 但未设置 pixel_format_modifier, 取决于其他字段:

  • 如果 pixel_formatDO_NOT_CARE,则像素格式修饰符为 隐式为 FORMAT_MODIFIER_DO_NOT_CARE
  • 如果 BufferCollectionConstraints.usage 不是 NONE,则像素为 格式修饰符隐式地为 FORMAT_MODIFIER_LINEAR
  • 否则,像素格式修饰符隐式 FORMAT_MODIFIER_DO_NOT_CARE

设置后,此值是一个特定的修饰符(不仅仅是标志),或者 FORMAT_MODIFIER_DO_NOT_CARE,来自于 fuchsia.images2 format_modifier.fidl。

color_spaces vector<fuchsia.images2/ColorSpace>[32]

留空会出错。如果输入重复,则会出现错误。“任意排序”现为 而不是错误。

客户端可以指定单个条目 [fuchsia.sysmem2/ColorSpace.DO_NOT_CARE] if the client doesn't want to constrain which ColorSpaceis chosen. At least one participant must specify at least oneColorSpacevalue other than ColorSpace.DO_NOT_CARE`,否则分配将会失败。

min_size fuchsia.math/SizeU

允许的最小尺寸(以像素为单位)。

例如,视频解码器参与者可以将此字段设为 流可能指定的最小尺寸。在 相反,required_min_size 将设置为当前指定的尺寸 音频流。虽然 min_size 会采用最大值进行汇总, required_min_size 通过计算最小值

发送到系统内存时,如果参与者已 准备好处理尽可能小的非零图像布局 仅受 pixel_format 隐式施加的约束限制 和 pixel_format_modifier。也可以将此字段设为 让应用支持参与者可处理的最小尺寸

制作方应设置 min_size,并将宽度和高度均设置为 生产者可能使用的非零最小宽度和高度 生成。例如,视频解码器可以设置单个视频的大小, 宏块

从 sysmem 接收内容时,将始终设置此字段, 宽度和高度都为 0,因为必须至少有一个参与者 指定一个非零的最小尺寸(其中宽度和高度均不能 零)。

另请参阅 required_min_size

max_size fuchsia.math/SizeU

大小上限(以像素为单位)。例如,景观可设置该字段(直接 或子参与者)设置为可合成的大小上限。

如果发送到系统内存,则取消设置会被视为 0xFFFFFFFF、0xFFFFFFFF。

从 sysmem 接收内容时,此字段将始终设置。对于宽度和 高度,如果没有强制实施最大值,则子字段将是 0xFFFFFFFF。

另请参阅 required_max_size

min_bytes_per_row uint32

每行的最小字节数,包括 行中的最后一个图片数据。

这有时也称为“步长(以字节为单位)”或“line to line” 偏移”。对于单平面格式,这是指每行的字节数 像素值。对于多平面格式,这是指每行的字节数 平面 0 中的样本数(例如,亮度每行的字节数 样本)。多平面 格式,那么平面 0 以外的平面中每行的字节数格式为 但始终与平面有特定的关系, 0 个字节, 。

ImageFormatConstraints 发送到 sysmem 时,将此字段设置为 可选属性。建议不要设置此字段,除非参与者 需要强制 bytes_per_row 大于最小值 由 min_size.width 暗示的“每宽度像素的步长字节数”的 pixel_format 以及 pixel_format_modifier(另请参阅 ImageFormatStrideBytesPerWidthPixel)和 bytes_per_row_divisor

从 sysmem 收到该结构时,此字段将始终为 设置(如果存在父结构),并且始终至少为 min_size.width 隐含的值,即“每宽度的步长字节数” Pixel"的 pixel_format 再加上 pixel_format_modifier,以及 bytes_per_row_divisor

一些提供方参与者可能更倾向于 ImageFormat.bytes_per_rowImageFormatConstraints.min_bytes_per_row,因为系统内存保证 min_bytes_per_row 与宽度为 min_size.width。不过,生产者参与者需要 size.widthmin_size.width 可以获取与 ImageFormatMinimumRowBytes 中的 min_bytes_per_row(使用 C++),或者可以 只需直接计算 bytes_per_row 即可。

max_bytes_per_row uint32

每行的最大字节数,包括 行中的最后一个图片数据。

当发送到 sysmem 时,该值必须大于等于 max_size.width 隐含的值, “每宽度像素的步长字节数”和 bytes_per_row_divisor,或 限制条件聚合将会失败。如果未设置,则表示参与者无法 需要/希望设置严格的

如果发送到系统内存,则取消设置会被视为 0xFFFFFFFF。

从 sysmem 收到内容时,此字段将始终设置。如果最大值为 则该值将为 0xFFFFFFFF(而非零)。

max_width_times_height uint64

最大像素数。

以像素为单位的最大图片区域通过 fuchsia.sysmem/BufferMemoryConstraints.max_size_bytesfuchsia.sysmem/BufferSettings.size_bytes,也可以 由系统直接强制执行

fuchsia.sysmem2/ImageFormatConstraints.max_size 相反 字段,用于分别限制宽度和高度,此字段用于限制 总像素数。

与此相反, fuchsia.sysmem/BufferMemoryConstraints.max_size_bytes,此字段 不限制 使用像素),并且不会限制非像素字节数 已平铺pixel_format_modifier

宽高比非常窄或非常短的图片效果可能较差 每像素的像素数。内边距和/或 内存带宽开销往往会因极端宽高比增加。 参与者可能表示缺乏对“非常狭窄”或“非常短”的支持 使用 ['fuchsia.sysmem/ImageFormatConstraints.min_size`] 来表示

如果发送到系统内存,则取消设置会被视为 0xFFFFFFFF。

从 sysmem 接收内容时,此字段将始终设置,并且可以设置为 0xFFFFFFFF。

size_alignment fuchsia.math/SizeU

图片 size 的对齐要求。

  • size.width % size_alignment.width 必须为 0。
  • size.height % size_alignment.height 必须为 0。

如果未设置任何值,则视为 1, 1。

display_rect_alignment fuchsia.math/SizeU

display_rect 的对齐要求。

  • display_rect.x % display_rect_alignment.width 必须为 0。
  • display_rect.y % display_rect_alignment.height 必须为 0。
  • display_rect.width % display_rect_alignment.width 必须为 0。
  • display_rect.height % display_rect_alignment.height 必须为 0。

如果未设置任何值,则视为 1, 1。

required_min_size fuchsia.math/SizeU

这些字段可用于确保聚合限制条件 min_sizemax_size,以便 required_min_sizerequired_max_size(以及介于两者之间的任何项满足对齐要求) 允许的值为 ImageFormat.size

例如,生产者视频解码器不希望限制 允许的 ImageFormat.size,因为压缩流可以更改尺寸 但制作者视频解码器需要确保 汇总约束至少允许使用 流中当前位置的未压缩帧。

再举一个例子,意在对视频进行解码的发起方 知道串流中的帧的最大预期大小 因此,通过设置 required_max_size,可以确保分配的缓冲区 足以支持该上限 size。此外,在成功的 发起方也知道消费者参与者 可以接收不超过该上限的 size

提供方或发起者经常会设置这些字段 而不是让使用方设置这些字段

min_sizemax_size 通过有效获取 交集,required_min_sizerequired_max_size 汇总

此字段通过计算每个组成部分的最小值和 required_max_size 通过计算每个组件的最大值来汇总。

如果未设置,则视为 0xFFFFFFFF、0xFFFFFFFF。

required_max_size fuchsia.math/SizeU

另请参阅 required_min_size。如果未设置,则视为 0, 0。

bytes_per_row_divisor uint32

fuchsia_images2.ImageFormat.bytes_per_row % bytes_per_row_divisor必须 为 0。如果未设置,则视为 1。

当 intent 存在以下情况时,最好使用 require_bytes_per_row_at_pixel_boundary 确保“bytes_per_row”将是像素大小的倍数 (以字节为单位)。

如果意图是为了确保size_alignment.width 对齐宽度(以像素为单位)。相比之下,此字段可以指定 “以字节为单位的步长”(从图片开头到第 n 行开头的字节偏移量 从图片开头到第 n-1 行起始部分的字节偏移量,其中包含结果 以字节为单位)需要与指定的字节数对齐。对于 例如,当 PixelFormat.BGR24(24 位颜色;每像素 3 个字节)为 使用中,参与者需要每行像素 从图片开头部分 4 字节对齐的偏移量开始, 表示每行像素末尾有一些填充字节, 下一行像素的起始位置。

虽然任何值 bytes_per_row_divisor 都可以改为 将 size_alignment.width 设置为 "每宽度像素的步长字节数"和步长对齐要求 强制实施步幅对齐要求可以产生 填充超出所需的大小(意味着缓冲区比必要大),并且 也会导致“虚假”size.width;此字段的存在 情况。相反,步长对齐要求(以字节为单位)为 直接在此处指定

start_offset_divisor uint32

vmo_usable_start % start_offset_divisor 必须为 0。系统处理未设置的值 设为 1。

不建议 Producer 参与者设置非零图像开始 偏移(相对于缓冲区基数)除非实际需要,因为并非所有 正确处理非零图像开始偏移。

pixel_format_and_modifiers vector<PixelFormatAndModifier>[64]

(额外的)fuchsia.sysmem2/PixelFormatAndModifier 并遵循以下限制条件

举个非限制性的例子,如果参与者只想设置单个 PixelFormatAndModifier fuchsia.sysmem2/ImageFormatConstraints,则参与者可以执行以下任一操作 (a) 使用 pixel_formatpixel_format_modifier 字段指定 保留一个 PixelFormatAndModifier 的字段,并将它保留为 取消设置 pixel_format_and_modifiers,或 (b) 保留 pixel_format 并 已取消设置 pixel_format_modifier 字段,并放入 pixel_format_and_modifiersPixelFormatAndModifier

如果设置了 pixel_format,服务器将采用 pixel_format, pixel_format_modifier 字段(在进程中取消设置),打包它们 移到一个 PixelFormatAndModifier 中,并将其作为一个矢量 且总大小上限为 MAX_COUNT_PIXEL_FORMAT_AND_MODIFIERS + 1

服务器将 pixel_format, pixel_format_modifier 移到一个 此矢量中的附加条目,则该矢量不得为空。当 结果列表具有多个项,则此矢量中的条目为 等同于(简称)商品详情(尺寸) ImageFormatConstraints 个条目,每 pixel_format_and_modifiers一个 每个条目都有一个 PixelFormatAndModifier,其中 ImageFormatConstraints 条目具有相同的限制(相较于 按字段(不包括 pixel_formatpixel_format_modifier、 或 pixel_format_and_modifiers 字段)。

SetConstraints 消息中,每个条目指定一个 PixelFormatAndModifier,参与者可以接受的 (假设也满足以下约束字段)。

在对 WaitForAllBuffersAllocated 的响应中,此字段将是 并指示选中的PixelFormatAndModifier 使用 pixel_formatpixel_format_modifier 字段指定值。

来自PixelFormatAndModifiersSetConstraints 每个参赛作品的参与者不能重复 image_format_constraints。如果fuchsia.images2.PixelFormat.DO_NOT_CARE 条目中使用,因此条目中不得有任何其他条目(考虑 image_format_constraints 下的条目)与匹配的 pixel_format_modifier。如果使用 FORMAT_MODIFIER_DO_NOT_CARE,则 不得为任何其他条目(考虑 image_format_constraints)和匹配的 pixel_format

一个 PixelFormatAndModifier 值,其可以是 DO_NOT_CAREFORMAT_MODIFIER_DO_NOT_CARE(但不是两者, )可以与来自不同 API 的 PixelFormatAndModifier 结合使用, 另一个字段表示“随意”,导致 可以成功分配的完整 PixelFormatAndModifier。 不过,至少目前不允许一个人参加 指定两个单独的 PixelFormatAndModifier 值,每个值都有 不在乎”不同领域。这并不禁止 PixelFormatAndModifier 与 DO_NOT_CARE 和 PIXEL_FORMAT_DO_NOT_CARE(只有一个 PixelFormatAndModifier 值)。如果客户确实需要指定 与pixel_format相关的一些限制条件, pixel_format_modifier FORMAT_MODIFIER_DO_NOT_CARE 及其他 与“pixel_format”的pixel_format_modifier相关的限制条件 DO_NOT_CARE,客户端可通过复制令牌和 使用/驾驶两个单独的参与者。

另请参阅 pixel_format,了解与多个 单个 ImageFormatConstraints 中的 PixelFormatAndModifier

require_bytes_per_row_at_pixel_boundary bool

Iff 设置且值为 true,结果中的 bytes_per_row_divisor ImageFormatConstraints 肯定是 将字节数设为整数。这可能会导致 与未将此字段设置为 0 时相比,每行末尾的内边距 true,但确保步长可以表示为整数 像素值。

例如,如果所选 PixelFormatB8G8R8,且此字段为 设置为 true,生成的 bytes_per_row_divisor 将是 3.在此示例中,如果其他参与者设置了 bytes_per_row_divisor, 为 4,得到的 bytes_per_row_divisor 将是 12 的倍数。

NodeIsAlternateForRequest 资源

fuchsia.sysmem2/collection.fidl 中定义

Ordinal字段类型说明
node_ref handle<event>

NodeSetDebugClientInfoRequest

fuchsia.sysmem2/collection.fidl 中定义

Ordinal字段类型说明
name string[256]
id uint64

NodeSetDebugTimeoutLogDeadlineRequest

fuchsia.sysmem2/collection.fidl 中定义

Ordinal字段类型说明
deadline zx/Time

NodeSetNameRequest

fuchsia.sysmem2/collection.fidl 中定义

Ordinal字段类型说明
priority uint32
name string[64]

NodeSetWeakOkRequest 资源

fuchsia.sysmem2/collection.fidl 中定义

Ordinal字段类型说明
for_child_nodes_also bool

Node_GetBufferCollectionId_Response

fuchsia.sysmem2/collection.fidl 中定义

Ordinal字段类型说明
buffer_collection_id uint64

Node_GetNodeRef_Response 资源

fuchsia.sysmem2/collection.fidl 中定义

Ordinal字段类型说明
node_ref handle<event>

Node_IsAlternateFor_Response

fuchsia.sysmem2/collection.fidl 中定义

Ordinal字段类型说明
is_alternate bool

SingleBufferSettings

fuchsia.sysmem2/results.fidl 中定义

这些设置和约束条件适用于集合中的所有缓冲区。

添加时间:19

Ordinal字段类型说明
buffer_settings BufferMemorySettings

此字段将始终由 sysmem 设置。

image_format_constraints ImageFormatConstraints

保存数据不是未压缩图片数据的缓冲区将没有 此字段。用于存放未压缩图片数据的缓冲区 可以设置此字段。

至少目前,更改 PixelFormat 需要重新分配 缓冲区。

如果此政策未设置,对图片格式没有任何限制。

VmoBuffer 资源

fuchsia.sysmem2/results.fidl 中定义

添加时间:19

Ordinal字段类型说明
vmo handle<vmo>

如果参与者只有vmofuchsia.sysmem2/BufferUsage.none 设置为 NONE_USAGE(显式或 通过 fuchsia.sysmem2/BufferCollection.SetConstraints 隐式地 (未设置 constraints)。

vmo_usable_start uint64

第一个可用字节的 VMO 内的偏移量。必须小于VMO 的大小 (以字节为单位),并为 BufferMemorySettings.size_bytes 留出足够的空间 在 VMO 结束之前

目前,sysmem 会始终将此字段设置为 0,将来,sysmem 会始终将此字段设置为 0 不会将此字段设置为非零值,除非所有参与者 明确表明支持非零 vmo_usable_start(此 机制不存在)。尚未参加 明确指出支持非零 vmo_usable_start(当前所有 客户端)应隐式假定此字段已设置为 0, 实际查看过这个字段

close_weak_asap handle<eventpair>

当且仅当 vmo 是系统内存弱 VMO 句柄时,才会设置此字段。客户端必须 将 close_weak_asap 保留 vmo,并且必须注意 ZX_EVENTPAIR_PEER_CLOSED。如果出现该信号,客户端必须关闭 尽快vmo。否则会被视为客户端存在 VMO 泄露, 该病例 sysmem 最终会通过 syslog 大声抱怨(目前 5 秒后)。

联合体

Allocator_GetVmoInfo_Result 严格的 资源

fuchsia.sysmem2/allocator.fidl 中定义

Ordinal变体类型说明
response Allocator_GetVmoInfo_Response
err Error
framework_err internal

Allocator_ VerifyBufferCollectionToken_Result 严格

fuchsia.sysmem2/allocator.fidl 中定义

Ordinal变体类型说明
response Allocator_ValidateBufferCollectionToken_Response
framework_err internal

BufferCollectionTokenGroup_CreateChildrenSync_Result 严格的资源

fuchsia.sysmem2/collection.fidl 中定义

Ordinal变体类型说明
response BufferCollectionTokenGroup_CreateChildrenSync_Response
framework_err internal

BufferCollectionToken_DuplicateSync_Result 严格的资源

fuchsia.sysmem2/collection.fidl 中定义

Ordinal变体类型说明
response BufferCollectionToken_DuplicateSync_Response
framework_err internal

BufferCollection_CheckAllBuffersAlality_Result 需要严格

fuchsia.sysmem2/collection.fidl 中定义

Ordinal变体类型说明
response BufferCollection_CheckAllBuffersAllocated_Response
err Error
framework_err internal

BufferCollection_WaitForAllBuffersAltitude_Result 严格的资源

fuchsia.sysmem2/collection.fidl 中定义

Ordinal变体类型说明
response BufferCollection_WaitForAllBuffersAllocated_Response
err Error
framework_err internal

Node_GetBufferCollectionId_Result 严格

fuchsia.sysmem2/collection.fidl 中定义

Ordinal变体类型说明
response Node_GetBufferCollectionId_Response
framework_err internal

Node_GetNodeRef_Result 严格资源

fuchsia.sysmem2/collection.fidl 中定义

Ordinal变体类型说明
response Node_GetNodeRef_Response
framework_err internal

Node_IsAlternateFor_Result 严格

fuchsia.sysmem2/collection.fidl 中定义

Ordinal变体类型说明
response Node_IsAlternateFor_Response
err Error
framework_err internal

Node_Sync_Result 严格

fuchsia.sysmem2/collection.fidl 中定义

Ordinal变体类型说明
response Node_Sync_Response
framework_err internal

常量

名称类型说明
CPU_USAGE_READ 1 uint32
添加时间:19
CPU_USAGE_READ_OFTEN 2 uint32
添加时间:19
CPU_USAGE_WRITE 4 uint32
添加时间:19
CPU_USAGE_WRITE_OFTEN 8 uint32
添加时间:19
DISPLAY_USAGE_CURSOR 2 uint32
添加时间:19
DISPLAY_USAGE_LAYER 1 uint32
添加时间:19
MAX_CLIENT_NAME_LENGTH 256 int32

name 请求字段的最大长度(以字节为单位) fuchsia.sysmem2/Allocator.SetDebugClientInfofuchsia.sysmem2/Node.SetDebugClientInfo

添加时间:19
MAX_COUNT_BUFFER_COLLECTION_CONSTRAINTS_IMAGE_FORMAT_CONSTRAINTS 64 uint32

最大 fuchsia.sysmem2/BufferCollectionConstraints.image_format_constraints

添加时间:19
MAX_COUNT_BUFFER_COLLECTION_INFO_BUFFERS 128 uint32

每个 fuchsia.sysmem2/BufferCollectionInfo.buffers 字段。

添加时间:19
MAX_COUNT_BUFFER_MEMORY_CONSTRAINTS_PERMITTED_HEAPS 64 uint32

最大 fuchsia.sysmem2/BufferMemoryConstraints.permitted_heaps

添加时间:19
MAX_COUNT_CREATE_CHILDREN 64 int32

每个 OR 组可以创建的词元子项的数量上限 对 fuchsia.sysmem2/BufferCollectionTokenGroup.CreateChildrenSync 的调用。

在大多数典型的场景中,并不建议创建这么多的子元素 但不会被阻止 应对异常情况的需求缓解 AI 中可能出现的高时间复杂性 系统内存将限制考虑的组子组合的实际数量 设置为一个单独的最大值,该最大值无法通过 sysmem 协议。系统内存令牌树中的总节点数上限 不得超过一个单独的最大值,而该最大值无法通过这些协议进行设置。

添加时间:19
MAX_COUNT_DUPLICATES 64 uint32
添加时间:19
MAX_COUNT_IMAGE_FORMAT_CONSTRAINTS_COLOR_SPACES 32 uint32

fuchsia.sysmem2/ImageFormatConstraints.color_spaces 的大小上限。

MAX_COUNT_PIXEL_FORMAT_AND_MODIFIERS 64 uint32

最大 fuchsia.sysmem2/ImageFormatConstraints.pixel_format_and_modifiers.

NONE_USAGE 1 uint32
添加时间:19
VIDEO_USAGE_CAPTURE 8 uint32
添加时间:19
VIDEO_USAGE_DECRYPTOR_OUTPUT 16 uint32
添加时间:19
VIDEO_USAGE_HW_DECODER 1 uint32
添加时间:19
VIDEO_USAGE_HW_DECODER_INTERNAL 32 uint32
添加时间:19
VIDEO_USAGE_HW_ENCODER 2 uint32
添加时间:19
VULKAN_BUFFER_USAGE_INDEX_BUFFER 4194304 uint32
添加时间:19
VULKAN_BUFFER_USAGE_INDIRECT_BUFFER 16777216 uint32
添加时间:19
VULKAN_BUFFER_USAGE_STORAGE_BUFFER 2097152 uint32
添加时间:19
VULKAN_BUFFER_USAGE_STORAGE_TEXEL_BUFFER 524288 uint32
添加时间:19
VULKAN_BUFFER_USAGE_TRANSFER_DST 131072 uint32
添加时间:19
VULKAN_BUFFER_USAGE_TRANSFER_SRC 65536 uint32
添加时间:19
VULKAN_BUFFER_USAGE_UNIFORM_BUFFER 1048576 uint32
添加时间:19
VULKAN_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER 262144 uint32
添加时间:19
VULKAN_BUFFER_USAGE_VERTEX_BUFFER 8388608 uint32
添加时间:19
VULKAN_IMAGE_USAGE_COLOR_ATTACHMENT 16 uint32
添加时间:19
VULKAN_IMAGE_USAGE_INPUT_ATTACHMENT 128 uint32
添加时间:19
VULKAN_IMAGE_USAGE_SAMPLED 4 uint32
添加时间:19
VULKAN_IMAGE_USAGE_STENCIL_ATTACHMENT 32 uint32
添加时间:19
VULKAN_IMAGE_USAGE_STORAGE 8 uint32
添加时间:19
VULKAN_IMAGE_USAGE_TRANSFER_DST 2 uint32
添加时间:19
VULKAN_IMAGE_USAGE_TRANSFER_SRC 1 uint32
添加时间:19
VULKAN_IMAGE_USAGE_TRANSIENT_ATTACHMENT 64 uint32
添加时间:19