XWOS API  4.0
XWOS C/C++ API参考手册
载入中...
搜索中...
未找到
xwmq.c 文件参考

消息队列 更多...

#include <xwos/standard.h>
#include <xwos/lib/object.h>
#include <xwos/mm/memslice.h>
#include <xwmd/isc/xwmq/mif.h>
xwmq.c 的引用(Include)关系图:

浏览源代码.

函数

static void xwmq_msg_construct (struct xwmq_msg *msg)
 消息槽的构造函数
 
static void xwmq_construct (struct xwmq *mq)
 
static void xwmq_destruct (struct xwmq *mq)
 
static xwer_t xwmq_gc (struct xwos_object *obj)
 
xwsq_t xwmq_get_tik (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_grab (struct xwmq *mq)
 XWMQ API:增加消息队列对象的引用计数
 
xwer_t xwmq_put (struct xwmq *mq)
 XWMQ API:减少消息队列对象的引用计数
 
static xwer_t xwmq_activate (struct xwmq *mq, struct xwmq_msg *txq, xwsz_t num, xwobj_gc_f gcfunc)
 
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:销毁静态方式初始化的消息队列对象
 
static struct xwmq_msgxwmq_msg_get (struct xwmq *mq)
 获取一个消息槽
 
static void xwmq_msg_put (struct xwmq *mq, struct xwmq_msg *msg)
 释放一个消息槽
 
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:尝试获取消息槽,成功后将消息发送到消息队列的 首端 (插队)
 
static struct xwmq_msgxwmq_choose_head (struct xwmq *mq)
 从消息接收队列头部选择一条消息
 
static struct xwmq_msgxwmq_choose_tail (struct xwmq *mq)
 从消息接收队列尾部选择一条消息
 
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: 尝试从消息队列 尾端 接收一条消息
 

变量

static const char xwmq_txq_name [] = "xwmq.txq"
 

详细描述

消息队列

作者

在文件 xwmq.c 中定义.

函数说明

◆ xwmq_activate()

static xwer_t xwmq_activate ( struct xwmq mq,
struct xwmq_msg txq,
xwsz_t  num,
xwobj_gc_f  gcfunc 
)
static

<No error

在文件 xwmq.c90 行定义.

93{
94 xwer_t rc;
95
96 rc = xwos_object_activate(&mq->xwobj, gcfunc);
97 if (rc < 0) {
98 goto err_xwobj_activate;
99 }
100 rc = xwmm_memslice_init(&mq->txq,
101 (xwptr_t)txq,
102 sizeof(struct xwmq_msg) * num,
103 sizeof(struct xwmq_msg), xwmq_txq_name,
105 if (rc < 0) {
106 goto err_memslice_init;
107 }
108 xwos_sem_init(&mq->txqsem, (xwssq_t)num, (xwssq_t)num);
111 xwos_sem_init(&mq->rxqsem, 0, (xwssq_t)num);
112 return XWOK;
113
114err_memslice_init:
115 xwmq_put(mq); // cppcheck-suppress [misra-c2012-17.7]
116err_xwobj_activate:
117 return rc;
118}
xwer_t xwmq_put(struct xwmq *mq)
XWMQ API:减少消息队列对象的引用计数
Definition xwmq.c:79
xwer_t xwmm_memslice_init(struct xwmm_memslice *msa, xwptr_t origin, xwsz_t total_size, xwsz_t card_size, const char *name, ctor_f ctor, dtor_f dtor)
XWMM API:静态方式初始化内存切片分配器
Definition memslice.c:21
static void xwlib_bclst_init_head(struct xwlib_bclst_node *h)
初始化一个链表头。
Definition bclst.h:229
#define XWOK
No error
Definition errno.h:182
signed long xwer_t
Definition type.h:554
#define NULL
Definition type.h:28
signed long xwssq_t
Definition type.h:461
unsigned long xwptr_t
Definition type.h:375
void(* ctor_f)(void *)
Definition type.h:604
xwer_t xwos_object_activate(struct xwos_object *obj, xwobj_gc_f gcfunc)
激活一个XWOS对象(将其引用计数初始化位1)
Definition object.c:135
static void xwos_splk_init(struct xwos_splk *spl)
XWOS API:初始化自旋锁
Definition spinlock.h:89
static xwer_t xwos_sem_init(struct xwos_sem *sem, xwssq_t val, xwssq_t max)
XWOS API:静态方式初始化信号量对象
Definition sem.h:125
消息队列的消息
Definition mif.h:87
struct xwos_sem rxqsem
Definition mif.h:104
struct xwos_object xwobj
Definition mif.h:98
struct xwmm_memslice txq
Definition mif.h:100
struct xwos_sem txqsem
Definition mif.h:101
struct xwlib_bclst_node rxq
Definition mif.h:102
struct xwos_splk rxqlock
Definition mif.h:103
static const char xwmq_txq_name[]
Definition xwmq.c:87
static void xwmq_msg_construct(struct xwmq_msg *msg)
消息槽的构造函数
Definition xwmq.c:142
函数调用图:
这是这个函数的调用关系图:

◆ xwmq_choose_head()

static struct xwmq_msg * xwmq_choose_head ( struct xwmq mq)
static

从消息接收队列头部选择一条消息

参数
[in]mq消息队列对象的指针

在文件 xwmq.c354 行定义.

355{
356 struct xwmq_msg * msg;
357 xwreg_t cpuirq;
358
359 xwos_splk_lock_cpuirqsv(&mq->rxqlock, &cpuirq);
360 msg = xwlib_bclst_first_entry(&mq->rxq,
361 struct xwmq_msg,
362 node);
365 return msg;
366}
static void xwlib_bclst_del_init(struct xwlib_bclst_node *node)
删除一个节点,并重新初始化它
Definition bclst.h:391
#define xwlib_bclst_first_entry(head, type, member)
获得包含链表第一个节点的外层结构体的指针。
Definition bclst.h:63
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
函数调用图:
这是这个函数的调用关系图:

◆ xwmq_choose_tail()

static struct xwmq_msg * xwmq_choose_tail ( struct xwmq mq)
static

从消息接收队列尾部选择一条消息

参数
[in]mq消息队列对象的指针

在文件 xwmq.c373 行定义.

374{
375 struct xwmq_msg * msg;
376 xwreg_t cpuirq;
377
378 xwos_splk_lock_cpuirqsv(&mq->rxqlock, &cpuirq);
379 msg = xwlib_bclst_last_entry(&mq->rxq,
380 struct xwmq_msg,
381 node);
384 return msg;
385}
#define xwlib_bclst_last_entry(head, type, member)
获得包含链表最后一个节点的外层结构体的指针。
Definition bclst.h:73
函数调用图:
这是这个函数的调用关系图:

◆ xwmq_construct()

static void xwmq_construct ( struct xwmq mq)
static

在文件 xwmq.c22 行定义.

23{
25}
void xwos_object_construct(struct xwos_object *obj)
XWOS对象的构造函数
Definition object.c:107
函数调用图:
这是这个函数的调用关系图:

◆ xwmq_destruct()

static void xwmq_destruct ( struct xwmq mq)
static

在文件 xwmq.c28 行定义.

29{
31}
void xwos_object_destruct(struct xwos_object *obj)
XWOS对象的析构函数
Definition object.c:119
函数调用图:
这是这个函数的调用关系图:

◆ xwmq_gc()

static xwer_t xwmq_gc ( struct xwos_object obj)
static

<No error

在文件 xwmq.c34 行定义.

35{
36 struct xwmq * mq;
37
38 mq = xwcc_derof(obj, struct xwmq, xwobj);
41 xwmq_destruct(mq);
42 return XWOK;
43}
#define xwcc_derof(baseptr, derclass, member)
将基类结构体指针转换为派生类结构体指针
Definition compiler.h:501
static xwer_t xwos_sem_fini(struct xwos_sem *sem)
XWOS API:销毁静态方式初始化的信号量对象
Definition sem.h:140
消息队列对象
Definition mif.h:97
static void xwmq_destruct(struct xwmq *mq)
Definition xwmq.c:28
函数调用图:
这是这个函数的调用关系图:

◆ xwmq_msg_construct()

static void xwmq_msg_construct ( struct xwmq_msg msg)
static

消息槽的构造函数

参数
[in]msg消息槽的指针

在文件 xwmq.c142 行定义.

143{
145 msg->topic = 0;
146 msg->data = NULL;
147}
static void xwlib_bclst_init_node(struct xwlib_bclst_node *n)
初始化一个链表节点。
Definition bclst.h:240
void * data
Definition mif.h:88
xwsq_t topic
Definition mif.h:89
函数调用图:
这是这个函数的调用关系图:

◆ xwmq_msg_get()

static struct xwmq_msg * xwmq_msg_get ( struct xwmq mq)
static

获取一个消息槽

在文件 xwmq.c153 行定义.

154{
155 union {
156 struct xwmq_msg * msg;
157 void * anon;
158 } mem;
159
160 // cppcheck-suppress [misra-c2012-17.7]
161 xwmm_memslice_alloc(&mq->txq, &mem.anon);
162 return mem.msg;
163}
xwer_t xwmm_memslice_alloc(struct xwmm_memslice *msa, void **membuf)
XWMM API:申请内存切片
Definition memslice.c:83
函数调用图:
这是这个函数的调用关系图:

◆ xwmq_msg_put()

static void xwmq_msg_put ( struct xwmq mq,
struct xwmq_msg msg 
)
static

释放一个消息槽

在文件 xwmq.c169 行定义.

170{
171 // cppcheck-suppress [misra-c2012-17.7]
172 xwmm_memslice_free(&mq->txq, msg);
173}
xwer_t xwmm_memslice_free(struct xwmm_memslice *msa, void *mem)
XWMM API:释放内存切片
Definition memslice.c:107
函数调用图:
这是这个函数的调用关系图:

变量说明

◆ xwmq_txq_name

const char xwmq_txq_name[] = "xwmq.txq"
static

在文件 xwmq.c87 行定义.