xwrust::xwos::sync::sel

Struct Sel

source
pub struct Sel<const N: XwSz>
where [XwBmp; { _ }]: Sized,
{ /* private fields */ }
Expand description

信号选择器对象结构体

Implementations§

source§

impl<const N: XwSz> Sel<N>
where [XwBmp; { _ }]: Sized,

source

pub const fn new() -> Self

新建信号选择器对象

此方法是编译期方法。

§示例
  • 具有 static 约束的全局变量全局变量:
extern crate alloc;
use xwrust::xwos::sync::sel::*;

static GLOBAL_SEL: Sel<8> = Sel::new();
  • 在heap中创建:
use alloc::sync::Arc;

pub fn xwrust_example_sel() {
    let sel = Arc::new(Sel::<8>::new());
}
source

pub fn init(&self)

初始化信号选择器对象

信号选择器对象必须调用此方法一次,方可正常使用。

§上下文
  • 任意
§示例
use xwrust::xwos::sync::sel::*;

static GLOBAL_SEL: Sel<8> = Sel::new();

pub fn xwrust_example_sel() {
    // ...省略...
    GLOBAL_SEL.init();
    // 从此处开始 GLOBAL_SEL 可正常使用
}
source

pub const fn get_num(&self) -> XwSz

获取信号选择器中线程槽的数量

source

pub fn select(&self, msk: &Bmp<N>) -> Result<Bmp<N>, SelError>

等待信号选择器中的 选择信号

  • 当没有同步对象向信号选择器发送 选择信号 时,线程会阻塞等待。
  • 任意 同步对象向信号选择器发送 选择信号 时,线程被唤醒,然后返回 Bmp<N>
  • 当线程阻塞等待被中断时,返回 SelError::Interrupt
§参数说明
  • msk: 事件的位图掩码
§上下文
  • 线程
§错误码
§示例
use xwrust::xwbmp::*;
use xwrust::xwos::sync::sel::*;

pub fn xwrust_example_sel() {
    let sel = Sel::<8>::new();
    sel.init();
    // ...省略bind过程...
    let msk = Bmp::<8>::new();
    msk.s1all(); // 设置掩码
    let res = sel.select(msk);
    match res {
        Ok(t) => { // 等待成功, `t` 为 **选择信号** 的位图
        },
        Err(e) => { // 等待失败, `e` 为 `SelError`
        },
    }
}
source

pub fn select_to(&self, msk: &Bmp<N>, to: XwTm) -> Result<Bmp<N>, SelError>

限时等待所有线程到达栅栏

  • 当信号选择器中的线程数量小于指定数量,线程会阻塞等待,等待时会指定一个唤醒时间点。
  • 当信号选择器中的线程数量达到指定数量,线程被唤醒,然后返回 Bmp<N>
  • 当线程阻塞等待被中断时,返回 SelError::Interrupt
  • 当到达指定的唤醒时间点,线程被唤醒,并返回 SelError::Timedout
§参数说明
  • msk: 事件的位图掩码
  • to: 期望唤醒的时间点
§上下文
  • 线程
§错误码
§示例
use xwrust::xwbmp::*;
use xwrust::xwos::sync::sel::*;

pub fn xwrust_example_sel() {
    let sel = Sel::<8>::new();
    sel.init();
    // ...省略bind过程...
    let msk = Bmp::<8>::new();
    msk.s1all(); // 设置掩码
    let res = sel.select_to(msk, xwtm::ft(xwtm::s(3)));
    match res {
        Ok(t) => { // 等待成功, `t` 为 **选择信号** 的位图
        },
        Err(e) => { // 等待失败, `e` 为 `SelError`
        },
    }
}
source

pub fn tryselect(&self, msk: &Bmp<N>) -> Result<Bmp<N>, SelError>

检测信号选择器中是否有 选择信号

  • 当检测到 任意 同步对象向信号选择器发送 选择信号 时,立即返回 Bmp<N>
  • 当没有同步对象向信号选择器发送 选择信号 时,立即返回 SelError::NoSignal
§参数说明
  • msk: 事件的位图掩码
§上下文
  • 线程
§错误码
§示例
use xwrust::xwbmp::*;
use xwrust::xwos::sync::sel::*;

pub fn xwrust_example_sel() {
    let sel = Sel::<8>::new();
    sel.init();
    // ...省略bind过程...
    let msk = Bmp::<8>::new();
    msk.s1all(); // 设置掩码
    let res = sel.tryselect(msk);
    match res {
        Ok(t) => { // 等待成功, `t` 为 **选择信号** 的位图
        },
        Err(e) => { // 等待失败, `e` 为 `SelError`
        },
    }
}
source

pub fn bind<'a, const M: XwSz>( &'a self, dst: &'a Sel<M>, pos: XwSq, ) -> Result<SelSel<'a, N, M>, SelError>
where [XwBmp; { _ }]: Sized,

绑定源信号选择器 src 到目的信号选择器 dst

SelSel<'a, N, M> 中包含绑定信息。 SelSel<'a, N, M>srcdst 具有相同的生命周期约束 'aSelSel::selected() 可用来判断 src 是否被选择。当 SelSel<'a, N, M> drop() 时,会自动将 srcdst 解绑。

§参数说明
  • dst: 目的信号选择器的引用
  • pos: 位置
§上下文
  • 任意
§错误码
§示例
pub fn xwrust_example_sel() {
    // ...省略...
    let sel0 = Arc::new(Sel::<8>::new());
    sel0.init();
    let sel0sel = match sel0.bind(&sel, 0) {
        Ok(s) => { // 绑定成功,`s` 为 `SelSel`
            s
        },
        Err(e) => { // 绑定失败,`e` 为 `SelError`
            return;
        }
    };
    // ...省略...
}

Trait Implementations§

source§

impl<const N: XwSz> Drop for Sel<N>
where [XwBmp; { _ }]: Sized,

source§

fn drop(&mut self)

Executes the destructor for this type. Read more
source§

impl<const N: XwSz> Send for Sel<N>
where [XwBmp; { _ }]: Sized,

source§

impl<const N: XwSz> Sync for Sel<N>
where [XwBmp; { _ }]: Sized,

Auto Trait Implementations§

§

impl<const N: usize> !Freeze for Sel<N>

§

impl<const N: usize> !RefUnwindSafe for Sel<N>

§

impl<const N: usize> Unpin for Sel<N>
where [usize; { _ }]: Sized,

§

impl<const N: usize> UnwindSafe for Sel<N>
where [usize; { _ }]: Sized,

Blanket Implementations§

§

impl<T> Any for T
where T: 'static + ?Sized,

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> Borrow<T> for T
where T: ?Sized,

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

impl<T> BorrowMut<T> for T
where T: ?Sized,

§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T, U> Into<U> for T
where U: From<T>,

§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of [From]<T> for U chooses to do.

§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.