rpc基本可用(全静态实现)

This commit is contained in:
zhangzheng
2023-09-23 13:15:09 +08:00
parent 09a3934f4f
commit cdb4adb0ab
3 changed files with 553 additions and 326 deletions

4
.vscode/launch.json vendored
View File

@@ -10,8 +10,8 @@
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
// "miDebuggerPath": "/opt/homebrew/bin/arm-none-eabi-gdb",
"miDebuggerPath": "/home/zhangzheng/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-gdb",
"miDebuggerPath": "/opt/homebrew/bin/arm-none-eabi-gdb",
// "miDebuggerPath": "/home/zhangzheng/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-gdb",
"miDebuggerServerAddress": "127.0.0.1:3333",
"MIMode": "gdb",
"setupCommands": [

View File

@@ -1,4 +1,14 @@
#pragma once
/**
* @file u_rpc.h
* @author zhangzheng (1358745329@qq.com)
* @brief
* @version 0.1
* @date 2023-09-23
*
* @copyright Copyright (c) 2023
*
*/
#include "u_types.h"
#include "u_thread.h"
@@ -9,6 +19,9 @@
#include <stddef.h>
#include <sys/types.h>
extern msg_tag_t dispatch_test(msg_tag_t tag, ipc_msg_t *msg);
/*rpc变量定义宏*/
#define RPC_TYPE_DEF(type) \
typedef struct rpc_##type \
{ \
@@ -30,7 +43,7 @@ static inline void rpc_memcpy(void *dst, void *src, size_t size)
}
}
/*定义变量初始化宏*/
/*定义变量初始化宏函数*/
#define RPC_TYPE_INIT(data_type) \
static inline void rpc_var_##data_type##_init(data_type *d) \
{ \
@@ -40,13 +53,19 @@ static inline void rpc_memcpy(void *dst, void *src, size_t size)
tmp[i] = 0; \
} \
}
/*RPC的初始化函数定义*/
#define RPC_TYPE_INIT_WITHOUT_IMPL(data_type) \
static inline void rpc_var_##data_type##_init(data_type *d)
/*定义一个call函数*/
#define RPC_TYPE_INIT_FUNC_CALL(data_type, d) \
rpc_var_##data_type##_init(d)
/*end*/
/*普通数据定义*/
/**
* @brief 客户端消息填充到buf
*
*/
#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) \
{ \
@@ -60,7 +79,10 @@ static inline void rpc_memcpy(void *dst, void *src, size_t size)
}
#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)
/**
* @brief 服务端buf填充到消息
*
*/
#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) \
{ \
@@ -72,10 +94,17 @@ static inline void rpc_memcpy(void *dst, void *src, size_t size)
d->data = *((typeof(d->data) *)(buf + len)); \
return sizeof(d->data) + rpc_align(len, __alignof(d->data)); \
}
/**
* @brief 服务端buf填充到消息定义
*
*/
#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)
/**
* @brief 客户端buf填充到消息
*
*/
#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) \
{ \
@@ -87,9 +116,18 @@ static inline void rpc_memcpy(void *dst, void *src, size_t size)
d->data = *((typeof(d->data) *)(buf + len)); \
return sizeof(d->data) + rpc_align(len, __alignof(d->data)); \
}
/**
* @brief 客户端buf填充到消息定义
*
*/
#define RPC_CLI_BUF_TO_MSG_WITHOUT_IMPL(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)
/**
* @brief 服务端消息填充到buf
*
*/
#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) \
{ \
@@ -101,22 +139,45 @@ static inline void rpc_memcpy(void *dst, void *src, size_t size)
*((typeof(d->data) *)(buf + len)) = d->data; \
return sizeof(d->data) + rpc_align(len, __alignof(d->data)); \
}
/**
* @brief 服务端消息填充到buf定义
*
*/
#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)
/**
* @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; \
}
/*end*/
/**
* @brief 该宏用于定义一个普通的rpc类型
*
*/
#define RPC_TYPE_DEF_ALL(type) \
RPC_TYPE_DEF(type); \
RPC_CLI_MSG_TO_BUF(rpc_##type##_t, int) \
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) \
RPC_TYPE_INIT(rpc_##type##_t)
RPC_TYPE_INIT(rpc_##type##_t) \
RPC_CLI_TYPE_TRAN_TO_SVR_TYPE(rpc_##type##_t, rpc_##type##_t)
RPC_TYPE_DEF_ALL(int) //!< 定义所有的
//!< 数组定义
/**
* @brief 数组类型的rpc类型定义
*
*/
#define RPC_ARRAY_TYPE_DEF(len_type, data_type, length) \
typedef struct rpc_array_##len_type##_##data_type##_##length \
{ \
@@ -124,52 +185,110 @@ RPC_TYPE_DEF_ALL(int) //!< 定义所有的
data_type data[length]; \
} rpc_array_##len_type##_##data_type##_##length##_t
RPC_ARRAY_TYPE_DEF(uint32_t, uint8_t, 32);
RPC_CLI_MSG_TO_BUF_WITHOUT_IMPL(rpc_array_uint32_t_uint8_t_32_t, int)
{
if (rpc_align(d->len, __alignof(d->len) + sizeof(d->len)) > IPC_MSG_SIZE)
{
return -ETOLONG;
/**
* @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) \
{ \
}
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_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;
}
//!< end
/**
* @brief 定义一个32字节长度的数组
*
*/
RPC_ARRAY_DEF(uint32_t, uint8_t, 32)
//!< ref数组定义
/**
* @brief 引用类型的数组定义,数组的数据来自其它地方
*
*/
#define RPC_REF_ARRAY_TYPE_DEF(len_type, data_type, length) \
typedef struct rpc_ref_array_##len_type##_##data_type##_##length \
{ \
@@ -177,53 +296,71 @@ RPC_CLI_BUF_TO_MSG_WITHOUT_IMPL(rpc_array_uint32_t_uint8_t_32_t, int)
data_type *data; \
} rpc_ref_array_##len_type##_##data_type##_##length##_t
RPC_REF_ARRAY_TYPE_DEF(uint32_t, uint8_t, 32);
RPC_CLI_MSG_TO_BUF_WITHOUT_IMPL(rpc_ref_array_uint32_t_uint8_t_32_t, int)
{
if (rpc_align(d->len, __alignof(d->len) + sizeof(d->len)) >= IPC_MSG_SIZE)
{
return -ETOLONG;
/**
* @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; \
}
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;
}
//!< end
//!< 映射类型定义
/**
* @brief 定义一个32自己长度的引用数组
*
*/
RPC_REF_ARRAY_DEF(uint32_t, uint8_t, 32)
/**
* @brief Construct a new rpc type def object
*
*/
RPC_TYPE_DEF(obj_handler_t);
/**
* @brief Construct a new rpc cli msg to buf without impl object
*
*/
RPC_CLI_MSG_TO_BUF_WITHOUT_IMPL(rpc_obj_handler_t_t, int)
{
if (sizeof(d->data) + rpc_align(len, __alignof(d->data)) > IPC_MSG_SIZE)
@@ -234,10 +371,18 @@ RPC_CLI_MSG_TO_BUF_WITHOUT_IMPL(rpc_obj_handler_t_t, int)
*((umword_t *)(buf + len)) = vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, d->data).raw;
return sizeof(d->data) + rpc_align(len, __alignof(d->data));
}
/**
* @brief Construct a new rpc cli buf to msg without impl object
*
*/
RPC_CLI_BUF_TO_MSG_WITHOUT_IMPL(rpc_obj_handler_t_t, int)
{
return len;
}
/**
* @brief Construct a new rpc svr msg to buf without impl object
*
*/
RPC_SVR_MSG_TO_BUF_WITHOUT_IMPL(rpc_obj_handler_t_t, int)
{
if (sizeof(d->data) + rpc_align(len, __alignof(d->data)) > IPC_MSG_SIZE)
@@ -248,20 +393,34 @@ RPC_SVR_MSG_TO_BUF_WITHOUT_IMPL(rpc_obj_handler_t_t, int)
*((umword_t *)(buf + len)) = vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, d->data).raw;
return sizeof(d->data) + rpc_align(len, __alignof(d->data));
}
/**
* @brief Construct a new rpc svr buf to msg without impl object
*
*/
RPC_SVR_BUF_TO_MSG_WITHOUT_IMPL(rpc_obj_handler_t_t, int)
{
return len;
}
/**
* @brief Construct a new rpc type init without impl object
*
*/
RPC_TYPE_INIT_WITHOUT_IMPL(rpc_obj_handler_t_t)
{
}
//!< end
#define RPC_DIR_IN 1
#define RPC_DIR_OUT 2
#define RPC_DIR_INOUT 4
#define RPC_DIR_IN 1 //!< 输入类型
#define RPC_DIR_OUT 2 //!< 输出类型
#define RPC_DIR_INOUT 4 //!< 输入输出类型
#define RPC_TYPE_DATA 1
#define RPC_TYPE_BUF 2
#define RPC_TYPE_DATA 1 //!< 数据类型
#define RPC_TYPE_BUF 2 //!< 映射类型
/*客户端吧数据放到buf里面去*/
/**
* @brief 客户端吧数据放到buf里面去
*
*/
#define RPC_CLI_MSG_TO_BUF_IN(rpc_type, var_type, var, dir, buf, off) \
do \
{ \
@@ -297,7 +456,10 @@ RPC_SVR_BUF_TO_MSG_WITHOUT_IMPL(rpc_obj_handler_t_t, int)
} \
} while (0)
/*客户端往映射缓冲区里面填充数据*/
/**
* @brief 客户端往映射缓冲区里面填充数据
*
*/
#define PRC_CLI_FILL_MAP_BUF(rpc_type, var_type, var, dir, buf, off) \
do \
{ \
@@ -315,8 +477,11 @@ RPC_SVR_BUF_TO_MSG_WITHOUT_IMPL(rpc_obj_handler_t_t, int)
} \
} while (0)
/*服务端吧数据放到buf里面去*/
#define RPC_SVR_MSG_TO_BUF_IN(rpc_type, var_type, var, dir, buf, off) \
/**
* @brief 服务端吧数据放到buf里面去
*
*/
#define RPC_SVR_MSG_TO_BUF_OUT(rpc_type, var_type, var, dir, buf, off) \
do \
{ \
if (rpc_type == RPC_TYPE_DATA) \
@@ -333,8 +498,11 @@ RPC_SVR_BUF_TO_MSG_WITHOUT_IMPL(rpc_obj_handler_t_t, int)
} \
} while (0)
/*服务端从buf里面取出数据*/
#define RPC_SVR_BUF_TO_MSG_OUT(rpc_type, var_type, var, dir, buf, off, max) \
/**
* @brief 服务端从buf里面取出数据
*
*/
#define RPC_SVR_BUF_TO_MSG_IN(rpc_type, var_type, var, dir, buf, off, max) \
do \
{ \
if (rpc_type == RPC_TYPE_DATA) \
@@ -350,7 +518,10 @@ RPC_SVR_BUF_TO_MSG_WITHOUT_IMPL(rpc_obj_handler_t_t, int)
} \
} \
} while (0)
/**
* @brief 填充映射数据
*
*/
#define PRC_SVR_FILL_MAP_BUF(rpc_type, var_type, var, dir, buf, off) \
do \
{ \
@@ -367,9 +538,12 @@ RPC_SVR_BUF_TO_MSG_WITHOUT_IMPL(rpc_obj_handler_t_t, int)
} \
} \
} while (0)
#define RPC_GENERATION_CALL1(struct_type, op, func_name, type0, dir0, rpc_type0, name0) \
msg_tag_t struct_type##_##func_name##_call(obj_handler_t hd, type0 *var0) \
/**
* @brief 该宏用于生成一个客户端的调用函数(传递一个参数)
*
*/
#define RPC_GENERATION_CALL1(struct_type, op, func_name, cli_type0, svr_type0, dir0, rpc_type0, name0) \
msg_tag_t struct_type##_##func_name##_call(obj_handler_t hd, cli_type0 *var0) \
{ \
void *buf; \
ipc_msg_t *msg_ipc; \
@@ -378,14 +552,16 @@ RPC_SVR_BUF_TO_MSG_WITHOUT_IMPL(rpc_obj_handler_t_t, int)
msg_ipc = (ipc_msg_t *)buf; \
\
int off = 0; \
int off_map = 0; \
int ret = -1; \
int op_val = op; \
/*拷贝op*/ \
rpc_memcpy(msg_ipc->msg_buf, &op_val, sizeof(op_val)); \
off += rpc_align(sizeof(op_val), __alignof(op)); \
\
RPC_CLI_MSG_TO_BUF_IN(rpc_type0, type0, var0, dir0, (uint8_t *)msg_ipc->msg_buf, off); \
PRC_CLI_FILL_MAP_BUF(rpc_type0, type0, var0, dir0, (uint8_t *)msg_ipc->msg_buf, off); \
RPC_CLI_MSG_TO_BUF_IN(rpc_type0, cli_type0, var0, dir0, (uint8_t *)msg_ipc->msg_buf, off); \
PRC_CLI_FILL_MAP_BUF(rpc_type0, cli_type0, var0, dir0, (uint8_t *)msg_ipc->map_buf, off_map); \
/*msg_tag_t tag = dispatch_test(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_map, WORD_BYTES), 0), msg_ipc);*/ \
msg_tag_t tag = ipc_call(hd, msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), 0, 0), \
ipc_timeout_create2(0, 0)); \
\
@@ -394,26 +570,30 @@ RPC_SVR_BUF_TO_MSG_WITHOUT_IMPL(rpc_obj_handler_t_t, int)
return tag; \
} /*拷贝返回的数据*/ \
off = 0; \
RPC_CLI_BUF_TO_MSG_OUT(rpc_type0, type0, var0, dir0, (uint8_t *)msg_ipc->msg_buf, off, tag.msg_buf_len *WORD_BYTES); \
RPC_CLI_BUF_TO_MSG_OUT(rpc_type0, cli_type0, var0, dir0, (uint8_t *)msg_ipc->msg_buf, off, tag.msg_buf_len *WORD_BYTES); \
return tag; \
}
/**
* @brief 该宏用于生成服务端的分发函数(一个参数)
*
*/
#define RPC_GENERATION_DISPATCH1(struct_type, op, func_name, \
type0, dir0, rpc_type0, name0) \
cli_type0, svr_type0, dir0, rpc_type0, name0) \
msg_tag_t struct_type##_##func_name##_dispatch(struct_type *obj, msg_tag_t tag, ipc_msg_t *ipc_msg) \
{ \
type0 var0; \
svr_type0 var0; \
size_t op_val; \
uint8_t *value = (uint8_t *)(ipc_msg->msg_buf); \
int off = 0; \
\
RPC_TYPE_INIT_FUNC_CALL(type0, &var0); \
RPC_TYPE_INIT_FUNC_CALL(svr_type0, &var0); \
\
/*取得op*/ \
op_val = *((typeof(op) *)value); \
off += sizeof(typeof(op)); \
off = rpc_align(off, __alignof(typeof(op))); \
\
RPC_SVR_BUF_TO_MSG_OUT(rpc_type0, type0, &var0, dir0, value, off, tag.msg_buf_len *WORD_BYTES); \
RPC_SVR_BUF_TO_MSG_IN(rpc_type0, svr_type0, &var0, dir0, value, off, tag.msg_buf_len *WORD_BYTES); \
\
short ret_val = struct_type##_##func_name##_op(obj, &var0); \
\
@@ -422,17 +602,22 @@ RPC_SVR_BUF_TO_MSG_WITHOUT_IMPL(rpc_obj_handler_t_t, int)
return msg_tag_init4(0, 0, 0, ret_val); \
} \
off = 0; \
RPC_SVR_MSG_TO_BUF_IN(rpc_type0, type0, &var0, dir0, value, off); \
return msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), 0, ret_val); \
int off_map = 0; \
RPC_SVR_MSG_TO_BUF_OUT(rpc_type0, svr_type0, &var0, dir0, value, off); \
PRC_SVR_FILL_MAP_BUF(rpc_type0, svr_type0, &var0, dir0, value, off_map); \
return msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_map, WORD_BYTES), ret_val); \
}
#define RPC_GENERATION_OP1(struct_type, op, func_name, type0, dir0, rpc_type0, name0) \
short struct_type##_##func_name##_op(struct_type *obj, type0 *name0)
/**
* @brief 该宏用于生成一个服务端的实现(一个参数)
*
*/
#define RPC_GENERATION_OP1(struct_type, op, func_name, cli_type0, svr_type0, dir0, rpc_type0, name0) \
short struct_type##_##func_name##_op(struct_type *obj, svr_type0 *name0)
#define RPC_GENERATION_CALL2(struct_type, op, func_name, \
type0, dir0, rpc_type0, name0, \
type1, dir1, rpc_type1, name1) \
msg_tag_t struct_type##_##func_name##_call(obj_handler_t hd, type0 *var0, type1 *var1) \
cli_type0, svr_type0, dir0, rpc_type0, name0, \
cli_type1, svr_type1, dir1, rpc_type1, name1) \
msg_tag_t struct_type##_##func_name##_call(obj_handler_t hd, cli_type0 *var0, cli_type1 *var1) \
{ \
void *buf; \
ipc_msg_t *msg_ipc; \
@@ -448,10 +633,11 @@ RPC_SVR_BUF_TO_MSG_WITHOUT_IMPL(rpc_obj_handler_t_t, int)
rpc_memcpy(msg_ipc->msg_buf, &op_val, sizeof(op_val)); \
off += rpc_align(sizeof(op_val), __alignof(op)); \
\
RPC_CLI_MSG_TO_BUF_IN(rpc_type0, type0, var0, dir0, (uint8_t *)msg_ipc->msg_buf, off); \
PRC_CLI_FILL_MAP_BUF(rpc_type0, type0, var0, dir0, (uint8_t *)msg_ipc->msg_buf, off_buf); \
RPC_CLI_MSG_TO_BUF_IN(rpc_type1, type1, var1, dir1, (uint8_t *)msg_ipc->msg_buf, off); \
PRC_CLI_FILL_MAP_BUF(rpc_type1, type1, var1, dir1, (uint8_t *)msg_ipc->msg_buf, off_buf); \
RPC_CLI_MSG_TO_BUF_IN(rpc_type0, cli_type0, var0, dir0, (uint8_t *)msg_ipc->msg_buf, off); \
PRC_CLI_FILL_MAP_BUF(rpc_type0, cli_type0, var0, dir0, (uint8_t *)msg_ipc->map_buf, off_buf); \
RPC_CLI_MSG_TO_BUF_IN(rpc_type1, cli_type1, var1, dir1, (uint8_t *)msg_ipc->msg_buf, off); \
PRC_CLI_FILL_MAP_BUF(rpc_type1, cli_type1, var1, dir1, (uint8_t *)msg_ipc->map_buf, off_buf); \
/*msg_tag_t tag = dispatch_test(msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_buf, WORD_BYTES), 0), msg_ipc); */ \
msg_tag_t tag = ipc_call(hd, msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), 0, 0), \
ipc_timeout_create2(0, 0)); \
\
@@ -460,7 +646,49 @@ RPC_SVR_BUF_TO_MSG_WITHOUT_IMPL(rpc_obj_handler_t_t, int)
return tag; \
} /*拷贝返回的数据*/ \
off = 0; \
RPC_CLI_BUF_TO_MSG_OUT(rpc_type0, type0, var0, dir0, (uint8_t *)msg_ipc->msg_buf, off, tag.msg_buf_len *WORD_BYTES); \
RPC_CLI_BUF_TO_MSG_OUT(rpc_type1, type1, var1, dir1, (uint8_t *)msg_ipc->msg_buf, off, tag.msg_buf_len *WORD_BYTES); \
RPC_CLI_BUF_TO_MSG_OUT(rpc_type0, cli_type0, var0, dir0, (uint8_t *)msg_ipc->msg_buf, off, tag.msg_buf_len *WORD_BYTES); \
RPC_CLI_BUF_TO_MSG_OUT(rpc_type1, cli_type1, var1, dir1, (uint8_t *)msg_ipc->msg_buf, off, tag.msg_buf_len *WORD_BYTES); \
return tag; \
}
#define RPC_GENERATION_DISPATCH2(struct_type, op, func_name, \
cli_type0, svr_type0, dir0, rpc_type0, name0, \
cli_type1, svr_type1, dir1, rpc_type1, name1) \
msg_tag_t struct_type##_##func_name##_dispatch(struct_type *obj, msg_tag_t tag, ipc_msg_t *ipc_msg) \
{ \
svr_type0 var0; \
svr_type1 var1; \
size_t op_val; \
uint8_t *value = (uint8_t *)(ipc_msg->msg_buf); \
int off = 0; \
\
RPC_TYPE_INIT_FUNC_CALL(svr_type0, &var0); \
RPC_TYPE_INIT_FUNC_CALL(svr_type1, &var1); \
\
/*取得op*/ \
op_val = *((typeof(op) *)value); \
off += sizeof(typeof(op)); \
off = rpc_align(off, __alignof(typeof(op))); \
\
RPC_SVR_BUF_TO_MSG_IN(rpc_type0, svr_type0, &var0, dir0, value, off, tag.msg_buf_len *WORD_BYTES); \
RPC_SVR_BUF_TO_MSG_IN(rpc_type1, svr_type1, &var1, dir1, value, off, tag.msg_buf_len *WORD_BYTES); \
\
short ret_val = struct_type##_##func_name##_op(obj, &var0, &var1); \
\
if (ret_val < 0) \
{ \
return msg_tag_init4(0, 0, 0, ret_val); \
} \
off = 0; \
int off_map = 0; \
RPC_SVR_MSG_TO_BUF_OUT(rpc_type0, svr_type0, &var0, dir0, value, off); \
RPC_SVR_MSG_TO_BUF_OUT(rpc_type1, svr_type1, &var1, dir1, value, off); \
PRC_SVR_FILL_MAP_BUF(rpc_type0, svr_type0, &var0, dir0, ipc_msg->map_buf, off_map); \
PRC_SVR_FILL_MAP_BUF(rpc_type1, svr_type1, &var1, dir1, ipc_msg->map_buf, off_map); \
return msg_tag_init4(0, ROUND_UP(off, WORD_BYTES), ROUND_UP(off_map, WORD_BYTES), ret_val); \
}
#define RPC_GENERATION_OP2(struct_type, op, func_name, \
cli_type0, svr_type0, dir0, rpc_type0, name0, \
cli_type1, svr_type1, dir1, rpc_type1, name1) \
short struct_type##_##func_name##_op(struct_type *obj, svr_type0 *name0, svr_type1 *name1)

View File

@@ -9,140 +9,139 @@ typedef struct test_svr
static test_svr_t test;
RPC_GENERATION_OP1(test_svr_t, 0, register, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, var0)
#if 0
RPC_GENERATION_OP1(test_svr_t, 0, register, rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0)
{
printf("var0 val is %d\n", var0->data);
var0->data = 0x112233;
return 1;
}
// RPC_GENERATION_DISPATCH1(test_svr_t, 0, register, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, var0)
msg_tag_t test_svr_t_register_dispatch(test_svr_t *obj, msg_tag_t tag, ipc_msg_t *ipc_msg)
RPC_GENERATION_DISPATCH1(test_svr_t, 0, register, rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0)
RPC_GENERATION_CALL1(test_svr_t, 0, register, rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0)
#endif
#if 0
RPC_GENERATION_OP2(test_svr_t, 0, query,
rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0,
rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var1)
{
rpc_int_t var0;
size_t op_val;
uint8_t *value = (uint8_t *)(ipc_msg->msg_buf);
int off = 0;
rpc_var_rpc_int_t_init(&var0);
op_val = *((typeof(0) *)value);
off += sizeof(typeof(0));
off = rpc_align(off, __alignof(typeof(0)));
do
{
if (1 == 1)
{
if (1 == 1 || 1 == 4)
{
int ret = rpc_svr_buf_to_msg_rpc_int_t(&var0, (uint8_t *)(value), off, tag.msg_buf_len * (sizeof(void *)));
if (ret < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)});
}
off = ret;
}
}
} while (0);
short ret_val = test_svr_t_register_op(obj, &var0);
if (ret_val < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret_val)});
}
off = 0;
do
{
if (1 == 1)
{
if (1 == 2 || 1 == 4)
{
int ret = rpc_svr_msg_to_buf_rpc_int_t(&var0, (uint8_t *)(value), off);
if (ret < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)});
}
off = ret;
}
}
} while (0);
return ((msg_tag_t){.flags = (0), .msg_buf_len = ((((off) / ((sizeof(void *)))) + (((off) % ((sizeof(void *)))) ? 1 : 0))), .map_buf_len = (0), .prot = (ret_val)});
printf("var0 val is %d\n", var0->data);
printf("var1 val is %d\n", var1->data);
var0->data = 0x112233;
var1->data = 0x123456;
return 2;
}
// RPC_GENERATION_CALL1(test_svr_t, 0, register, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, var0)
msg_tag_t test_svr_t_register_call(obj_handler_t hd, rpc_int_t *var0)
RPC_GENERATION_DISPATCH2(test_svr_t, 0, query,
rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0,
rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var1)
RPC_GENERATION_CALL2(test_svr_t, 0, query,
rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0,
rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var1)
msg_tag_t dispatch_test(msg_tag_t tag, ipc_msg_t *msg)
{
void *buf;
ipc_msg_t *msg_ipc;
thread_msg_buf_get(2, (umword_t *)(&buf), ((void *)0));
msg_ipc = (ipc_msg_t *)buf;
int off = 0;
int ret = -1;
int op_val = 0;
rpc_memcpy(msg_ipc->msg_buf, &op_val, sizeof(op_val));
off += rpc_align(sizeof(op_val), __alignof(0));
do
{
if (1 == 1)
{
if (1 == 1 || 1 == 4)
{
int ret = rpc_cli_msg_to_buf_rpc_int_t(var0, (uint8_t *)((uint8_t *)msg_ipc->msg_buf), off);
if (ret < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)});
}
off = ret;
}
}
} while (0);
do
{
if (1 == 2)
{
if (1 == 1 || 1 == 4)
{
int ret = rpc_cli_msg_to_buf_rpc_int_t(var0, (uint8_t *)((uint8_t *)msg_ipc->msg_buf), off);
if (ret < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)});
}
off = ret;
}
}
} while (0);
// msg_tag_t tag = ipc_call(hd, ((msg_tag_t){.flags = (0), .msg_buf_len = ((((off) / ((sizeof(void *)))) + (((off) % ((sizeof(void *)))) ? 1 : 0))), .map_buf_len = (0), .prot = (0)}), ipc_timeout_create2(0, 0));
msg_tag_t tag = test_svr_t_register_dispatch(&test, ((msg_tag_t){.flags = (0), .msg_buf_len = ((((off) / ((sizeof(void *)))) + (((off) % ((sizeof(void *)))) ? 1 : 0))), .map_buf_len = (0), .prot = (0)}), msg_ipc);
if (((int16_t)((tag).prot)) < 0)
{
return tag;
}
off = 0;
do
{
if (1 == 1)
{
if (1 == 2 || 1 == 4)
{
int ret = rpc_cli_buf_to_msg_rpc_int_t(var0, (uint8_t *)((uint8_t *)msg_ipc->msg_buf), off, tag.msg_buf_len * (sizeof(void *)));
if (ret < 0)
{
return ((msg_tag_t){.flags = (0), .msg_buf_len = (0), .map_buf_len = (0), .prot = (ret)});
}
off = ret;
}
}
} while (0);
return tag;
tag = test_svr_t_query_dispatch(&test, tag, msg);
}
// msg_tag_t tag = test_svr_t_register_dispatch(&test, ((msg_tag_t){.flags = (0), .msg_buf_len = ((((off) / ((sizeof(void *)))) + (((off) % ((sizeof(void *)))) ? 1 : 0))), .map_buf_len = (0), .prot = (0)}), msg_ipc);
#endif
// RPC_GENERATION_CALL2(test_svr_t, 1, query,
// rpc_ref_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, var0, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, var1)
#if 0
RPC_GENERATION_OP2(test_svr_t, 0, query,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var1)
{
printf("var0 val is %s\n", var0->data);
printf("var1 val is %s\n", var1->data);
strcpy(var0->data, "....");
var0->len = 5;
strcpy(var1->data, "____");
var1->len = 5;
return 2;
}
RPC_GENERATION_DISPATCH2(test_svr_t, 0, query,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var1)
RPC_GENERATION_CALL2(test_svr_t, 0, query,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var1)
msg_tag_t dispatch_test(msg_tag_t tag, ipc_msg_t *msg)
{
tag = test_svr_t_query_dispatch(&test, tag, msg);
}
#endif
#if 0
RPC_GENERATION_OP2(test_svr_t, 0, query,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1)
{
printf("var0 val is %s\n", var0->data);
strcpy(var0->data, "....");
var0->len = 5;
return 2;
}
RPC_GENERATION_DISPATCH2(test_svr_t, 0, query,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1)
RPC_GENERATION_CALL2(test_svr_t, 0, query,
rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1)
msg_tag_t dispatch_test(msg_tag_t tag, ipc_msg_t *msg)
{
tag = test_svr_t_query_dispatch(&test, tag, msg);
}
#endif
RPC_GENERATION_OP2(test_svr_t, 0, query,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_OUT, RPC_TYPE_BUF, var0,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1)
{
printf("dispath ok.\n");
var0->data = vpage_create_raw3(0, 0, 30).raw;
return 2;
}
RPC_GENERATION_DISPATCH2(test_svr_t, 0, query,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_OUT, RPC_TYPE_BUF, var0,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1)
RPC_GENERATION_CALL2(test_svr_t, 0, query,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_OUT, RPC_TYPE_BUF, var0,
rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1)
msg_tag_t dispatch_test(msg_tag_t tag, ipc_msg_t *msg)
{
tag = test_svr_t_query_dispatch(&test, tag, msg);
}
void rpc_test(void)
{
rpc_int_t var0 = {.data = 1};
msg_tag_t tag = test_svr_t_register_call(15, &var0);
rpc_ref_array_uint32_t_uint8_t_32_t str_tst = {
.data = "test",
.len = strlen("test") + 1};
// test_svr_t_query_call(15, &str_tst, &var0);
msg_tag_t tag;
#if 0
rpc_int_t var0 = {.data = 456};
tag = test_svr_t_register_call(15, &var0);
printf("ret:%d, val is 0x%x\n", msg_tag_get_val(tag), var0.data);
#endif
#if 0
rpc_int_t var1 = {.data = 123};
tag = test_svr_t_query_call(15, &var0, &var1);
printf("ret:%d, val is 0x%x, val is 0x%x\n", msg_tag_get_val(tag), var0.data, var1.data);
#endif
#if 0
uint8_t data_cache[10] = "test";
uint8_t data_cache1[10] = "tttt";
rpc_ref_array_uint32_t_uint8_t_32_t var0 = {
.data = data_cache,
.len = strlen(data_cache) + 1};
rpc_ref_array_uint32_t_uint8_t_32_t var1 = {
.data = data_cache1,
.len = strlen(data_cache1) + 1};
tag = test_svr_t_query_call(15, &var0, &var1);
printf("ret:%d, val is %s, val is %s.\n", msg_tag_get_val(tag), var0.data, var1.data);
#endif
rpc_obj_handler_t_t var0 = {.data = 0};
rpc_obj_handler_t_t var1 = {.data = 12};
tag = test_svr_t_query_call(15, &var0, &var1);
printf("ret:%d\n", msg_tag_get_val(tag));
}