#rw-lock #condvar #xp #windows #xpsupport

sys xpsupport-sys

使用一种黑客方式支持 XP,只需要链接一个 dll。更多详情请访问仓库。

1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2017 年 8 月 4 日

#5 in #xp

MIT 许可证

97KB
2K SLoC

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

已废弃!不再工作!

由于这个提交 https://github.com/rust-lang/rust/commit/59855e0bbf0df22f39dbe39bc58ab5c978fb3765,这个 crate 已不再工作!

用法

将此添加到您的 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 二进制文件,例如,运行 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。

依赖项