7个不稳定版本
0.4.0 | 2024年3月18日 |
---|---|
0.3.0 | 2023年2月7日 |
0.2.2 | 2022年11月15日 |
0.2.0 | 2022年8月13日 |
0.1.1 | 2022年8月13日 |
#1945 在 编码
在 psrdada 中使用
9KB
72 行
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()
,这段代码将无法编译,因为仍然存在正在进行的写入。此外,您只能split
一次,所以您将只有一个读者和写者。
请查看示例以了解更多用例。
谢谢
大部分实现灵感来自其他“现代”的PSRDADA包装,特别是PSRDADA_CPP。
许可证
psrdada-rs
以MIT许可和Apache许可证(版本2.0)的条款分发。
请参阅LICENSE-APACHE和LICENSE-MIT获取详细信息。
依赖项
~0–1.8MB
~36K SLoC