Files
mkrtos-real/mkrtos_user/lib/sys_util/inc/u_rpc.h

615 lines
38 KiB
C
Raw Normal View History

2023-09-23 13:15:09 +08:00
/**
* @file u_rpc.h
* @author zhangzheng (1358745329@qq.com)
* @brief
* @version 0.1
* @date 2023-09-23
*
* @copyright Copyright (c) 2023
*
*/
2023-09-24 01:26:07 +08:00
#pragma once
2023-09-22 00:14:27 +08:00
#include "u_types.h"
#include "u_thread.h"
#include "u_err.h"
#include "u_prot.h"
#include "u_ipc.h"
#include "u_task.h"
#include <stddef.h>
#include <sys/types.h>
2023-09-24 01:26:07 +08:00
#include <errno.h>
2023-09-23 13:15:09 +08:00
extern msg_tag_t dispatch_test(msg_tag_t tag, ipc_msg_t *msg);
/*rpc变量定义宏*/
2023-09-22 00:14:27 +08:00
#define RPC_TYPE_DEF(type) \
typedef struct rpc_##type \
{ \
type data; \
} rpc_##type##_t
static inline size_t rpc_align(size_t size, size_t align)
{
return ALIGN(size, align);
}
static inline void rpc_memcpy(void *dst, void *src, size_t size)
{
char *_dst = dst;
char *_src = src;
while (size--)
{
*_dst = *_src;
}
}
2023-09-22 21:56:15 +08:00
2023-09-23 13:15:09 +08:00
/*定义变量初始化宏函数*/
2023-09-22 21:56:15 +08:00
#define RPC_TYPE_INIT(data_type) \
static inline void rpc_var_##data_type##_init(data_type *d) \
{ \
uint8_t *tmp = (uint8_t *)(&(d->data)); \
for (int i = 0; i < sizeof(d->data); i++) \
{ \
tmp[i] = 0; \
} \
}
2023-09-23 13:15:09 +08:00
/*RPC的初始化函数定义*/
2023-09-22 21:56:15 +08:00
#define RPC_TYPE_INIT_WITHOUT_IMPL(data_type) \
static inline void rpc_var_##data_type##_init(data_type *d)
2023-09-23 13:15:09 +08:00
/*定义一个call函数*/
2023-09-22 21:56:15 +08:00
#define RPC_TYPE_INIT_FUNC_CALL(data_type, d) \
rpc_var_##data_type##_init(d)
/*end*/
/*普通数据定义*/
2023-09-23 13:15:09 +08:00
/**
* @brief buf
*
*/
2023-09-22 00:14:27 +08:00
#define RPC_CLI_MSG_TO_BUF(data_type, len_type) \
static inline int rpc_cli_msg_to_buf_##data_type(data_type *d, uint8_t *buf, len_type len) \
{ \
2023-09-22 21:56:15 +08:00
if (sizeof(d->data) + rpc_align(len, __alignof(d->data)) > IPC_MSG_SIZE) \
2023-09-22 00:14:27 +08:00
{ \
return -ETOLONG; \
} \
len = rpc_align(len, __alignof(d->data)); \
*((typeof(d->data) *)(buf + len)) = d->data; \
return sizeof(d->data) + rpc_align(len, __alignof(d->data)); \
}
#define RPC_CLI_MSG_TO_BUF_WITHOUT_IMPL(data_type, len_type) \
static inline int rpc_cli_msg_to_buf_##data_type(data_type *d, uint8_t *buf, len_type len)
2023-09-23 13:15:09 +08:00
/**
* @brief buf填充到消息
*
*/
2023-09-22 21:56:15 +08:00
#define RPC_SVR_BUF_TO_MSG(data_type, len_type) \
static inline int rpc_svr_buf_to_msg_##data_type(data_type *d, uint8_t *buf, len_type len, len_type max) \
{ \
if (sizeof(d->data) + rpc_align(len, __alignof(d->data)) > max) \
{ \
return -ETOLONG; \
} \
len = rpc_align(len, __alignof(d->data)); \
d->data = *((typeof(d->data) *)(buf + len)); \
return sizeof(d->data) + rpc_align(len, __alignof(d->data)); \
}
2023-09-23 13:15:09 +08:00
/**
* @brief buf填充到消息定义
*
*/
2023-09-22 21:56:15 +08:00
#define RPC_SVR_BUF_TO_MSG_WITHOUT_IMPL(data_type, len_type) \
static inline int rpc_svr_buf_to_msg_##data_type(data_type *d, uint8_t *buf, len_type len, len_type max)
2023-09-23 13:15:09 +08:00
/**
* @brief buf填充到消息
*
*/
2023-09-22 00:14:27 +08:00
#define RPC_CLI_BUF_TO_MSG(data_type, len_type) \
static inline int rpc_cli_buf_to_msg_##data_type(data_type *d, uint8_t *buf, len_type len, len_type max) \
{ \
2023-09-22 21:56:15 +08:00
if (sizeof(d->data) + rpc_align(len, __alignof(d->data)) > max) \
2023-09-22 00:14:27 +08:00
{ \
return -ETOLONG; \
} \
len = rpc_align(len, __alignof(d->data)); \
d->data = *((typeof(d->data) *)(buf + len)); \
return sizeof(d->data) + rpc_align(len, __alignof(d->data)); \
}
2023-09-23 13:15:09 +08:00
/**
* @brief buf填充到消息定义
*
*/
2023-09-22 21:56:15 +08:00
#define RPC_CLI_BUF_TO_MSG_WITHOUT_IMPL(data_type, len_type) \
2023-09-22 00:14:27 +08:00
static inline int rpc_cli_buf_to_msg_##data_type(data_type *d, uint8_t *buf, len_type len, len_type max)
2023-09-23 13:15:09 +08:00
/**
* @brief buf
*
*/
2023-09-22 21:56:15 +08:00
#define RPC_SVR_MSG_TO_BUF(data_type, len_type) \
static inline int rpc_svr_msg_to_buf_##data_type(data_type *d, uint8_t *buf, len_type len) \
{ \
if (sizeof(d->data) + rpc_align(len, __alignof(d->data)) > IPC_MSG_SIZE) \
{ \
return -ETOLONG; \
} \
len = rpc_align(len, __alignof(d->data)); \
*((typeof(d->data) *)(buf + len)) = d->data; \
return sizeof(d->data) + rpc_align(len, __alignof(d->data)); \
}
2023-09-23 13:15:09 +08:00
/**
* @brief buf定义
*
*/
2023-09-22 21:56:15 +08:00
#define RPC_SVR_MSG_TO_BUF_WITHOUT_IMPL(data_type, len_type) \
static inline int rpc_svr_msg_to_buf_##data_type(data_type *d, uint8_t *buf, len_type len)
2023-09-23 13:15:09 +08:00
/**
* @brief rpc类型转换为服务端类型
*
*/
#define RPC_CLI_TYPE_TRAN_TO_SVR_TYPE(cli_type, svr_type) \
static inline void rpc_cli_##cli_type##_tran_to_svr_##svr_type(cli_type *cli, svr_type *svr) \
{ \
cli->data = svr->data; \
}
2023-09-22 21:56:15 +08:00
/*end*/
2023-09-23 13:15:09 +08:00
/**
* @brief rpc类型
*
*/
2023-09-22 00:14:27 +08:00
#define RPC_TYPE_DEF_ALL(type) \
RPC_TYPE_DEF(type); \
RPC_CLI_MSG_TO_BUF(rpc_##type##_t, int) \
2023-09-22 21:56:15 +08:00
RPC_CLI_BUF_TO_MSG(rpc_##type##_t, int) \
RPC_SVR_BUF_TO_MSG(rpc_##type##_t, int) \
RPC_SVR_MSG_TO_BUF(rpc_##type##_t, int) \
2023-09-23 13:15:09 +08:00
RPC_TYPE_INIT(rpc_##type##_t) \
RPC_CLI_TYPE_TRAN_TO_SVR_TYPE(rpc_##type##_t, rpc_##type##_t)
2023-09-22 00:14:27 +08:00
RPC_TYPE_DEF_ALL(int) //!< 定义所有的
2023-09-23 13:15:09 +08:00
/**
* @brief rpc类型定义
*
*/
2023-09-22 00:14:27 +08:00
#define RPC_ARRAY_TYPE_DEF(len_type, data_type, length) \
typedef struct rpc_array_##len_type##_##data_type##_##length \
{ \
len_type len; \
data_type data[length]; \
} rpc_array_##len_type##_##data_type##_##length##_t
2023-09-23 13:15:09 +08:00
/**
* @brief RPC定义
*
*/
#define RPC_ARRAY_DEF(len_type, data_type, length) \
RPC_ARRAY_TYPE_DEF(len_type, data_type, length); \
RPC_SVR_MSG_TO_BUF_WITHOUT_IMPL(rpc_array_##len_type##_##data_type##_##length##_t, int) \
{ \
if (rpc_align(d->len, __alignof(d->len) + sizeof(d->len)) > IPC_MSG_SIZE) \
{ \
return -ETOLONG; \
} \
len = rpc_align(len, __alignof(d->len)); \
*((typeof(d->len) *)(&buf[len])) = d->len; \
if (rpc_align(d->len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > IPC_MSG_SIZE) \
{ \
return -ETOLONG; \
} \
len += sizeof(d->len); \
len = rpc_align(len, __alignof(d->data[0])); \
for (int i = 0; i < d->len * sizeof(d->data[0]); i++) \
{ \
buf[i + len] = ((uint8_t *)(d->data))[i]; \
} \
len += d->len * sizeof(d->data[0]); \
return len; \
} \
RPC_SVR_BUF_TO_MSG_WITHOUT_IMPL(rpc_array_##len_type##_##data_type##_##length##_t, int) \
{ \
if (rpc_align(d->len, __alignof(d->len) + sizeof(d->len)) > max) \
{ \
return -ETOLONG; \
} \
len = rpc_align(len, __alignof(d->len)); \
d->len = *((typeof(d->len) *)(&buf[len])); \
if (rpc_align(d->len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > max) \
{ \
return -ETOLONG; \
} \
len += sizeof(d->len); \
len = rpc_align(len, __alignof(d->data[0])); \
for (int i = 0; i < d->len * sizeof(d->data[0]); i++) \
{ \
((uint8_t *)(d->data))[i] = buf[i + len]; \
} \
len += d->len * sizeof(d->data[0]); \
return len; \
} \
RPC_CLI_MSG_TO_BUF_WITHOUT_IMPL(rpc_array_##len_type##_##data_type##_##length##_t, int) \
{ \
if (rpc_align(d->len, __alignof(d->len) + sizeof(d->len)) > IPC_MSG_SIZE) \
{ \
return -ETOLONG; \
} \
len = rpc_align(len, __alignof(d->len)); \
*((typeof(d->len) *)(&buf[len])) = d->len; \
if (rpc_align(d->len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > IPC_MSG_SIZE) \
{ \
return -ETOLONG; \
} \
len += sizeof(d->len); \
len = rpc_align(len, __alignof(d->data[0])); \
for (int i = 0; i < d->len * sizeof(d->data[0]); i++) \
{ \
buf[i + len] = ((uint8_t *)(d->data))[i]; \
} \
len += d->len * sizeof(d->data[0]); \
return len; \
} \
RPC_CLI_BUF_TO_MSG_WITHOUT_IMPL(rpc_array_##len_type##_##data_type##_##length##_t, int) \
{ \
if (rpc_align(d->len, __alignof(d->len) + sizeof(d->len)) > max) \
{ \
return -ETOLONG; \
} \
len = rpc_align(len, __alignof(d->len)); \
d->len = *((typeof(d->len) *)(&buf[len])); \
if (rpc_align(d->len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > max) \
{ \
return -ETOLONG; \
} \
len += sizeof(d->len); \
len = rpc_align(len, __alignof(d->data[0])); \
for (int i = 0; i < d->len * sizeof(d->data[0]); i++) \
{ \
((uint8_t *)(d->data))[i] = buf[i + len]; \
} \
len += d->len * sizeof(d->data[0]); \
return len; \
} \
RPC_TYPE_INIT_WITHOUT_IMPL(rpc_array_##len_type##_##data_type##_##length##_t) \
{ \
2023-09-22 00:14:27 +08:00
}
//!< end
2023-09-23 13:15:09 +08:00
/**
* @brief 32
*
*/
RPC_ARRAY_DEF(uint32_t, uint8_t, 32)
2023-09-22 00:14:27 +08:00
2023-09-23 13:15:09 +08:00
/**
* @brief
*
*/
2023-09-22 00:14:27 +08:00
#define RPC_REF_ARRAY_TYPE_DEF(len_type, data_type, length) \
typedef struct rpc_ref_array_##len_type##_##data_type##_##length \
{ \
len_type len; \
data_type *data; \
} rpc_ref_array_##len_type##_##data_type##_##length##_t
2023-09-23 13:15:09 +08:00
/**
* @brief
*
*/
#define RPC_REF_ARRAY_DEF(len_type, data_type, length) \
RPC_REF_ARRAY_TYPE_DEF(len_type, data_type, length); \
RPC_CLI_MSG_TO_BUF_WITHOUT_IMPL(rpc_ref_array_##len_type##_##data_type##_##length##_t, int) \
{ \
if (rpc_align(d->len, __alignof(d->len) + sizeof(d->len)) >= IPC_MSG_SIZE) \
{ \
return -ETOLONG; \
} \
len = rpc_align(len, __alignof(d->len)); \
*((typeof(d->len) *)(&buf[len])) = d->len; \
if (rpc_align(d->len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) > IPC_MSG_SIZE) \
{ \
return -ETOLONG; \
} \
len += sizeof(d->len); \
len = rpc_align(len, __alignof(d->data[0])); \
for (int i = 0; i < d->len * sizeof(d->data[0]); i++) \
{ \
buf[i + len] = ((uint8_t *)(d->data))[i]; \
} \
len += d->len * sizeof(d->data[0]); \
return len; \
} \
RPC_CLI_BUF_TO_MSG_WITHOUT_IMPL(rpc_ref_array_uint32_t_uint8_t_32_t, int) \
{ \
if (rpc_align(d->len, __alignof(d->len) + sizeof(d->len)) > max) \
{ \
return -ETOLONG; \
} \
len = rpc_align(len, __alignof(d->len)); \
d->len = *((typeof(d->len) *)(&buf[len])); \
if (rpc_align(d->len, __alignof(d->data[0]) + d->len * sizeof(d->data[0])) >= max) \
{ \
return -ETOLONG; \
} \
len += sizeof(d->len); \
len = rpc_align(len, __alignof(d->data[0])); \
for (int i = 0; i < d->len * sizeof(d->data[0]); i++) \
{ \
((uint8_t *)(d->data))[i] = buf[i + len]; \
} \
len += d->len * sizeof(d->data[0]); \
return len; \
2023-09-22 00:14:27 +08:00
}
//!< end
2023-09-23 13:15:09 +08:00
/**
* @brief 32
*
*/
RPC_REF_ARRAY_DEF(uint32_t, uint8_t, 32)
/**
* @brief Construct a new rpc type def object
*
*/
2023-09-22 00:14:27 +08:00
RPC_TYPE_DEF(obj_handler_t);
2023-09-23 13:15:09 +08:00
/**
* @brief Construct a new rpc cli msg to buf without impl object
*
*/
2023-09-22 00:14:27 +08:00
RPC_CLI_MSG_TO_BUF_WITHOUT_IMPL(rpc_obj_handler_t_t, int)
{
2023-09-22 23:45:29 +08:00
if (sizeof(d->data) + rpc_align(len, __alignof(d->data)) > IPC_MSG_SIZE)
2023-09-22 00:14:27 +08:00
{
return -ETOLONG;
}
len = rpc_align(len, __alignof(d->data));
*((umword_t *)(buf + len)) = vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, d->data).raw;
return sizeof(d->data) + rpc_align(len, __alignof(d->data));
}
2023-09-23 13:15:09 +08:00
/**
* @brief Construct a new rpc cli buf to msg without impl object
*
*/
2023-09-22 21:56:15 +08:00
RPC_CLI_BUF_TO_MSG_WITHOUT_IMPL(rpc_obj_handler_t_t, int)
{
return len;
}
2023-09-23 13:15:09 +08:00
/**
* @brief Construct a new rpc svr msg to buf without impl object
*
*/
2023-09-22 21:56:15 +08:00
RPC_SVR_MSG_TO_BUF_WITHOUT_IMPL(rpc_obj_handler_t_t, int)
{
2023-09-22 23:45:29 +08:00
if (sizeof(d->data) + rpc_align(len, __alignof(d->data)) > IPC_MSG_SIZE)
{
return -ETOLONG;
}
len = rpc_align(len, __alignof(d->data));
*((umword_t *)(buf + len)) = vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, d->data).raw;
return sizeof(d->data) + rpc_align(len, __alignof(d->data));
2023-09-22 21:56:15 +08:00
}
2023-09-23 13:15:09 +08:00
/**
* @brief Construct a new rpc svr buf to msg without impl object
*
*/
2023-09-22 21:56:15 +08:00
RPC_SVR_BUF_TO_MSG_WITHOUT_IMPL(rpc_obj_handler_t_t, int)
{
return len;
}
2023-09-23 13:15:09 +08:00
/**
* @brief Construct a new rpc type init without impl object
*
*/
RPC_TYPE_INIT_WITHOUT_IMPL(rpc_obj_handler_t_t)
{
}
2023-09-22 00:14:27 +08:00
//!< end
2023-09-23 13:15:09 +08:00
#define RPC_DIR_IN 1 //!< 输入类型
#define RPC_DIR_OUT 2 //!< 输出类型
#define RPC_DIR_INOUT 4 //!< 输入输出类型
2023-09-22 00:14:27 +08:00
2023-09-23 13:15:09 +08:00
#define RPC_TYPE_DATA 1 //!< 数据类型
#define RPC_TYPE_BUF 2 //!< 映射类型
2023-09-22 00:14:27 +08:00
2023-09-23 13:15:09 +08:00
/**
* @brief buf里面去
*
*/
2023-09-22 00:14:27 +08:00
#define RPC_CLI_MSG_TO_BUF_IN(rpc_type, var_type, var, dir, buf, off) \
do \
{ \
if (rpc_type == RPC_TYPE_DATA) \
{ \
if (dir == RPC_DIR_IN || dir == RPC_DIR_INOUT) \
{ \
int ret = rpc_cli_msg_to_buf_##var_type(var, (uint8_t *)(buf), off); \
if (ret < 0) \
{ \
return msg_tag_init4(0, 0, 0, ret); \
} \
off = ret; \
} \
} \
} while (0)
2023-09-22 21:56:15 +08:00
/*客户端从buf里面取出数据*/
2023-09-22 00:14:27 +08:00
#define RPC_CLI_BUF_TO_MSG_OUT(rpc_type, var_type, var, dir, buf, off, max) \
do \
{ \
if (rpc_type == RPC_TYPE_DATA) \
{ \
if (dir == RPC_DIR_OUT || dir == RPC_DIR_INOUT) \
{ \
int ret = rpc_cli_buf_to_msg_##var_type(var, (uint8_t *)(buf), off, max); \
if (ret < 0) \
{ \
return msg_tag_init4(0, 0, 0, ret); \
} \
off = ret; \
} \
} \
} while (0)
2023-09-23 13:15:09 +08:00
/**
* @brief
*
*/
#define PRC_CLI_FILL_MAP_BUF(rpc_type, var_type, var, dir, buf, off) \
2023-09-22 00:14:27 +08:00
do \
{ \
if (rpc_type == RPC_TYPE_BUF) \
{ \
if (dir == RPC_DIR_IN || dir == RPC_DIR_INOUT) \
{ \
int ret = rpc_cli_msg_to_buf_##var_type(var, (uint8_t *)(buf), off); \
if (ret < 0) \
{ \
return msg_tag_init4(0, 0, 0, ret); \
} \
off = ret; \
} \
} \
} while (0)
2023-09-23 13:15:09 +08:00
/**
* @brief buf里面去
*
*/
#define RPC_SVR_MSG_TO_BUF_OUT(rpc_type, var_type, var, dir, buf, off) \
2023-09-22 21:56:15 +08:00
do \
{ \
if (rpc_type == RPC_TYPE_DATA) \
{ \
if (dir == RPC_DIR_OUT || dir == RPC_DIR_INOUT) \
{ \
int ret = rpc_svr_msg_to_buf_##var_type(var, (uint8_t *)(buf), off); \
if (ret < 0) \
{ \
return msg_tag_init4(0, 0, 0, ret); \
} \
off = ret; \
} \
} \
} while (0)
2023-09-23 13:15:09 +08:00
/**
* @brief buf里面取出数据
*
*/
#define RPC_SVR_BUF_TO_MSG_IN(rpc_type, var_type, var, dir, buf, off, max) \
2023-09-22 21:56:15 +08:00
do \
{ \
if (rpc_type == RPC_TYPE_DATA) \
{ \
if (dir == RPC_DIR_IN || dir == RPC_DIR_INOUT) \
{ \
int ret = rpc_svr_buf_to_msg_##var_type(var, (uint8_t *)(buf), off, max); \
if (ret < 0) \
{ \
return msg_tag_init4(0, 0, 0, ret); \
} \
off = ret; \
} \
} \
} while (0)
2023-09-23 13:15:09 +08:00
/**
* @brief
*
*/
#define PRC_SVR_FILL_MAP_BUF(rpc_type, var_type, var, dir, buf, off) \
2023-09-22 23:45:29 +08:00
do \
{ \
if (rpc_type == RPC_TYPE_BUF) \
{ \
2023-09-23 13:15:09 +08:00
if (dir == RPC_DIR_OUT || dir == RPC_DIR_INOUT) \
2023-09-22 23:45:29 +08:00
{ \
int ret = rpc_svr_msg_to_buf_##var_type(var, (uint8_t *)(buf), off); \
if (ret < 0) \
{ \
return msg_tag_init4(0, 0, 0, ret); \
} \
off = ret; \
} \
} \
} while (0)
2023-09-24 01:26:07 +08:00
#define RPC_DISPATCH1(struct_type, op_type, func0_op, func0_name) \
msg_tag_t rpc_##struct_type##_dispatch(struct_type *obj, msg_tag_t in_tag, ipc_msg_t *ipc_msg) \
{ \
msg_tag_t tag = msg_tag_init4(0, 0, 0, -EPROTO); \
size_t op_val; \
\
op_val = *((op_type *)(ipc_msg->msg_buf)); \
switch (op_val) \
{ \
case func0_op: \
{ \
tag = struct_type##_##func0_name##_dispatch(obj, in_tag, ipc_msg); \
} \
break; \
} \
return tag; \
2023-09-22 21:56:15 +08:00
}
2023-09-24 01:26:07 +08:00
#define RPC_DISPATCH2(struct_type, op_type, func0_op, func0_name, func1_op, func1_name) \
msg_tag_t rpc_##struct_type##_dispatch(struct_type *obj, msg_tag_t in_tag, ipc_msg_t *ipc_msg) \
{ \
msg_tag_t tag = msg_tag_init4(0, 0, 0, -EPROTO); \
size_t op_val; \
\
op_val = *((op_type *)(ipc_msg->msg_buf)); \
switch (op_val) \
{ \
case func0_op: \
{ \
tag = struct_type##_##func0_name##_dispatch(obj, in_tag, ipc_msg); \
} \
break; \
case func1_op: \
{ \
tag = struct_type##_##func1_name##_dispatch(obj, in_tag, ipc_msg); \
} \
break; \
} \
return tag; \
2023-09-22 00:14:27 +08:00
}
2023-09-23 13:15:09 +08:00
2023-09-24 01:26:07 +08:00
#define RPC_DISPATCH3(struct_type, op_type, func0_op, func0_name, func1_op, func1_name, func2_op, func2_name) \
msg_tag_t rpc_##struct_type##_dispatch(struct_type *obj, msg_tag_t in_tag, ipc_msg_t *ipc_msg) \
{ \
msg_tag_t tag = msg_tag_init4(0, 0, 0, -EPROTO); \
size_t op_val; \
\
op_val = *((op_type *)(ipc_msg->msg_buf)); \
switch (op_val) \
{ \
case func0_op: \
{ \
tag = struct_type##_##func0_name##_dispatch(obj, in_tag, ipc_msg); \
} \
break; \
case func1_op: \
{ \
tag = struct_type##_##func1_name##_dispatch(obj, in_tag, ipc_msg); \
} \
break; \
case func2_op: \
{ \
tag = struct_type##_##func2_name##_dispatch(obj, in_tag, ipc_msg); \
} \
break; \
} \
return tag; \
2023-09-23 13:15:09 +08:00
}
2023-09-24 01:26:07 +08:00
#include "u_rpc_1.h"
#include "u_rpc_2.h"
#include "u_rpc_3.h"