#manager #policy #allocation #api #handles #id #freed

handletree-rs

帮助您实现基于句柄的API

2个不稳定版本

使用旧Rust 2015

0.2.0 2018年8月19日
0.1.0 2018年8月17日

#33 in #handles

BSD-3-Clause

10KB
147

句柄管理器

句柄管理器是一种用于跟踪系统可用句柄的实用工具。这些方法用于跨FFI边界通信或从预分配空间回收内存很有用。例如,您可能预先分配一定数量的粒子发射器,然后使用句柄管理器跟踪哪些特定的一个是可用的或不可用的。或者,您也可以将其用作将不可透明句柄传递给脚本、插件或FFI层的手段。

策略

通过设置策略枚举来增强句柄管理。这些在创建管理器时设置,一旦分配了ID后就不能更改。

策略更改特别有用,可以允许特殊的调试模式,例如“跟踪已释放的ID,但不分配回收的ID”。这种配置对于检测双重释放或在查找陈旧的引用时很有用(例如,一个脚本有ID#3的音频,被释放后,稍后再次尝试播放它;在发布构建中会导致播放错误的音频,但在某些调试模式下可以设置为抛出错误。)

注意

句柄始终是 usize,因此可能存在浪费内存的情况。将 HangleManager 更改为泛型可能允许使用更小的句柄类型,但这会以编译时速度降低为代价。

策略设置也可以设置为泛型参数。从理论上讲,这应该允许在编译时专门化句柄的分配和释放;这将略微减少运行时开销,但也会导致编译时速度降低。

目前没有基准测试证明这些优化是必要的,但如果有在您的使用案例中发现问题,请随时提交工单。

已释放的ID以简单的空闲向量存储。这始终有效,但效率不如可能的那样。设n为一次有效的最大句柄数,在最坏情况下可能使用O(n)的内存来存储空闲句柄。可以通过存储调整并合并的跨度来修复此问题,将内存使用量降低到最坏情况下的O(n/2)。

当前实现的最坏情况是例如取出1000个句柄,然后以任何顺序返回。这将导致空闲列表上有1000个句柄。上述修复的最坏情况是取出1000个句柄,然后每第二个句柄返回。交错ID不能压缩到简单的“开始/结束”跨度。

没有运行时依赖项