队列状态机
flowchart TB
N0[// queue.h: urpc_queue_status]
N1[QUEUE_STATUS_IDLE // 空闲]
N0 --> N1
N2[↓]
N1 --> N2
N3[QUEUE_STATUS_RUNNING // 正在导入资源]
N2 --> N3
N4[↓]
N3 --> N4
N5[QUEUE_STATUS_READY // 就绪(可收发数据)]
N4 --> N5
N6[↓]
N5 --> N6
N7[QUEUE_STATUS_FAULT // 故障(可恢复)]
N6 --> N7
N8[↓]
N7 --> N8
N9[QUEUE_STATUS_ERR // 错误(不可恢复)]
N8 --> N9
创建阶段
flowchart TB
N0[queue_create_option_t *option]
N1[1, sizeof(send_recv_queue_local_t]
N2[provider, cfg_get, cfg, QUEUE_TRANS_MODE_JETTY]
N3[provider, send_recv_local_q, cfg, qid]
N4[中断模式]
N5[send_recv_local_q, provider, ops, flag, qid]
绑定阶段
// queue_send_recv.c: send_recv_bind_queue()
int send_recv_bind_queue(queue_t *l_queue, queue_t *r_queue) {
// 1. 导入远端 jetty
imported_queue->tjetty = urma_import_jetty(urma_ctx, &rjetty, &token);
// 2. 绑定 jetty(建立连接)
urma_bind_jetty(local_queue->jetty, imported_queue->tjetty);
// 3. 记录远端 jetty_id
local_queue->remote_jetty_id = imported_queue->tjetty->id;
local_queue->is_binded = TRUE;
}
数据传输
flowchart TB
N0[jetty, wr, &bad_wr]
N1[jfs_jfc, ...]
N2[jfr_jfc, ...]
排空与销毁
flowchart TB
N0[queue_t *l_queue]
N1[local]
N2[l_queue]
N3[local_q]
RX Buffer 管理
// 接收缓冲区上下文
typedef struct rx_buf_ctx {
urpc_list_t node;
umq_buf_t *buffer;
} rx_buf_ctx_t;
typedef struct rx_buf_ctx_list {
void *addr; // 分配的内存起始地址
urpc_list_t idle_rx_buf_ctx_list; // 空闲列表
urpc_list_t used_rx_buf_ctx_list; // 已用列表
} rx_buf_ctx_list_t;
// 预填充 RX buffer(bind 后)
static int umq_ub_prefill_rx_buf(ub_queue_t *queue) {
do {
qbuf = umq_buf_alloc(queue->rx_buf_size, batch_count, 0, NULL);
umq_ub_post_rx_inner_impl(queue, qbuf, &bad_buf);
require_rx_count -= cur_batch_count;
} while (require_rx_count > 0);
}