#通信 #无死锁 #优惠 #错误 #关闭 #会话类型

nightly sesh

一个无死锁会话类型通信库

2个版本

使用旧的Rust 2015

0.1.1 2021年2月17日
0.1.0 2019年11月20日

#539并发

MIT 许可协议

15KB
242

Sesh ☕

Build Status

Rust中的无死锁会话类型通信库。

extern crate rand;
extern crate sesh;

use rand::{Rng, thread_rng};
use sesh::*;
use std::boxed::Box;
use std::error::Error;

type NegSrv = Recv<i64, Send<i64, End>>;
type AddSrv = Recv<i64, Recv<i64, Send<i64, End>>>;
enum CalcOp { Neg(NegSrv), Add(AddSrv) }

type CalcSrv = Recv<CalcOp, End>;
type CalcCli = <CalcSrv as Session>::Dual;

fn server(s: CalcSrv) -> Result<(), Box<dyn Error>> {
    offer!(s, {
        CalcOp::Neg(s) => {
            let (x, s) = recv(s)?;
            let s = send(-x, s);
            close(s)?;
            Ok(())
        },
        CalcOp::Add(s) => {
            let (x, s) = recv(s)?;
            let (y, s) = recv(s)?;
            let s = send(x.wrapping_add(y), s);
            close(s)?;
            Ok(())
        },
    })
}

#[test]
fn server_works() {
    assert!(|| -> Result<(), Box<dyn Error>> {

        // Pick some random numbers.
        let mut rng = thread_rng();

        // Test the negation function.
        {
            let s: CalcCli = fork(server);
            let x: i64 = rng.gen();
            let s = choose!(CalcOp::Neg, s);
            let s = send(x, s);
            let (y, s) = recv(s)?;
            close(s)?;
            assert_eq!(-x, y);
        }

        // Test the addition function.
        {
            let s: CalcCli = fork(server);
            let x: i64 = rng.gen();
            let y: i64 = rng.gen();
            let s = choose!(CalcOp::Add, s);
            let s = send(x, s);
            let s = send(y, s);
            let (z, s) = recv(s)?;
            close(s)?;
            assert_eq!(x.wrapping_add(y), z);
        }

        Ok(())

    }().is_ok());
}

依赖项

~440KB