9 个版本
0.4.0 | 2024年3月18日 |
---|---|
0.3.0 | 2023年2月7日 |
0.2.4 | 2022年11月15日 |
0.2.0 | 2022年8月13日 |
0.1.1 | 2022年8月13日 |
#504 in 解析器实现
69KB
1K SLoC
psrdada-rs
这是一个围绕在射电天文学中常用的psrdada库的Rust库。不幸的是,C库大部分没有文档,因此这个Rust库所展示的行为是作者通过阅读原始示例代码所能确定的。因此,这可能不是原始用例的1对1实现,并且只实现了C库中可用功能的一个子集。
安装
您需要手动构建和安装PSRDADA,请按照以下指南进行操作。或者,您可以使用以下nix flake 链接声明性地创建包含PSRDADA的环境(shell/docker容器/操作系统)。
安全性
原始库本质上是不可靠的,因为它是用C编写的,而且用户使用它的正确性检查非常少。这个库试图在编译时确保C库在运行时检查的一些事情。例如,如果您试图在另一个东西正在尝试读取时写入缓冲区,这通常会导致锁定失败。相反,在这个库中,我们使用Rust的借用系统来确保您不能同时构建两个。对于读写块也是如此。一旦您将它们标记为清除,就不能再引用这些块。
这比C库(以及在某种程度上C++库,因为它们尝试实现一些RAII模式)有巨大的用户体验改进。
以下代码为例
use psrdada::prelude::*;
use std::io::{Read, Write};
// Build the paired client
let key = 0xb0ba;
let mut client = DadaClientBuilder::new(key).build().unwrap();
// Split into individual clients
let (_, mut data_client) = client.split();
// Construct the writer (mutable borrow), panicking if a lock is not obtainable
let mut writer = data_client.writer().unwrap();
// Grab the next block in the ring (assuming we can)
let mut write_block = writer.next().unwrap();
// Write using std::io::Write so you can write chunks at a time
write_block.write_all(&[0u8; 10]).unwrap();
// Inform the backend that we've completed writing
write_block.commit();
// Drop the writer to unlock it (this would happen also when the writer leaves scope)
drop(writer);
// Construct the reader (mutable borrow), panicking if a lock is not obtainable
let mut reader = data_client.reader().unwrap();
// Grab the next read block in the ring
let mut read_block = reader.next().unwrap();
// Read using std::io::Read
let mut buf = [0u8; 10];
read_block.read_exact(&mut buf).unwrap();
如果没有那行 write_block.commit()
,此代码将无法编译,因为仍然存在正在进行的写入。此外,您只能拆分一次,因此每种类型都只有一个读取器和写入器。
请参阅示例以获取更多用例。
谢谢
大部分实现灵感来自其他PSRDADA的“现代”封装,特别是PSRDADA_CPP。
许可协议
psrdada-rs
根据MIT许可协议和Apache许可协议(版本2.0)进行分发。
请参阅LICENSE-APACHE和LICENSE-MIT获取详细信息。
依赖关系
~1.2–3.5MB
~61K SLoC