pub struct Xwcq<const S: XwSz, const N: XwSz>where
[u8; { _ }]: Sized,{ /* private fields */ }
Expand description
循环队列对象结构体
Implementations§
source§impl<const S: XwSz, const N: XwSz> Xwcq<S, N>where
[u8; { _ }]: Sized,
impl<const S: XwSz, const N: XwSz> Xwcq<S, N>where
[u8; { _ }]: Sized,
sourcepub const fn new() -> Self
pub const fn new() -> Self
新建循环队列对象
新建时需要指定类型常量参数。
S
是数据槽的大小,不能为0,若S
不满足内存对齐的要求,会自动向上调整。N
是数据槽的数量,不能为0。
此方法是编译期方法。循环队列只可被定义为具有 'static
约束的全局变量全局变量:
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 8> = Xwcq::new(); // 64字节 * 8个槽
sourcepub fn init(&'static self) -> XwcqError
pub fn init(&'static self) -> XwcqError
初始化循环队列对象
循环队列对象必须调用此方法一次,方可正常使用。
如果在创建循环队列时,指定的 S * N == 0
,初始化时将返回错误 XwcqError::PoolSize
。
§错误码
XwcqError::Ok
没有错误XwcqError::PoolSize
循环队列内存大小错误
§上下文
- 任意
§示例
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 8> = Xwcq::new(); // 64字节 * 8个槽
pub fn xwrust_example_xwcq() {
let rc = CQ.init();
}
sourcepub fn eq<T>(&self, data: T) -> Result<XwSz, XwcqError>where
T: Sized + Send,
pub fn eq<T>(&self, data: T) -> Result<XwSz, XwcqError>where
T: Sized + Send,
将数据发送到循环队列的 尾端 (入队,EnQueue)
- 如果循环队列数据已被填满,循环队列会循环回队列 首端 的位置,覆盖掉原数据。
- 发送时,数据类型是泛型
T
,T
必须是Sized
的,数据是被逐字节地被拷贝到循环队列的数据槽内的。 - 当发送的数据类型大小大于循环队列的数据槽大小
S
,发送会失败,并返回错误码XwcqError::DataSize
。
§参数说明
- data: 类型为
T
的数据
§错误码
XwcqError::Ok
没有错误XwcqError::NotInit
循环队列没有初始化XwcqError::DataSize
数据大小错误
§上下文
- 任意
§示例
use xwrust::xwos::thd::SThd;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
static CHILD: SThd<1024, &str> = SThd::new("CHILD0", true);
pub fn xwrust_example_xwcq() {
CQ.init();
CHILD.run(|_| { // 子线程0
// 将utf-8字符串放入 `[u8; 64]` 数组中后发送
let mut buffer: [u8; 64] = [0; 64];
let msg = "子线程数据".as_bytes();
let msgsize = msg.len();
buffer[..msgsize].copy_from_slice(msg);
let rc = CQ.eq(buffer);
match rc {
Ok(sz) => { // 发送数据成功
},
Err(e) => { // 发送数据失败
},
};
"OK"
});
}
sourcepub fn jq<T>(&self, data: T) -> Result<XwSz, XwcqError>where
T: Sized + Send,
pub fn jq<T>(&self, data: T) -> Result<XwSz, XwcqError>where
T: Sized + Send,
将数据发送循环队列的 首端 (插队,Jump the Queue)
- 如果循环队列数据已被填满,循环队列会循环回队列 尾端 的位置,覆盖掉原数据。
- 发送时,数据类型是泛型
T
,T
必须是Sized
的,数据是被逐字节地被拷贝到循环队列的数据槽内的。 - 当发送的数据类型大小大于循环队列的数据槽大小
S
,发送会失败,并返回错误码XwcqError::DataSize
。
§参数说明
- data: 类型为
T
的数据
§错误码
XwcqError::Ok
没有错误XwcqError::NotInit
循环队列没有初始化XwcqError::DataSize
数据大小错误
§上下文
- 任意
§示例
use xwrust::xwos::thd::SThd;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
static CHILD: SThd<1024, &str> = SThd::new("CHILD0", true);
pub fn xwrust_example_xwcq() {
CQ.init();
CHILD.run(|_| { // 子线程0
// 将utf-8字符串放入 `[u8; 64]` 数组中后发送
let mut buffer: [u8; 64] = [0; 64];
let msg = "子线程数据".as_bytes();
let msgsize = msg.len();
buffer[..msgsize].copy_from_slice(msg);
let rc = CQ.jq(buffer);
match rc {
Ok(sz) => { // 发送数据成功
},
Err(e) => { // 发送数据失败
},
};
"OK"
});
}
sourcepub fn dq<T>(&self) -> Result<T, XwcqError>where
T: Sized + Send,
pub fn dq<T>(&self) -> Result<T, XwcqError>where
T: Sized + Send,
等待从循环队列的 首端 接收数据(离队,DeQueue)
- 当循环队列未初始化,返回错误码
XwcqError::NotInit
。 - 若循环队列为空,线程会阻塞等待。
- 接收时,数据类型是泛型
T
,T
必须是Sized
的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。 - 循环队列不会对接收时的
T
与 发送时的T
进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。 - 当
T
大小大于循环队列的数据槽大小S
,接收会失败,并返回错误码XwcqError::DataSize
。 - 当线程阻塞等待被中断时,返回错误码
XwcqError::Interrupt
。
§上下文
- 线程
§错误码
XwcqError::Ok
没有错误XwcqError::NotInit
循环队列没有初始化XwcqError::Interrupt
等待被中断XwcqError::NotThreadContext
不在线程上下文内XwcqError::DisPmpt
抢占被关闭XwcqError::DisBh
中断底半部被关闭XwcqError::DisIrq
中断被关闭
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
CQ.init();
// ...省略...
let rc = CQ.dq::<[u8; 64]>();
match rc {
Ok(d) => { // 获取数据成功
// 从 `[u8; 64]` 数组中构建切片 `&str`
let totalslice = &d[0..64];
let nullpos = memchr(0, totalslice).unwrap_or(64);
let msgu8slice = &d[0..nullpos];
let msg = str::from_utf8(msgu8slice);
},
Err(e) => { // 获取数据失败
break;
},
};
}
sourcepub fn dq_to<T>(&self, to: XwTm) -> Result<T, XwcqError>where
T: Sized + Send,
pub fn dq_to<T>(&self, to: XwTm) -> Result<T, XwcqError>where
T: Sized + Send,
等待从循环队列的 首端 接收数据(离队,DeQueue)
- 当循环队列未初始化,返回错误码
XwcqError::NotInit
。 - 若循环队列为空,线程会阻塞等待,等待时会指定一个唤醒时间点。
- 接收时,数据类型是泛型
T
,T
必须是Sized
的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。 - 循环队列不会对接收时的
T
与 发送时的T
进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。 - 当
T
大小大于循环队列的数据槽大小S
,接收会失败,并返回错误码XwcqError::DataSize
。 - 当线程阻塞等待被中断时,返回错误码
XwcqError::Interrupt
。 - 当到达指定的唤醒时间点,线程被唤醒,返回错误码
XwcqError::Timedout
。
§参数说明
- to: 期望唤醒的时间点
§上下文
- 线程
§错误码
XwcqError::Ok
没有错误XwcqError::NotInit
循环队列没有初始化XwcqError::Interrupt
等待被中断XwcqError::Timedout
等待超时XwcqError::NotThreadContext
不在线程上下文内XwcqError::DisPmpt
抢占被关闭XwcqError::DisBh
中断底半部被关闭XwcqError::DisIrq
中断被关闭
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwtm;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
CQ.init();
// ...省略...
let rc = CQ.dq_to::<[u8; 64]>(xwtm::ft(xwtm::s(1)));
match rc {
Ok(d) => { // 获取数据成功
// 从 `[u8; 64]` 数组中构建切片 `&str`
let totalslice = &d[0..64];
let nullpos = memchr(0, totalslice).unwrap_or(64);
let msgu8slice = &d[0..nullpos];
let msg = str::from_utf8(msgu8slice);
},
Err(e) => { // 获取数据失败
break;
},
};
}
sourcepub fn dq_unintr<T>(&self) -> Result<T, XwcqError>where
T: Sized + Send,
pub fn dq_unintr<T>(&self) -> Result<T, XwcqError>where
T: Sized + Send,
等待从循环队列的 首端 接收数据(离队,DeQueue),并且等待不可被中断
- 当循环队列未初始化,返回错误码
XwcqError::NotInit
。 - 若循环队列为空,线程会阻塞等待,且不可被中断。
- 接收时,数据类型是泛型
T
,T
必须是Sized
的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。 - 循环队列不会对接收时的
T
与 发送时的T
进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。 - 当
T
大小大于循环队列的数据槽大小S
,接收会失败,并返回错误码XwcqError::DataSize
。
§上下文
- 线程
§错误码
XwcqError::Ok
没有错误XwcqError::NotInit
循环队列没有初始化XwcqError::NotThreadContext
不在线程上下文内XwcqError::DisPmpt
抢占被关闭XwcqError::DisBh
中断底半部被关闭XwcqError::DisIrq
中断被关闭
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
CQ.init();
// ...省略...
let rc = CQ.dq_unintr::<[u8; 64]>();
match rc {
Ok(d) => { // 获取数据成功
// 从 `[u8; 64]` 数组中构建切片 `&str`
let totalslice = &d[0..64];
let nullpos = memchr(0, totalslice).unwrap_or(64);
let msgu8slice = &d[0..nullpos];
let msg = str::from_utf8(msgu8slice);
},
Err(e) => { // 获取数据失败
break;
},
};
}
sourcepub fn trydq<T>(&self) -> Result<T, XwcqError>where
T: Sized + Send,
pub fn trydq<T>(&self) -> Result<T, XwcqError>where
T: Sized + Send,
尝试从循环队列的 首端 接收数据(离队,DeQueue)
- 当循环队列未初始化,返回错误码
XwcqError::NotInit
。 - 若循环队列为空,立即返回
XwcqError::DataSize
,此方法不会阻塞等待。 - 接收时,数据类型是泛型
T
,T
必须是Sized
的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。 - 循环队列不会对接收时的
T
与 发送时的T
进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。 - 当
T
大小大于循环队列的数据槽大小S
,接收会失败,并返回错误码XwcqError::DataSize
。
§上下文
- 任意
§错误码
XwcqError::Ok
没有错误XwcqError::NotInit
循环队列没有初始化XwcqError::NoData
循环队列中没有数据
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
CQ.init();
// ...省略...
let rc = CQ.trydq::<[u8; 64]>();
match rc {
Ok(d) => { // 获取数据成功
// 从 `[u8; 64]` 数组中构建切片 `&str`
let totalslice = &d[0..64];
let nullpos = memchr(0, totalslice).unwrap_or(64);
let msgu8slice = &d[0..nullpos];
let msg = str::from_utf8(msgu8slice);
},
Err(e) => { // 获取数据失败
},
};
}
sourcepub fn rq<T>(&self) -> Result<T, XwcqError>where
T: Sized + Send,
pub fn rq<T>(&self) -> Result<T, XwcqError>where
T: Sized + Send,
等待从循环队列的 尾端 接收数据(反向离队,Reversely deQueue)
- 当循环队列未初始化,返回错误码
XwcqError::NotInit
。 - 若循环队列为空,线程会阻塞等待。
- 接收时,数据类型是泛型
T
,T
必须是Sized
的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。 - 循环队列不会对接收时的
T
与 发送时的T
进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。 - 当
T
大小大于循环队列的数据槽大小S
,接收会失败,并返回错误码XwcqError::DataSize
。 - 当线程阻塞等待被中断时,返回错误码
XwcqError::Interrupt
。
§上下文
- 线程
§错误码
XwcqError::Ok
没有错误XwcqError::NotInit
循环队列没有初始化XwcqError::Interrupt
等待被中断XwcqError::NotThreadContext
不在线程上下文内XwcqError::DisPmpt
抢占被关闭XwcqError::DisBh
中断底半部被关闭XwcqError::DisIrq
中断被关闭
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
CQ.init();
// ...省略...
let rc = CQ.rq::<[u8; 64]>();
match rc {
Ok(d) => { // 获取数据成功
// 从 `[u8; 64]` 数组中构建切片 `&str`
let totalslice = &d[0..64];
let nullpos = memchr(0, totalslice).unwrap_or(64);
let msgu8slice = &d[0..nullpos];
let msg = str::from_utf8(msgu8slice);
},
Err(e) => { // 获取数据失败
break;
},
};
}
sourcepub fn rq_to<T>(&self, to: XwTm) -> Result<T, XwcqError>where
T: Sized + Send,
pub fn rq_to<T>(&self, to: XwTm) -> Result<T, XwcqError>where
T: Sized + Send,
限时等待从循环队列的 尾端 接收数据(反向离队,Reversely deQueue)
- 当循环队列未初始化,返回错误码
XwcqError::NotInit
。 - 若循环队列为空,线程会阻塞等待,等待时会指定一个唤醒时间点。
- 接收时,数据类型是泛型
T
,T
必须是Sized
的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。 - 循环队列不会对接收时的
T
与 发送时的T
进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。 - 当
T
大小大于循环队列的数据槽大小S
,接收会失败,并返回错误码XwcqError::DataSize
。 - 当线程阻塞等待被中断时,返回错误码
XwcqError::Interrupt
。 - 当到达指定的唤醒时间点,线程被唤醒,返回错误码
XwcqError::Timedout
。
§参数说明
- to: 期望唤醒的时间点
§上下文
- 线程
§错误码
XwcqError::Ok
没有错误XwcqError::NotInit
循环队列没有初始化XwcqError::Interrupt
等待被中断XwcqError::Timedout
等待超时XwcqError::NotThreadContext
不在线程上下文内XwcqError::DisPmpt
抢占被关闭XwcqError::DisBh
中断底半部被关闭XwcqError::DisIrq
中断被关闭
§上下文
- 线程
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwtm;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
CQ.init();
// ...省略...
let rc = CQ.rq_to::<[u8; 64]>(xwtm::ft(xwtm::s(1)));
match rc {
Ok(d) => { // 获取数据成功
// 从 `[u8; 64]` 数组中构建切片 `&str`
let totalslice = &d[0..64];
let nullpos = memchr(0, totalslice).unwrap_or(64);
let msgu8slice = &d[0..nullpos];
let msg = str::from_utf8(msgu8slice);
},
Err(e) => { // 获取数据失败
break;
},
};
}
sourcepub fn rq_unintr<T>(&self) -> Result<T, XwcqError>where
T: Sized + Send,
pub fn rq_unintr<T>(&self) -> Result<T, XwcqError>where
T: Sized + Send,
等待从循环队列的 尾端 接收数据(反向离队,Reversely deQueue),并且等待不可被中断
- 当循环队列未初始化,返回错误码
XwcqError::NotInit
。 - 若循环队列为空,线程会阻塞等待,且不可被中断。
- 接收时,数据类型是泛型
T
,T
必须是Sized
的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。 - 循环队列不会对接收时的
T
与 发送时的T
进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。 - 当
T
大小大于循环队列的数据槽大小S
,接收会失败,并返回错误码XwcqError::DataSize
。
§上下文
- 线程
§错误码
XwcqError::Ok
没有错误XwcqError::NotInit
循环队列没有初始化XwcqError::NotThreadContext
不在线程上下文内XwcqError::DisPmpt
抢占被关闭XwcqError::DisBh
中断底半部被关闭XwcqError::DisIrq
中断被关闭
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
CQ.init();
// ...省略...
let rc = CQ.rq_unintr::<[u8; 64]>();
match rc {
Ok(d) => { // 获取数据成功
// 从 `[u8; 64]` 数组中构建切片 `&str`
let totalslice = &d[0..64];
let nullpos = memchr(0, totalslice).unwrap_or(64);
let msgu8slice = &d[0..nullpos];
let msg = str::from_utf8(msgu8slice);
},
Err(e) => { // 获取数据失败
break;
},
};
}
sourcepub fn tryrq<T>(&self) -> Result<T, XwcqError>where
T: Sized + Send,
pub fn tryrq<T>(&self) -> Result<T, XwcqError>where
T: Sized + Send,
尝试从循环队列的 尾端 接收数据(反向离队,Reversely deQueue)
- 当循环队列未初始化,返回错误码
XwcqError::NotInit
。 - 若循环队列为空,立即返回
XwcqError::DataSize
,此方法不会阻塞。 - 接收时,数据类型是泛型
T
,T
必须是Sized
的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。 - 循环队列不会对接收时的
T
与 发送时的T
进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。 - 当
T
大小大于循环队列的数据槽大小S
,接收会失败,并返回错误码XwcqError::DataSize
。
§上下文
- 任意
§错误码
XwcqError::Ok
没有错误XwcqError::NotInit
循环队列没有初始化XwcqError::NoData
循环队列中没有数据
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
CQ.init();
// ...省略...
let rc = CQ.tryrq::<[u8; 64]>();
match rc {
Ok(d) => { // 获取数据成功
// 从 `[u8; 64]` 数组中构建切片 `&str`
let totalslice = &d[0..64];
let nullpos = memchr(0, totalslice).unwrap_or(64);
let msgu8slice = &d[0..nullpos];
let msg = str::from_utf8(msgu8slice);
},
Err(e) => { // 获取数据失败
},
};
}
sourcepub fn pfq<T>(&self) -> Result<T, XwcqError>where
T: Sized + Send,
pub fn pfq<T>(&self) -> Result<T, XwcqError>where
T: Sized + Send,
等待从循环队列 头端 拷贝数据(Peek at the Front of Queue)
- 当循环队列未初始化,返回错误码
XwcqError::NotInit
。 - 拷贝数据不会取走数据,也不会释放数据槽,数据可被重复拷贝,也可继续被接收。
- 若循环队列为空,线程会阻塞等待。
- 接收时,数据类型是泛型
T
,T
必须是Sized
的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。 - 循环队列不会对接收时的
T
与 发送时的T
进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。 - 当
T
大小大于循环队列的数据槽大小S
,接收会失败,并返回错误码XwcqError::DataSize
。 - 当线程阻塞等待被中断时,返回错误码
XwcqError::Interrupt
。
§上下文
- 线程
§错误码
XwcqError::Ok
没有错误XwcqError::NotInit
循环队列没有初始化XwcqError::Interrupt
等待被中断XwcqError::NotThreadContext
不在线程上下文内XwcqError::DisPmpt
抢占被关闭XwcqError::DisBh
中断底半部被关闭XwcqError::DisIrq
中断被关闭
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
CQ.init();
// ...省略...
let rc = CQ.pfq::<[u8; 64]>();
match rc {
Ok(d) => { // 获取数据成功
// 从 `[u8; 64]` 数组中构建切片 `&str`
let totalslice = &d[0..64];
let nullpos = memchr(0, totalslice).unwrap_or(64);
let msgu8slice = &d[0..nullpos];
let msg = str::from_utf8(msgu8slice);
},
Err(e) => { // 获取数据失败
break;
},
};
}
sourcepub fn pfq_to<T>(&self, to: XwTm) -> Result<T, XwcqError>where
T: Sized + Send,
pub fn pfq_to<T>(&self, to: XwTm) -> Result<T, XwcqError>where
T: Sized + Send,
限时等待从循环队列 头端 拷贝数据(Peek at the Front of Queue)
- 当循环队列未初始化,返回错误码
XwcqError::NotInit
。 - 拷贝数据不会取走数据,也不会释放数据槽,数据可被重复拷贝,也可继续被接收。
- 若循环队列为空,线程会阻塞等待,等待时会指定一个唤醒时间点。
- 接收时,数据类型是泛型
T
,T
必须是Sized
的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。 - 循环队列不会对接收时的
T
与 发送时的T
进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。 - 当
T
大小大于循环队列的数据槽大小S
,接收会失败,并返回错误码XwcqError::DataSize
。 - 当线程阻塞等待被中断时,返回错误码
XwcqError::Interrupt
。 - 当到达指定的唤醒时间点,线程被唤醒,返回错误码
XwcqError::Timedout
。
§参数说明
- to: 期望唤醒的时间点
§上下文
- 线程
§错误码
XwcqError::Ok
没有错误XwcqError::NotInit
循环队列没有初始化XwcqError::Interrupt
等待被中断XwcqError::Timedout
等待超时XwcqError::NotThreadContext
不在线程上下文内XwcqError::DisPmpt
抢占被关闭XwcqError::DisBh
中断底半部被关闭XwcqError::DisIrq
中断被关闭
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwtm;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
CQ.init();
// ...省略...
let rc = CQ.pfq_to::<[u8; 64]>(xwtm::ft(xwtm::s(1)));
match rc {
Ok(d) => { // 获取数据成功
// 从 `[u8; 64]` 数组中构建切片 `&str`
let totalslice = &d[0..64];
let nullpos = memchr(0, totalslice).unwrap_or(64);
let msgu8slice = &d[0..nullpos];
let msg = str::from_utf8(msgu8slice);
},
Err(e) => { // 获取数据失败
break;
},
};
}
sourcepub fn pfq_unintr<T>(&self) -> Result<T, XwcqError>where
T: Sized + Send,
pub fn pfq_unintr<T>(&self) -> Result<T, XwcqError>where
T: Sized + Send,
等待从循环队列 头端 拷贝数据(Peek at the Front of Queue),并且等待不可被中断
- 当循环队列未初始化,返回错误码
XwcqError::NotInit
。 - 拷贝数据不会取走数据,也不会释放数据槽,数据可被重复拷贝,也可继续被接收。
- 若循环队列为空,线程会阻塞等待,且不可被中断。
- 接收时,数据类型是泛型
T
,T
必须是Sized
的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。 - 循环队列不会对接收时的
T
与 发送时的T
进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。 - 当
T
大小大于循环队列的数据槽大小S
,接收会失败,并返回错误码XwcqError::DataSize
。
§上下文
- 线程
§错误码
XwcqError::Ok
没有错误XwcqError::NotInit
循环队列没有初始化XwcqError::NotThreadContext
不在线程上下文内XwcqError::DisPmpt
抢占被关闭XwcqError::DisBh
中断底半部被关闭XwcqError::DisIrq
中断被关闭
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
CQ.init();
// ...省略...
let rc = CQ.pfq_unintr::<[u8; 64]>();
match rc {
Ok(d) => { // 获取数据成功
// 从 `[u8; 64]` 数组中构建切片 `&str`
let totalslice = &d[0..64];
let nullpos = memchr(0, totalslice).unwrap_or(64);
let msgu8slice = &d[0..nullpos];
let msg = str::from_utf8(msgu8slice);
},
Err(e) => { // 获取数据失败
break;
},
};
}
sourcepub fn trypfq<T>(&self) -> Result<T, XwcqError>where
T: Sized + Send,
pub fn trypfq<T>(&self) -> Result<T, XwcqError>where
T: Sized + Send,
尝试从循环队列 头端 拷贝数据(Peek at the Front of Queue)
- 当循环队列未初始化,返回错误码
XwcqError::NotInit
。 - 拷贝数据不会取走数据,也不会释放数据槽,数据可被重复拷贝,也可继续被接收。
- 若循环队列为空,立即返回
XwcqError::DataSize
,此方法不会阻塞。 - 接收时,数据类型是泛型
T
,T
必须是Sized
的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。 - 循环队列不会对接收时的
T
与 发送时的T
进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。 - 当
T
大小大于循环队列的数据槽大小S
,接收会失败,并返回错误码XwcqError::DataSize
。
§上下文
- 任意
§错误码
XwcqError::Ok
没有错误XwcqError::NotInit
循环队列没有初始化XwcqError::NoData
循环队列中没有数据
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
CQ.init();
// ...省略...
let rc = CQ.trypfq::<[u8; 64]>();
match rc {
Ok(d) => { // 获取数据成功
// 从 `[u8; 64]` 数组中构建切片 `&str`
let totalslice = &d[0..64];
let nullpos = memchr(0, totalslice).unwrap_or(64);
let msgu8slice = &d[0..nullpos];
let msg = str::from_utf8(msgu8slice);
},
Err(e) => { // 获取数据失败
},
};
}
sourcepub fn prq<T>(&self) -> Result<T, XwcqError>where
T: Sized + Send,
pub fn prq<T>(&self) -> Result<T, XwcqError>where
T: Sized + Send,
等待从循环队列 尾端 拷贝数据(Peek at the Rear of Queue)
- 当循环队列未初始化,返回错误码
XwcqError::NotInit
。 - 拷贝数据不会取走数据,也不会释放数据槽,数据可被重复拷贝,也可继续被接收。
- 若循环队列为空,线程会阻塞等待。
- 接收时,数据类型是泛型
T
,T
必须是Sized
的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。 - 循环队列不会对接收时的
T
与 发送时的T
进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。 - 当
T
大小大于循环队列的数据槽大小S
,接收会失败,并返回错误码XwcqError::DataSize
。 - 当线程阻塞等待被中断时,返回错误码
XwcqError::Interrupt
。
§上下文
- 线程
§错误码
XwcqError::Ok
没有错误XwcqError::NotInit
循环队列没有初始化XwcqError::Interrupt
等待被中断XwcqError::NotThreadContext
不在线程上下文内XwcqError::DisPmpt
抢占被关闭XwcqError::DisBh
中断底半部被关闭XwcqError::DisIrq
中断被关闭
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
CQ.init();
// ...省略...
let rc = CQ.prq::<[u8; 64]>();
match rc {
Ok(d) => { // 获取数据成功
// 从 `[u8; 64]` 数组中构建切片 `&str`
let totalslice = &d[0..64];
let nullpos = memchr(0, totalslice).unwrap_or(64);
let msgu8slice = &d[0..nullpos];
let msg = str::from_utf8(msgu8slice);
},
Err(e) => { // 获取数据失败
break;
},
};
}
sourcepub fn prq_to<T>(&self, to: XwTm) -> Result<T, XwcqError>where
T: Sized + Send,
pub fn prq_to<T>(&self, to: XwTm) -> Result<T, XwcqError>where
T: Sized + Send,
限时等待从循环队列 尾端 拷贝数据(Peek at the Rear of Queue)
- 当循环队列未初始化,返回错误码
XwcqError::NotInit
。 - 拷贝数据不会取走数据,也不会释放数据槽,数据可被重复拷贝,也可继续被接收。
- 若循环队列为空,线程会阻塞等待,等待时会指定一个唤醒时间点。
- 接收时,数据类型是泛型
T
,T
必须是Sized
的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。 - 循环队列不会对接收时的
T
与 发送时的T
进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。 - 当
T
大小大于循环队列的数据槽大小S
,接收会失败,并返回错误码XwcqError::DataSize
。 - 当线程阻塞等待被中断时,返回错误码
XwcqError::Interrupt
。 - 当到达指定的唤醒时间点,线程被唤醒,返回错误码
XwcqError::Timedout
。
§参数说明
- to: 期望唤醒的时间点
§上下文
- 线程
§错误码
XwcqError::Ok
没有错误XwcqError::NotInit
循环队列没有初始化XwcqError::Interrupt
等待被中断XwcqError::Timedout
等待超时XwcqError::NotThreadContext
不在线程上下文内XwcqError::DisPmpt
抢占被关闭XwcqError::DisBh
中断底半部被关闭XwcqError::DisIrq
中断被关闭
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwtm;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
CQ.init();
// ...省略...
let rc = CQ.prq_to::<[u8; 64]>(xwtm::ft(xwtm::s(1)));
match rc {
Ok(d) => { // 获取数据成功
// 从 `[u8; 64]` 数组中构建切片 `&str`
let totalslice = &d[0..64];
let nullpos = memchr(0, totalslice).unwrap_or(64);
let msgu8slice = &d[0..nullpos];
let msg = str::from_utf8(msgu8slice);
},
Err(e) => { // 获取数据失败
break;
},
};
}
sourcepub fn prq_unintr<T>(&self) -> Result<T, XwcqError>where
T: Sized + Send,
pub fn prq_unintr<T>(&self) -> Result<T, XwcqError>where
T: Sized + Send,
等待从循环队列 尾端 拷贝数据(Peek at the Rear of Queue),并且等待不可被中断
- 当循环队列未初始化,返回错误码
XwcqError::NotInit
。 - 拷贝数据不会取走数据,也不会释放数据槽,数据可被重复拷贝,也可继续被接收。
- 若循环队列为空,线程会阻塞等待,且不可被中断。
- 接收时,数据类型是泛型
T
,T
必须是Sized
的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。 - 循环队列不会对接收时的
T
与 发送时的T
进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。 - 当
T
大小大于循环队列的数据槽大小S
,接收会失败,并返回错误码XwcqError::DataSize
。
§上下文
- 线程
§错误码
XwcqError::Ok
没有错误XwcqError::NotInit
循环队列没有初始化XwcqError::NotThreadContext
不在线程上下文内XwcqError::DisPmpt
抢占被关闭XwcqError::DisBh
中断底半部被关闭XwcqError::DisIrq
中断被关闭
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
CQ.init();
// ...省略...
let rc = CQ.prq_unintr::<[u8; 64]>();
match rc {
Ok(d) => { // 获取数据成功
// 从 `[u8; 64]` 数组中构建切片 `&str`
let totalslice = &d[0..64];
let nullpos = memchr(0, totalslice).unwrap_or(64);
let msgu8slice = &d[0..nullpos];
let msg = str::from_utf8(msgu8slice);
},
Err(e) => { // 获取数据失败
break;
},
};
}
sourcepub fn tryprq<T>(&self) -> Result<T, XwcqError>where
T: Sized + Send,
pub fn tryprq<T>(&self) -> Result<T, XwcqError>where
T: Sized + Send,
尝试从循环队列 尾端 拷贝数据(Peek at the Rear of Queue)
- 当循环队列未初始化,返回错误码
XwcqError::NotInit
。 - 拷贝数据不会取走数据,也不会释放数据槽,数据可被重复拷贝,也可继续被接收。
- 若循环队列为空,立即返回
XwcqError::DataSize
,此方法不会阻塞。 - 接收时,数据类型是泛型
T
,T
必须是Sized
的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。 - 循环队列不会对接收时的
T
与 发送时的T
进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。 - 当
T
大小大于循环队列的数据槽大小S
,接收会失败,并返回错误码XwcqError::DataSize
。
§上下文
- 任意
§错误码
XwcqError::Ok
没有错误XwcqError::NotInit
循环队列没有初始化XwcqError::NoData
循环队列中没有数据
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
CQ.init();
// ...省略...
let rc = CQ.tryprq::<[u8; 64]>();
match rc {
Ok(d) => { // 获取数据成功
// 从 `[u8; 64]` 数组中构建切片 `&str`
let totalslice = &d[0..64];
let nullpos = memchr(0, totalslice).unwrap_or(64);
let msgu8slice = &d[0..nullpos];
let msg = str::from_utf8(msgu8slice);
},
Err(e) => { // 获取数据失败
},
};
}