XWOS API  4.0
XWOS C/C++ API参考手册
载入中...
搜索中...
未找到
消息队列 的协作图:

结构体

struct  xwmq_msg
 消息队列的消息 更多...
 
struct  xwmq
 消息队列对象 更多...
 
struct  xwmq_d
 消息队列对象描述符 更多...
 

函数

xwer_t xwmq_init (struct xwmq *mq, struct xwmq_msg *txq, xwsz_t num)
 XWMQ API:静态方式初始化消息队列
 
xwer_t xwmq_fini (struct xwmq *mq)
 XWMQ API:销毁静态方式初始化的消息队列对象
 
xwer_t xwmq_grab (struct xwmq *mq)
 XWMQ API:增加消息队列对象的引用计数
 
xwer_t xwmq_put (struct xwmq *mq)
 XWMQ API:减少消息队列对象的引用计数
 
xwsq_t xwmq_get_tik (struct xwmq *mq)
 XWMQ API:获取消息队列对象的标签
 
static xwmq_d xwmq_get_d (struct xwmq *mq)
 XWMQ API:获取消息队列对象描述符
 
xwer_t xwmq_acquire (xwmq_d mqd)
 XWMQ API:检查消息队列对象的标签并增加引用计数
 
xwer_t xwmq_release (xwmq_d mqd)
 XWMQ API:检查消息队列对象的标签并减少引用计数
 
xwer_t xwmq_eq (struct xwmq *mq, xwsq_t topic, void *data)
 XWMQ API:等待消息槽,成功后将消息发送到消息队列的 尾端 (入队)
 
xwer_t xwmq_eq_to (struct xwmq *mq, xwsq_t topic, void *data, xwtm_t to)
 XWMQ API:限时等待消息槽,成功后将消息发送到消息队列的 尾端 (入队)
 
xwer_t xwmq_eq_unintr (struct xwmq *mq, xwsq_t topic, void *data)
 XWMQ API:等待消息槽,且等待不可被中断, 成功后将消息发送到消息队列的 尾端 (入队)
 
xwer_t xwmq_tryeq (struct xwmq *mq, xwsq_t topic, void *data)
 XWMQ API:尝试获取消息槽,成功后将消息发送到消息队列的 尾端 (入队)
 
xwer_t xwmq_jq (struct xwmq *mq, xwsq_t topic, void *data)
 XWMQ API:等待消息槽,成功后将消息发送到消息队列的 首端 (插队)
 
xwer_t xwmq_jq_to (struct xwmq *mq, xwsq_t topic, void *data, xwtm_t to)
 XWMQ API:限时等待消息槽,成功后将消息发送到消息队列的 首端 (插队)
 
xwer_t xwmq_jq_unintr (struct xwmq *mq, xwsq_t topic, void *data)
 XWMQ API:等待消息槽,且等待不可被中断, 成功后将消息发送到消息队列的 首端 (插队)
 
xwer_t xwmq_tryjq (struct xwmq *mq, xwsq_t topic, void *data)
 XWMQ API:尝试获取消息槽,成功后将消息发送到消息队列的 首端 (插队)
 
xwer_t xwmq_dq (struct xwmq *mq, xwsq_t *topic, void **databuf)
 XWMQ API: 等待从消息队列 首端 接收一条消息
 
xwer_t xwmq_dq_to (struct xwmq *mq, xwsq_t *topic, void **databuf, xwtm_t to)
 XWMQ API: 限时等待从消息队列 首端 接收一条消息
 
xwer_t xwmq_dq_unintr (struct xwmq *mq, xwsq_t *topic, void **databuf)
 XWMQ API: 等待从消息队列 首端 接收一条消息,且等待不可被中断
 
xwer_t xwmq_trydq (struct xwmq *mq, xwsq_t *topic, void **databuf)
 XWMQ API: 尝试从消息队列 首端 接收一条消息
 
xwer_t xwmq_rq (struct xwmq *mq, xwsq_t *topic, void **databuf)
 XWMQ API: 等待从消息队列 尾端 接收一条消息
 
xwer_t xwmq_rq_to (struct xwmq *mq, xwsq_t *topic, void **databuf, xwtm_t to)
 XWMQ API: 限时等待从消息队列 尾端 接收一条消息
 
xwer_t xwmq_rq_unintr (struct xwmq *mq, xwsq_t *topic, void **databuf)
 XWMQ API: 等待从消息队列 尾端 接收一条消息,且等待不可被中断
 
xwer_t xwmq_tryrq (struct xwmq *mq, xwsq_t *topic, void **databuf)
 XWMQ API: 尝试从消息队列 尾端 接收一条消息
 

详细描述

技术参考手册: 消息队列

消息队列的静态初始化、销毁

消息队列的动态创建、删除

XWOS并未提供基于动态内存管理的创建与删除CAPI。

发送消息

接收消息

消息队列对象的生命周期管理

对象描述符和对象标签

已知消息队列对象的指针的情况下,可以通过 xwmq_get_d() 获取 xwmq_d , 或可以通过 xwmq_get_tik() 获取对象标签。

函数说明

◆ xwmq_acquire()

xwer_t xwmq_acquire ( xwmq_d  mqd)

XWMQ API:检查消息队列对象的标签并增加引用计数

参数
[in]mqd消息队列对象描述符
返回
错误码
返回值
XWOK没有错误
-ENILOBJD空的对象描述符
-EOBJDEAD对象无效
-EACCES对象标签检查失败
注解
  • 上下文:任意

在文件 xwmq.c59 行定义.

60{
61 return xwos_object_acquire(&mqd.mq->xwobj, mqd.tik);
62}
xwer_t xwos_object_acquire(struct xwos_object *obj, xwsq_t tik)
检查对象的标签并增加引用计数
Definition object.c:206
xwsq_t tik
Definition mif.h:112
struct xwmq * mq
Definition mif.h:111
struct xwos_object xwobj
Definition mif.h:98
函数调用图:

◆ xwmq_dq()

xwer_t xwmq_dq ( struct xwmq mq,
xwsq_t topic,
void **  databuf 
)

XWMQ API: 等待从消息队列 首端 接收一条消息

参数
[in]mq消息队列对象的指针
[out]:topic指向缓冲区的指针,通过此缓冲区返回接收消息的标题
[out]:databuf指向缓冲区的指针,通过此缓冲区返回接收消息的数据
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-EINTR等待被中断
-ENOTTHDCTX不在线程上下文中
-EDISIRQ中断被关闭
-EDISPMPT抢占被关闭
-EDISBH中断底半部被关闭
注解
  • 上下文:线程

若接收队列中没有消息,就阻塞接收线程,直到有新的消息或被中断。

接收消息后,会释放消息槽。若有发送线程正在等待消息槽,将唤醒发送线程。

如果等待被中断,此CAPI将返回 -EINTR

在文件 xwmq.c388 行定义.

389{
390 return xwmq_dq_to(mq, topic, databuf, XWTM_MAX);
391}
xwer_t xwmq_dq_to(struct xwmq *mq, xwsq_t *topic, void **databuf, xwtm_t to)
XWMQ API: 限时等待从消息队列 首端 接收一条消息
Definition xwmq.c:394
#define XWTM_MAX
xwtm_t 的最大值
Definition type.h:755
函数调用图:

◆ xwmq_dq_to()

xwer_t xwmq_dq_to ( struct xwmq mq,
xwsq_t topic,
void **  databuf,
xwtm_t  to 
)

XWMQ API: 限时等待从消息队列 首端 接收一条消息

参数
[in]mq消息队列对象的指针
[out]:topic指向缓冲区的指针,通过此缓冲区返回接收消息的标题
[out]:databuf指向缓冲区的指针,通过此缓冲区返回接收消息的数据
[in]to期望唤醒的时间点
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-EINTR等待被中断
-ETIMEDOUT超时
-ENOTTHDCTX不在线程上下文中
-EDISIRQ中断被关闭
-EDISPMPT抢占被关闭
-EDISBH中断底半部被关闭
注解
  • 上下文:线程
  • 若接收队列中没有消息,就阻塞接收线程,直到新的消息或被中断或超时。
  • 接收消息后,会释放消息槽。若有发送线程正在等待消息槽,将唤醒发送线程。
  • 如果等待被中断,此CAPI将返回 -EINTR
  • to 表示等待超时的时间点:
    • to 通常是未来的时间,即 当前系统时间 + delta , 可以使用 xwtm_ft(delta) 表示;
    • 如果 to 是过去的时间点,将直接返回 -ETIMEDOUT

<No error

在文件 xwmq.c394 行定义.

395{
396 xwer_t rc;
397 struct xwmq_msg * msg;
398
399 XWOS_VALIDATE((mq), "nullptr", -EFAULT);
400 XWOS_VALIDATE((topic), "nullptr", -EFAULT);
401 XWOS_VALIDATE((databuf), "nullptr", -EFAULT);
402
403 rc = xwos_sem_wait_to(&mq->rxqsem, to);
404 if (rc < 0) {
405 goto err_sem_wait_to;
406 }
407 msg = xwmq_choose_head(mq);
408 *databuf = msg->data;
409 if (NULL != topic) {
410 *topic = msg->topic;
411 }
412 xwmq_msg_put(mq, msg);
413 xwos_sem_post(&mq->txqsem);
414 return XWOK;
415
416err_sem_wait_to:
417 return rc;
418}
#define EFAULT
Bad address
Definition errno.h:44
#define XWOK
No error
Definition errno.h:182
signed long xwer_t
Definition type.h:554
#define NULL
Definition type.h:28
#define XWOS_VALIDATE(exp, errstr,...)
检查函数参数是否有效
Definition standard.h:76
static xwer_t xwos_sem_wait_to(struct xwos_sem *sem, xwtm_t to)
XWOS API:限时等待并获取信号量
Definition sem.h:418
static xwer_t xwos_sem_post(struct xwos_sem *sem)
XWOS API:发布信号量
Definition sem.h:373
消息队列的消息
Definition mif.h:87
void * data
Definition mif.h:88
xwsq_t topic
Definition mif.h:89
struct xwos_sem rxqsem
Definition mif.h:104
struct xwos_sem txqsem
Definition mif.h:101
static void xwmq_msg_put(struct xwmq *mq, struct xwmq_msg *msg)
释放一个消息槽
Definition xwmq.c:169
static struct xwmq_msg * xwmq_choose_head(struct xwmq *mq)
从消息接收队列头部选择一条消息
Definition xwmq.c:354
函数调用图:
这是这个函数的调用关系图:

◆ xwmq_dq_unintr()

xwer_t xwmq_dq_unintr ( struct xwmq mq,
xwsq_t topic,
void **  databuf 
)

XWMQ API: 等待从消息队列 首端 接收一条消息,且等待不可被中断

参数
[in]mq消息队列对象的指针
[out]:topic指向缓冲区的指针,通过此缓冲区返回接收消息的标题
[out]:databuf指向缓冲区的指针,通过此缓冲区返回接收消息的数据
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-ENOTTHDCTX不在线程上下文中
-EDISIRQ中断被关闭
-EDISPMPT抢占被关闭
-EDISBH中断底半部被关闭
注解
  • 上下文:线程

若接收队列中没有消息,就阻塞接收线程,直到有新的消息。 并且接收线程的等待不可被中断。

接收消息后,会释放消息槽。若有发送线程正在等待消息槽,将唤醒发送线程。

<No error

在文件 xwmq.c421 行定义.

422{
423 xwer_t rc;
424 struct xwmq_msg * msg;
425
426 XWOS_VALIDATE((mq), "nullptr", -EFAULT);
427 XWOS_VALIDATE((topic), "nullptr", -EFAULT);
428 XWOS_VALIDATE((databuf), "nullptr", -EFAULT);
429
430 rc = xwos_sem_wait_unintr(&mq->rxqsem);
431 if (rc < 0) {
432 goto err_sem_wait_unintr;
433 }
434 msg = xwmq_choose_head(mq);
435 *databuf = msg->data;
436 if (NULL != topic) {
437 *topic = msg->topic;
438 }
439 xwmq_msg_put(mq, msg);
440 xwos_sem_post(&mq->txqsem);
441 return XWOK;
442
443err_sem_wait_unintr:
444 return rc;
445}
static xwer_t xwos_sem_wait_unintr(struct xwos_sem *sem)
XWOS API:等待并获取信号量,且等待不可被中断
Definition sem.h:436
函数调用图:

◆ xwmq_eq()

xwer_t xwmq_eq ( struct xwmq mq,
xwsq_t  topic,
void *  data 
)

XWMQ API:等待消息槽,成功后将消息发送到消息队列的 尾端 (入队)

参数
[in]mq消息队列对象的指针
[in]topic消息的标题
[in]data消息的数据
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-EINTR等待被中断
-ENOTTHDCTX不在线程上下文中
-EDISIRQ中断被关闭
-EDISPMPT抢占被关闭
-EDISBH中断底半部被关闭
注解
  • 上下文:线程

若消息槽队列中没有空闲的消息槽,就阻塞发送线程,直到有空闲的消息槽或被中断。

如果等待被中断,此CAPI将返回 -EINTR

在文件 xwmq.c176 行定义.

177{
178 return xwmq_eq_to(mq, topic, data, XWTM_MAX);
179}
xwer_t xwmq_eq_to(struct xwmq *mq, xwsq_t topic, void *data, xwtm_t to)
XWMQ API:限时等待消息槽,成功后将消息发送到消息队列的 尾端 (入队)
Definition xwmq.c:182
函数调用图:

◆ xwmq_eq_to()

xwer_t xwmq_eq_to ( struct xwmq mq,
xwsq_t  topic,
void *  data,
xwtm_t  to 
)

XWMQ API:限时等待消息槽,成功后将消息发送到消息队列的 尾端 (入队)

参数
[in]mq消息队列对象的指针
[in]topic消息的标题
[in]data消息的数据
[in]to期望唤醒的时间点
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-EINTR等待被中断
-ETIMEDOUT超时
-ENOTTHDCTX不在线程上下文中
-EDISIRQ中断被关闭
-EDISPMPT抢占被关闭
-EDISBH中断底半部被关闭
注解
  • 上下文:线程
  • 若消息槽队列中没有空闲的消息槽,就阻塞发送线程,直到有空闲的消息槽或被中断或超时。
  • 如果等待被中断,此CAPI将返回 -EINTR
  • to 表示等待超时的时间点:
    • to 通常是未来的时间,即 当前系统时间 + delta , 可以使用 xwtm_ft(delta) 表示;
    • 如果 to 是过去的时间点,将直接返回 -ETIMEDOUT

<No error

在文件 xwmq.c182 行定义.

183{
184 xwer_t rc;
185 xwreg_t cpuirq;
186 struct xwmq_msg * msg;
187
188 XWOS_VALIDATE((mq), "nullptr", -EFAULT);
189 XWOS_VALIDATE((data), "nullptr", -EFAULT);
190
191 rc = xwos_sem_wait_to(&mq->txqsem, to);
192 if (rc < 0) {
193 goto err_sem_wait_to;
194 }
195 msg = xwmq_msg_get(mq);
196 msg->topic = topic;
197 msg->data = data;
198 xwos_splk_lock_cpuirqsv(&mq->rxqlock, &cpuirq);
199 xwlib_bclst_add_tail(&mq->rxq, &msg->node);
201 xwos_sem_post(&mq->rxqsem);
202 return XWOK;
203
204err_sem_wait_to:
205 return rc;
206}
static void xwlib_bclst_add_tail(struct xwlib_bclst_node *head, struct xwlib_bclst_node *newn)
将一个节点加入链表尾部(链表头的前面)
Definition bclst.h:357
xwptr_t xwreg_t
Definition type.h:409
static void xwos_splk_unlock_cpuirqrs(struct xwos_splk *spl, xwreg_t cpuirq)
XWOS API:解锁自旋锁,并恢复本地CPU的中断标志
Definition spinlock.h:224
static void xwos_splk_lock_cpuirqsv(struct xwos_splk *spl, xwreg_t *cpuirq)
XWOS API:上锁自旋锁,保存本地CPU的中断标志并关闭
Definition spinlock.h:192
struct xwlib_bclst_node node
Definition mif.h:90
struct xwlib_bclst_node rxq
Definition mif.h:102
struct xwos_splk rxqlock
Definition mif.h:103
static struct xwmq_msg * xwmq_msg_get(struct xwmq *mq)
获取一个消息槽
Definition xwmq.c:153
函数调用图:
这是这个函数的调用关系图:

◆ xwmq_eq_unintr()

xwer_t xwmq_eq_unintr ( struct xwmq mq,
xwsq_t  topic,
void *  data 
)

XWMQ API:等待消息槽,且等待不可被中断, 成功后将消息发送到消息队列的 尾端 (入队)

参数
[in]mq消息队列对象的指针
[in]topic消息的标题
[in]data消息的数据
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-ENOTTHDCTX不在线程上下文中
-EDISIRQ中断被关闭
-EDISPMPT抢占被关闭
-EDISBH中断底半部被关闭
注解
  • 上下文:线程

若消息槽队列中没有空闲的消息槽,就阻塞发送线程,直到有空闲的消息槽。 并且发送线程的等待不可被中断。

<No error

在文件 xwmq.c209 行定义.

210{
211 xwer_t rc;
212 xwreg_t cpuirq;
213 struct xwmq_msg * msg;
214
215 XWOS_VALIDATE((mq), "nullptr", -EFAULT);
216 XWOS_VALIDATE((data), "nullptr", -EFAULT);
217
218 rc = xwos_sem_wait_unintr(&mq->txqsem);
219 if (rc < 0) {
220 goto err_sem_wait_unintr;
221 }
222 msg = xwmq_msg_get(mq);
223 msg->topic = topic;
224 msg->data = data;
225 xwos_splk_lock_cpuirqsv(&mq->rxqlock, &cpuirq);
226 xwlib_bclst_add_tail(&mq->rxq, &msg->node);
228 xwos_sem_post(&mq->rxqsem);
229 return XWOK;
230
231err_sem_wait_unintr:
232 return rc;
233}
函数调用图:

◆ xwmq_fini()

xwer_t xwmq_fini ( struct xwmq mq)

XWMQ API:销毁静态方式初始化的消息队列对象

参数
[in]mq消息队列对象的指针
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
注解
  • 上下文:任意

在文件 xwmq.c131 行定义.

132{
133 XWOS_VALIDATE((mq), "nullptr", -EFAULT);
134 return xwmq_put(mq);
135}
xwer_t xwmq_put(struct xwmq *mq)
XWMQ API:减少消息队列对象的引用计数
Definition xwmq.c:79
函数调用图:

◆ xwmq_get_d()

static xwmq_d xwmq_get_d ( struct xwmq mq)
inlinestatic

XWMQ API:获取消息队列对象描述符

参数
[in]mq消息队列对象的指针
返回
消息队列对象描述符
注解
  • 上下文:任意

在文件 mif.h180 行定义.

181{
182 xwmq_d mqd;
183
184 mqd.mq = mq;
185 mqd.tik = xwmq_get_tik(mq);
186 return mqd;
187}
xwsq_t xwmq_get_tik(struct xwmq *mq)
XWMQ API:获取消息队列对象的标签
Definition xwmq.c:46
消息队列对象描述符
Definition mif.h:110
函数调用图:

◆ xwmq_get_tik()

xwsq_t xwmq_get_tik ( struct xwmq mq)

XWMQ API:获取消息队列对象的标签

参数
[in]mq消息队列对象的指针
返回
消息队列对象的标签
注解
  • 上下文:任意

在文件 xwmq.c46 行定义.

47{
48 xwsq_t tik;
49
50 if (NULL != mq) {
51 tik = mq->xwobj.tik;
52 } else {
53 tik = 0;
54 }
55 return tik;
56}
unsigned long xwsq_t
Definition type.h:445
xwsq_t tik
Definition object.h:54
这是这个函数的调用关系图:

◆ xwmq_grab()

xwer_t xwmq_grab ( struct xwmq mq)

XWMQ API:增加消息队列对象的引用计数

参数
[in]mq消息队列控制块对象指针
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-EOBJDEAD对象无效
注解
  • 上下文:任意

在文件 xwmq.c71 行定义.

72{
73 XWOS_VALIDATE((mq), "nullptr", -EFAULT);
74
75 return xwos_object_grab(&mq->xwobj);
76}
xwer_t xwos_object_grab(struct xwos_object *obj)
增加对象的引用计数
Definition object.c:297
函数调用图:

◆ xwmq_init()

xwer_t xwmq_init ( struct xwmq mq,
struct xwmq_msg txq,
xwsz_t  num 
)

XWMQ API:静态方式初始化消息队列

参数
[in]mq消息队列对象的指针
[in]txq消息槽内存池
[in]num消息槽数量
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-EINVAL无效参数
注解
  • 上下文:任意

在文件 xwmq.c121 行定义.

122{
123 XWOS_VALIDATE((mq), "nullptr", -EFAULT);
124 XWOS_VALIDATE((txq), "nullptr", -EFAULT);
125
126 xwmq_construct(mq);
127 return xwmq_activate(mq, txq, num, xwmq_gc);
128}
static xwer_t xwmq_gc(struct xwos_object *obj)
Definition xwmq.c:34
static xwer_t xwmq_activate(struct xwmq *mq, struct xwmq_msg *txq, xwsz_t num, xwobj_gc_f gcfunc)
Definition xwmq.c:90
static void xwmq_construct(struct xwmq *mq)
Definition xwmq.c:22
函数调用图:

◆ xwmq_jq()

xwer_t xwmq_jq ( struct xwmq mq,
xwsq_t  topic,
void *  data 
)

XWMQ API:等待消息槽,成功后将消息发送到消息队列的 首端 (插队)

参数
[in]mq消息队列对象的指针
[in]topic消息的标题
[in]data消息的数据
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-EINTR等待被中断
-ENOTTHDCTX不在线程上下文中
-EDISIRQ中断被关闭
-EDISPMPT抢占被关闭
-EDISBH中断底半部被关闭
注解
  • 上下文:线程

若消息槽队列中没有空闲的消息槽,就阻塞发送线程,直到有空闲的消息槽或被中断。

如果等待被中断,此CAPI将返回 -EINTR

在文件 xwmq.c263 行定义.

264{
265 return xwmq_jq_to(mq, topic, data, XWTM_MAX);
266}
xwer_t xwmq_jq_to(struct xwmq *mq, xwsq_t topic, void *data, xwtm_t to)
XWMQ API:限时等待消息槽,成功后将消息发送到消息队列的 首端 (插队)
Definition xwmq.c:269
函数调用图:

◆ xwmq_jq_to()

xwer_t xwmq_jq_to ( struct xwmq mq,
xwsq_t  topic,
void *  data,
xwtm_t  to 
)

XWMQ API:限时等待消息槽,成功后将消息发送到消息队列的 首端 (插队)

参数
[in]mq消息队列对象的指针
[in]topic消息的标题
[in]data消息的数据
[in]to期望唤醒的时间点
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-EINTR等待被中断
-ETIMEDOUT超时
-ENOTTHDCTX不在线程上下文中
-EDISIRQ中断被关闭
-EDISPMPT抢占被关闭
-EDISBH中断底半部被关闭
注解
  • 上下文:线程
  • 若消息槽队列中没有空闲的消息槽,就阻塞发送线程,直到有空闲的消息槽或被中断或超时。
  • 如果等待被中断,此CAPI将返回 -EINTR
  • to 表示等待超时的时间点:
    • to 通常是未来的时间,即 当前系统时间 + delta , 可以使用 xwtm_ft(delta) 表示;
    • 如果 to 是过去的时间点,将直接返回 -ETIMEDOUT

<No error

在文件 xwmq.c269 行定义.

270{
271 xwer_t rc;
272 xwreg_t cpuirq;
273 struct xwmq_msg * msg;
274
275 XWOS_VALIDATE((mq), "nullptr", -EFAULT);
276 XWOS_VALIDATE((data), "nullptr", -EFAULT);
277
278 rc = xwos_sem_wait_to(&mq->txqsem, to);
279 if (rc < 0) {
280 goto err_sem_wait_to;
281 }
282 msg = xwmq_msg_get(mq);
283 msg->topic = topic;
284 msg->data = data;
285 xwos_splk_lock_cpuirqsv(&mq->rxqlock, &cpuirq);
286 xwlib_bclst_add_head(&mq->rxq, &msg->node);
288 xwos_sem_post(&mq->rxqsem);
289 return XWOK;
290
291err_sem_wait_to:
292 return rc;
293}
static void xwlib_bclst_add_head(struct xwlib_bclst_node *head, struct xwlib_bclst_node *newn)
将一个节点加入链表头部(链表头的后面)
Definition bclst.h:345
函数调用图:
这是这个函数的调用关系图:

◆ xwmq_jq_unintr()

xwer_t xwmq_jq_unintr ( struct xwmq mq,
xwsq_t  topic,
void *  data 
)

XWMQ API:等待消息槽,且等待不可被中断, 成功后将消息发送到消息队列的 首端 (插队)

参数
[in]mq消息队列对象的指针
[in]topic消息的标题
[in]data消息的数据
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-ENOTTHDCTX不在线程上下文中
-EDISIRQ中断被关闭
-EDISPMPT抢占被关闭
-EDISBH中断底半部被关闭
注解
  • 上下文:线程

若消息槽队列中没有空闲的消息槽,就阻塞发送线程,直到有空闲的消息槽。 并且发送线程的等待不可被中断。

<No error

在文件 xwmq.c296 行定义.

297{
298 xwer_t rc;
299 xwreg_t cpuirq;
300 struct xwmq_msg * msg;
301
302 XWOS_VALIDATE((mq), "nullptr", -EFAULT);
303 XWOS_VALIDATE((data), "nullptr", -EFAULT);
304
305 rc = xwos_sem_wait_unintr(&mq->txqsem);
306 if (rc < 0) {
307 goto err_sem_wait_unintr;
308 }
309 msg = xwmq_msg_get(mq);
310 msg->topic = topic;
311 msg->data = data;
312 xwos_splk_lock_cpuirqsv(&mq->rxqlock, &cpuirq);
313 xwlib_bclst_add_head(&mq->rxq, &msg->node);
315 xwos_sem_post(&mq->rxqsem);
316 return XWOK;
317
318err_sem_wait_unintr:
319 return rc;
320}
函数调用图:

◆ xwmq_put()

xwer_t xwmq_put ( struct xwmq mq)

XWMQ API:减少消息队列对象的引用计数

参数
[in]mq消息队列控制块对象指针
返回
错误码
返回值
XWOK没有错误
-EOBJDEAD对象无效
注解
  • 上下文:任意

在文件 xwmq.c79 行定义.

80{
81 XWOS_VALIDATE((mq), "nullptr", -EFAULT);
82
83 return xwos_object_put(&mq->xwobj);
84}
xwer_t xwos_object_put(struct xwos_object *obj)
减少对象的引用计数
Definition object.c:316
函数调用图:
这是这个函数的调用关系图:

◆ xwmq_release()

xwer_t xwmq_release ( xwmq_d  mqd)

XWMQ API:检查消息队列对象的标签并减少引用计数

参数
[in]mqd消息队列对象描述符
返回
错误码
返回值
XWOK没有错误
-ENILOBJD空的对象描述符
-EOBJDEAD对象无效
-EACCES对象标签检查失败
注解
  • 上下文:任意

在文件 xwmq.c65 行定义.

66{
67 return xwos_object_release(&mqd.mq->xwobj, mqd.tik);
68}
xwer_t xwos_object_release(struct xwos_object *obj, xwsq_t tik)
检查对象的标签并减少引用计数
Definition object.c:265
函数调用图:

◆ xwmq_rq()

xwer_t xwmq_rq ( struct xwmq mq,
xwsq_t topic,
void **  databuf 
)

XWMQ API: 等待从消息队列 尾端 接收一条消息

参数
[in]mq消息队列对象的指针
[out]:topic指向缓冲区的指针,通过此缓冲区返回接收消息的标题
[out]:databuf指向缓冲区的指针,通过此缓冲区返回接收消息的数据
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-EINTR等待被中断
-ENOTTHDCTX不在线程上下文中
-EDISIRQ中断被关闭
-EDISPMPT抢占被关闭
-EDISBH中断底半部被关闭
注解
  • 上下文:线程

若接收队列中没有消息,就阻塞接收线程,直到有新的消息或被中断。

接收消息后,会释放消息槽。若有发送线程正在等待消息槽,将唤醒发送线程。

如果等待被中断,此CAPI将返回 -EINTR

在文件 xwmq.c475 行定义.

476{
477 return xwmq_rq_to(mq, topic, databuf, XWTM_MAX);
478}
xwer_t xwmq_rq_to(struct xwmq *mq, xwsq_t *topic, void **databuf, xwtm_t to)
XWMQ API: 限时等待从消息队列 尾端 接收一条消息
Definition xwmq.c:481
函数调用图:

◆ xwmq_rq_to()

xwer_t xwmq_rq_to ( struct xwmq mq,
xwsq_t topic,
void **  databuf,
xwtm_t  to 
)

XWMQ API: 限时等待从消息队列 尾端 接收一条消息

参数
[in]mq消息队列对象的指针
[out]:topic指向缓冲区的指针,通过此缓冲区返回接收消息的标题
[out]:databuf指向缓冲区的指针,通过此缓冲区返回接收消息的数据
[in]to期望唤醒的时间点
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-EINTR等待被中断
-ETIMEDOUT超时
-ENOTTHDCTX不在线程上下文中
-EDISIRQ中断被关闭
-EDISPMPT抢占被关闭
-EDISBH中断底半部被关闭
注解
  • 上下文:线程
  • 若接收队列中没有消息,就阻塞接收线程,直到新的消息或被中断或超时。
  • 接收消息后,会释放消息槽。若有发送线程正在等待消息槽,将唤醒发送线程。
  • 如果等待被中断,此CAPI将返回 -EINTR
  • to 表示等待超时的时间点:
    • to 通常是未来的时间,即 当前系统时间 + delta , 可以使用 xwtm_ft(delta) 表示;
    • 如果 to 是过去的时间点,将直接返回 -ETIMEDOUT

<No error

在文件 xwmq.c481 行定义.

482{
483 xwer_t rc;
484 struct xwmq_msg * msg;
485
486 XWOS_VALIDATE((mq), "nullptr", -EFAULT);
487 XWOS_VALIDATE((topic), "nullptr", -EFAULT);
488 XWOS_VALIDATE((databuf), "nullptr", -EFAULT);
489
490 rc = xwos_sem_wait_to(&mq->rxqsem, to);
491 if (rc < 0) {
492 goto err_sem_wait_to;
493 }
494 msg = xwmq_choose_tail(mq);
495 *databuf = msg->data;
496 if (NULL != topic) {
497 *topic = msg->topic;
498 }
499 xwmq_msg_put(mq, msg);
500 xwos_sem_post(&mq->txqsem);
501 return XWOK;
502
503err_sem_wait_to:
504 return rc;
505}
static struct xwmq_msg * xwmq_choose_tail(struct xwmq *mq)
从消息接收队列尾部选择一条消息
Definition xwmq.c:373
函数调用图:
这是这个函数的调用关系图:

◆ xwmq_rq_unintr()

xwer_t xwmq_rq_unintr ( struct xwmq mq,
xwsq_t topic,
void **  databuf 
)

XWMQ API: 等待从消息队列 尾端 接收一条消息,且等待不可被中断

参数
[in]mq消息队列对象的指针
[out]:topic指向缓冲区的指针,通过此缓冲区返回接收消息的标题
[out]:databuf指向缓冲区的指针,通过此缓冲区返回接收消息的数据
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-ENOTTHDCTX不在线程上下文中
-EDISIRQ中断被关闭
-EDISPMPT抢占被关闭
-EDISBH中断底半部被关闭
注解
  • 上下文:线程

若接收队列中没有消息,就阻塞接收线程,直到有新的消息。 并且接收线程的等待不可被中断。

接收消息后,会释放消息槽。若有发送线程正在等待消息槽,将唤醒发送线程。

<No error

在文件 xwmq.c508 行定义.

509{
510 xwer_t rc;
511 struct xwmq_msg * msg;
512
513 XWOS_VALIDATE((mq), "nullptr", -EFAULT);
514 XWOS_VALIDATE((topic), "nullptr", -EFAULT);
515 XWOS_VALIDATE((databuf), "nullptr", -EFAULT);
516
517 rc = xwos_sem_wait_unintr(&mq->rxqsem);
518 if (rc < 0) {
519 goto err_sem_wait_unintr;
520 }
521 msg = xwmq_choose_tail(mq);
522 *databuf = msg->data;
523 if (NULL != topic) {
524 *topic = msg->topic;
525 }
526 xwmq_msg_put(mq, msg);
527 xwos_sem_post(&mq->txqsem);
528 return XWOK;
529
530err_sem_wait_unintr:
531 return rc;
532}
函数调用图:

◆ xwmq_trydq()

xwer_t xwmq_trydq ( struct xwmq mq,
xwsq_t topic,
void **  databuf 
)

XWMQ API: 尝试从消息队列 首端 接收一条消息

参数
[in]mq消息队列对象的指针
[out]:topic指向缓冲区的指针,通过此缓冲区返回接收消息的标题
[out]:databuf指向缓冲区的指针,通过此缓冲区返回接收消息的数据
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-ENODATA接收队列为空
注解
  • 上下文:任意

若接收队列中没有新的消息,就立即返回 -ENODATA ,此CAPI可在中断中使用。

接收消息后,会释放消息槽。若有发送线程正在等待消息槽,将唤醒发送线程。

<No error

在文件 xwmq.c448 行定义.

449{
450 xwer_t rc;
451 struct xwmq_msg * msg;
452
453 XWOS_VALIDATE((mq), "nullptr", -EFAULT);
454 XWOS_VALIDATE((topic), "nullptr", -EFAULT);
455 XWOS_VALIDATE((databuf), "nullptr", -EFAULT);
456
457 rc = xwos_sem_trywait(&mq->rxqsem);
458 if (rc < 0) {
459 goto err_sem_trywait;
460 }
461 msg = xwmq_choose_head(mq);
462 *databuf = msg->data;
463 if (NULL != topic) {
464 *topic = msg->topic;
465 }
466 xwmq_msg_put(mq, msg);
467 xwos_sem_post(&mq->txqsem);
468 return XWOK;
469
470err_sem_trywait:
471 return rc;
472}
static xwer_t xwos_sem_trywait(struct xwos_sem *sem)
XWOS API:尝试获取信号量
Definition sem.h:454
函数调用图:

◆ xwmq_tryeq()

xwer_t xwmq_tryeq ( struct xwmq mq,
xwsq_t  topic,
void *  data 
)

XWMQ API:尝试获取消息槽,成功后将消息发送到消息队列的 尾端 (入队)

参数
[in]mq消息队列对象的指针
[in]topic消息的标题
[in]data消息的数据
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-ENODATA接收队列为空
注解
  • 上下文:任意

若消息槽队列中没有空闲的消息槽,就立即返回 -ENODATA,此CAPI可在中断中使用。

<No error

在文件 xwmq.c236 行定义.

237{
238 xwer_t rc;
239 xwreg_t cpuirq;
240 struct xwmq_msg * msg;
241
242 XWOS_VALIDATE((mq), "nullptr", -EFAULT);
243 XWOS_VALIDATE((data), "nullptr", -EFAULT);
244
245 rc = xwos_sem_trywait(&mq->txqsem);
246 if (rc < 0) {
247 goto err_sem_trywait;
248 }
249 msg = xwmq_msg_get(mq);
250 msg->topic = topic;
251 msg->data = data;
252 xwos_splk_lock_cpuirqsv(&mq->rxqlock, &cpuirq);
253 xwlib_bclst_add_tail(&mq->rxq, &msg->node);
255 xwos_sem_post(&mq->rxqsem);
256 return XWOK;
257
258err_sem_trywait:
259 return rc;
260}
函数调用图:

◆ xwmq_tryjq()

xwer_t xwmq_tryjq ( struct xwmq mq,
xwsq_t  topic,
void *  data 
)

XWMQ API:尝试获取消息槽,成功后将消息发送到消息队列的 首端 (插队)

参数
[in]mq消息队列对象的指针
[in]topic消息的标题
[in]data消息的数据
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-ENODATA接收队列为空
注解
  • 上下文:任意

若消息槽队列中没有空闲的消息槽,就立即返回 -ENODATA,此CAPI可在中断中使用。

<No error

在文件 xwmq.c323 行定义.

324{
325 xwer_t rc;
326 xwreg_t cpuirq;
327 struct xwmq_msg * msg;
328
329 XWOS_VALIDATE((mq), "nullptr", -EFAULT);
330 XWOS_VALIDATE((data), "nullptr", -EFAULT);
331
332 rc = xwos_sem_trywait(&mq->txqsem);
333 if (rc < 0) {
334 goto err_sem_trywait;
335 }
336 msg = xwmq_msg_get(mq);
337 msg->topic = topic;
338 msg->data = data;
339 xwos_splk_lock_cpuirqsv(&mq->rxqlock, &cpuirq);
340 xwlib_bclst_add_head(&mq->rxq, &msg->node);
342 xwos_sem_post(&mq->rxqsem);
343 return XWOK;
344
345err_sem_trywait:
346 return rc;
347}
函数调用图:

◆ xwmq_tryrq()

xwer_t xwmq_tryrq ( struct xwmq mq,
xwsq_t topic,
void **  databuf 
)

XWMQ API: 尝试从消息队列 尾端 接收一条消息

参数
[in]mq消息队列对象的指针
[out]:topic指向缓冲区的指针,通过此缓冲区返回接收消息的标题
[out]:databuf指向缓冲区的指针,通过此缓冲区返回接收消息的数据
返回
错误码
返回值
XWOK没有错误
-EFAULT空指针
-ENODATA接收队列为空
注解
  • 上下文:任意

若接收队列中没有新的消息,就立即返回 -ENODATA ,此CAPI可在中断中使用。

接收消息后,会释放消息槽。若有发送线程正在等待消息槽,将唤醒发送线程。

<No error

在文件 xwmq.c535 行定义.

536{
537 xwer_t rc;
538 struct xwmq_msg * msg;
539
540 XWOS_VALIDATE((mq), "nullptr", -EFAULT);
541 XWOS_VALIDATE((topic), "nullptr", -EFAULT);
542 XWOS_VALIDATE((databuf), "nullptr", -EFAULT);
543
544 rc = xwos_sem_trywait(&mq->rxqsem);
545 if (rc < 0) {
546 goto err_sem_trywait;
547 }
548 msg = xwmq_choose_tail(mq);
549 *databuf = msg->data;
550 if (NULL != topic) {
551 *topic = msg->topic;
552 }
553 xwmq_msg_put(mq, msg);
554 xwos_sem_post(&mq->txqsem);
555 return XWOK;
556
557err_sem_trywait:
558 return rc;
559}
函数调用图: