#望远镜 #协议 #天文学 #包装器

sys psrdada-sys

psrdada的绑定包装器

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 中使用

MIT/Apache

9KB
72

psrdada-rs

license docs rustc build status Codecov

这是一个围绕在射电天文学中广泛使用的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-APACHELICENSE-MIT获取详细信息。

依赖项

~0–1.8MB
~36K SLoC