#rw-lock #condvar #xp #windows

xpsupport

将多个API钩子连接起来,以启用rust的XP支持

9个版本

使用旧的Rust 2015

0.2.2 2020年3月15日
0.2.1 2019年12月25日
0.2.0 2019年10月30日
0.1.5 2019年10月22日
0.1.2 2017年8月9日

#4 in #xp

每月下载 22
用于 xpsupport-sys

MIT 许可证

95KB
2K SLoC

C 2K SLoC // 0.2% comments Rust 85 SLoC // 0.1% comments

用法

将此内容添加到您的Cargo.toml中

[dependencies]
xpsupport = "0.2"

将此内容添加到您的crate根目录

extern crate xpsupport;

xpsupport::init(); 添加到 fn main 中,例如

fn main()
{
    xpsupport::init();
	//...
}	

对于MSVC工具链,您可以运行bat文件

@echo off
cd %cd%
set RUSTFLAGS=-Ctarget-feature=+crt-static -Clink-args=/subsystem:console,5.01
cargo build --target i686-pc-windows-msvc --release
cmd /k

它是如何工作的?

版本 0.2 的想法受 ctor 的启发。 xpsupport::init() 在 Rust stdlib 的任何初始化之前运行(由于 ctor 的问题 issue27xpsupport::init()fn main 中只是一个占位符)。它钩子 GetProcAddress,并在 XP 或 Vista 上返回以下函数(大部分代码来自 wine 项目)

  • AcquireSRWLockShared
  • ReleaseSRWLockExclusive
  • ReleaseSRWLockShared
  • TryAcquireSRWLockExclusive
  • TryAcquireSRWLockShared
  • SleepConditionVariableSRW
  • WakeAllConditionVariable
  • WakeConditionVariable

外部API解决方案

一些第三方crate使用不支持XP的winapi,您可以尝试 YY-Thunks 来解决这个问题。下载 YY-Thunks-Binary,将其解压到某处,对于xp,我们使用x86二进制文件,例如,使用 E:\YY-Thunks-1.0.2.4-Beta-Binary\objs\x86\YY_Thunks_for_WinXP.obj 运行bat文件

@echo off
cd %cd%
set RUSTFLAGS=-Ctarget-feature=+crt-static -Clink-args=/subsystem:console,5.01 -Clink-args=E:\YY-Thunks-1.0.2.4-Beta-Binary\objs\x86\YY_Thunks_for_WinXP.obj
cargo build --target i686-pc-windows-msvc --release
cmd /k

只需运行bat文件即可。因为它使用obj文件进行链接,所以可能与mingw不兼容。

测试结果

测试代码 来自libstd/sync,只有 mpsc::stress_recv_timeout_shared 似乎死锁,其他都通过了!您可以考虑将 parking_lot crate 作为同步库,或者 spin,它们都支持XP。

没有运行时依赖

~180KB