ABI 与版本兼容
核心实现使用 C++20,但 include/ 只导出 C11 与 C++ 都能用的 C ABI。0.2.0 把跨语言的 FD、超时与状态计数统一为定宽类型,布尔结果使用 uint8_t,并为公开 DTO 固定了八字节布局;使用 0.1.x 的下游必须重新编译。
线上 mirage-display-v1 协议、报文语义、FD 所有权和回调顺序保持不变。
- 跨边界整数使用定宽类型:
uint32_t/int64_t/uint8_t等;不暴露int/long/size_t这类宽度含糊的类型(长度参数除外)。 - 公开 DTO 使用
#pragma pack(push, 8)显式八字节打包,不依赖编译器默认布局。 - 布尔结果使用
uint8_t,不暴露bool。 - 共享头文件使用
#ifdef __cplusplus extern "C"守卫,只含 C 兼容声明。
所有权与线程约定
Section titled “所有权与线程约定”- 回调负载默认是借用的;帧的 acquire/release FD 显式转移所有权;断连时库持有的所有描述符都会恰好关闭一次。
- 跨边界的字符串/缓冲区使用“指针 + 长度”,或明确约定
'\0'结尾;禁止在运行时猜测结尾或长度。 - 内存所有权在头文件注释中写明“谁分配、谁释放”;跨边界对象一律使用归属方提供的创建/销毁函数对。
- 延迟解绑(
md_display_defer_unbind/md_display_finish_unbind)必须在协议事件线程完成,不能在渲染线程直接调用。