Support XiZi_AIoT
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
toolchain ?= arm-none-eabi-
|
||||
cc = ${toolchain}gcc
|
||||
ld = ${toolchain}g++
|
||||
objdump = ${toolchain}objdump
|
||||
user_ldflags = -N -Ttext 0
|
||||
|
||||
cflags = -std=c11 -march=armv7-a -mtune=cortex-a9 -nostdlib -nodefaultlibs -mfloat-abi=soft -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -ggdb -Wno-unused -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pie -no-pie
|
||||
c_useropts = -O0
|
||||
|
||||
INC_DIR = -I$(KERNEL_ROOT)/services/shell/letter-shell -I$(KERNEL_ROOT)/services/lib/ipc -I$(KERNEL_ROOT)/services/boards/imx6q-sabrelite
|
||||
|
||||
all: libipc.o session.o
|
||||
@mv $^ ../../boards/imx6q-sabrelite
|
||||
|
||||
%.o: %.c
|
||||
@echo "cc $^"
|
||||
@${cc} ${cflags} ${c_useropts} ${INC_DIR} -o $@ -c $^
|
||||
@@ -0,0 +1,541 @@
|
||||
/*
|
||||
* Copyright (c) 2020 AIIT XUOS Lab
|
||||
* XiUOS is licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
*/
|
||||
/**
|
||||
* @file ipcargs.c
|
||||
* @brief macros to supprt libipc
|
||||
* @version 3.0
|
||||
* @author AIIT XUOS Lab
|
||||
* @date 2023.08.25
|
||||
*/
|
||||
|
||||
/*************************************************
|
||||
File name: ipcargs.c
|
||||
Description: macros to supprt libipc
|
||||
Others:
|
||||
History:
|
||||
1. Date: 2023-08-28
|
||||
Author: AIIT XUOS Lab
|
||||
Modification:
|
||||
1. first version
|
||||
*************************************************/
|
||||
#pragma once
|
||||
|
||||
#define ARG(x) (x)
|
||||
#define DEAULT_VA_NUM 12
|
||||
#define _VA_NUM(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, N, M, ...) ((N == M + 1) ? ((N == 1) ? ((#x0)[0] != 0) : N) : DEAULT_VA_NUM)
|
||||
#define VA_NUM(...) ARG(_VA_NUM(__VA_ARGS__, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1))
|
||||
|
||||
#define _VA_ARG0(x0, ...) (x0)
|
||||
#define _VA_ARG1(x0, x1, ...) (x1)
|
||||
#define _VA_ARG2(x0, x1, x2, ...) (x2)
|
||||
#define _VA_ARG3(x0, x1, x2, x3, ...) (x3)
|
||||
#define _VA_ARG4(x0, x1, x2, x3, x4, ...) (x4)
|
||||
#define _VA_ARG5(x0, x1, x2, x3, x4, x5, ...) (x5)
|
||||
#define _VA_ARG6(x0, x1, x2, x3, x4, x5, x6, ...) (x6)
|
||||
#define _VA_ARG7(x0, x1, x2, x3, x4, x5, x6, x7, ...) (x7)
|
||||
#define _VA_ARG8(x0, x1, x2, x3, x4, x5, x6, x7, x8, ...) (x8)
|
||||
#define _VA_ARG9(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, ...) (x9)
|
||||
#define _VA_ARG10(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, ...) (x10)
|
||||
#define _VA_ARG11(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, ...) (x11)
|
||||
|
||||
#define _VA_ARG0_WO(x0, ...) x0
|
||||
#define _VA_ARG1_WO(x0, x1, ...) x1
|
||||
#define _VA_ARG2_WO(x0, x1, x2, ...) x2
|
||||
#define _VA_ARG3_WO(x0, x1, x2, x3, ...) x3
|
||||
#define _VA_ARG4_WO(x0, x1, x2, x3, x4, ...) x4
|
||||
#define _VA_ARG5_WO(x0, x1, x2, x3, x4, x5, ...) x5
|
||||
#define _VA_ARG6_WO(x0, x1, x2, x3, x4, x5, x6, ...) x6
|
||||
#define _VA_ARG7_WO(x0, x1, x2, x3, x4, x5, x6, x7, ...) x7
|
||||
#define _VA_ARG8_WO(x0, x1, x2, x3, x4, x5, x6, x7, x8, ...) x8
|
||||
#define _VA_ARG9_WO(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, ...) x9
|
||||
#define _VA_ARG10_WO(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, ...) x10
|
||||
#define _VA_ARG11_WO(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, ...) x11
|
||||
|
||||
#define _VA_FRONT_ARG1(...) _VA_ARG0_WO(__VA_ARGS__)
|
||||
#define _VA_FRONT_ARG2(...) _VA_ARG0_WO(__VA_ARGS__), _VA_ARG1_WO(__VA_ARGS__)
|
||||
#define _VA_FRONT_ARG3(...) _VA_ARG0_WO(__VA_ARGS__), _VA_ARG1_WO(__VA_ARGS__), _VA_ARG2_WO(__VA_ARGS__)
|
||||
#define _VA_FRONT_ARG4(...) _VA_ARG0_WO(__VA_ARGS__), _VA_ARG1_WO(__VA_ARGS__), _VA_ARG2_WO(__VA_ARGS__), _VA_ARG3_WO(__VA_ARGS__)
|
||||
#define _VA_FRONT_ARG5(...) _VA_ARG0_WO(__VA_ARGS__), _VA_ARG1_WO(__VA_ARGS__), _VA_ARG2_WO(__VA_ARGS__), _VA_ARG3_WO(__VA_ARGS__), _VA_ARG4_WO(__VA_ARGS__)
|
||||
#define _VA_FRONT_ARG6(...) _VA_ARG0_WO(__VA_ARGS__), _VA_ARG1_WO(__VA_ARGS__), _VA_ARG2_WO(__VA_ARGS__), _VA_ARG3_WO(__VA_ARGS__), _VA_ARG4_WO(__VA_ARGS__), _VA_ARG5_WO(__VA_ARGS__)
|
||||
#define _VA_FRONT_ARG7(...) _VA_ARG0_WO(__VA_ARGS__), _VA_ARG1_WO(__VA_ARGS__), _VA_ARG2_WO(__VA_ARGS__), _VA_ARG3_WO(__VA_ARGS__), _VA_ARG4_WO(__VA_ARGS__), _VA_ARG5_WO(__VA_ARGS__), _VA_ARG6_WO(__VA_ARGS__)
|
||||
#define _VA_FRONT_ARG8(...) _VA_ARG0_WO(__VA_ARGS__), _VA_ARG1_WO(__VA_ARGS__), _VA_ARG2_WO(__VA_ARGS__), _VA_ARG3_WO(__VA_ARGS__), _VA_ARG4_WO(__VA_ARGS__), _VA_ARG5_WO(__VA_ARGS__), _VA_ARG6_WO(__VA_ARGS__), _VA_ARG7_WO(__VA_ARGS__)
|
||||
#define _VA_FRONT_ARG9(...) _VA_ARG0_WO(__VA_ARGS__), _VA_ARG1_WO(__VA_ARGS__), _VA_ARG2_WO(__VA_ARGS__), _VA_ARG3_WO(__VA_ARGS__), _VA_ARG4_WO(__VA_ARGS__), _VA_ARG5_WO(__VA_ARGS__), _VA_ARG6_WO(__VA_ARGS__), _VA_ARG7_WO(__VA_ARGS__), _VA_ARG8_WO(__VA_ARGS__)
|
||||
#define _VA_FRONT_ARG10(...) _VA_ARG0_WO(__VA_ARGS__), _VA_ARG1_WO(__VA_ARGS__), _VA_ARG2_WO(__VA_ARGS__), _VA_ARG3_WO(__VA_ARGS__), _VA_ARG4_WO(__VA_ARGS__), _VA_ARG5_WO(__VA_ARGS__), _VA_ARG6_WO(__VA_ARGS__), _VA_ARG7_WO(__VA_ARGS__), _VA_ARG8_WO(__VA_ARGS__), _VA_ARG9_WO(__VA_ARGS__)
|
||||
#define _VA_FRONT_ARG11(...) _VA_ARG0_WO(__VA_ARGS__), _VA_ARG1_WO(__VA_ARGS__), _VA_ARG2_WO(__VA_ARGS__), _VA_ARG3_WO(__VA_ARGS__), _VA_ARG4_WO(__VA_ARGS__), _VA_ARG5_WO(__VA_ARGS__), _VA_ARG6_WO(__VA_ARGS__), _VA_ARG7_WO(__VA_ARGS__), _VA_ARG8_WO(__VA_ARGS__), _VA_ARG9_WO(__VA_ARGS__), _VA_ARG10_WO(__VA_ARGS__)
|
||||
|
||||
#define _VA_ARG0_PTR(x0, ...) void* x0
|
||||
#define _VA_ARG1_PTR(x0, x1, ...) void* x1
|
||||
#define _VA_ARG2_PTR(x0, x1, x2, ...) void* x2
|
||||
#define _VA_ARG3_PTR(x0, x1, x2, x3, ...) void* x3
|
||||
#define _VA_ARG4_PTR(x0, x1, x2, x3, x4, ...) void* x4
|
||||
#define _VA_ARG5_PTR(x0, x1, x2, x3, x4, x5, ...) void* x5
|
||||
#define _VA_ARG6_PTR(x0, x1, x2, x3, x4, x5, x6, ...) void* x6
|
||||
#define _VA_ARG7_PTR(x0, x1, x2, x3, x4, x5, x6, x7, ...) void* x7
|
||||
#define _VA_ARG8_PTR(x0, x1, x2, x3, x4, x5, x6, x7, x8, ...) void* x8
|
||||
#define _VA_ARG9_PTR(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, ...) void* x9
|
||||
#define _VA_ARG10_PTR(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, ...) void* x10
|
||||
#define _VA_ARG11_PTR(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, ...) void* x11
|
||||
|
||||
#define _VA_FRONT_PTR_ARG1(...) _VA_ARG0_PTR(__VA_ARGS__)
|
||||
#define _VA_FRONT_PTR_ARG2(...) _VA_FRONT_PTR_ARG1(__VA_ARGS__), _VA_ARG1_PTR(__VA_ARGS__)
|
||||
#define _VA_FRONT_PTR_ARG3(...) _VA_FRONT_PTR_ARG2(__VA_ARGS__), _VA_ARG2_PTR(__VA_ARGS__)
|
||||
#define _VA_FRONT_PTR_ARG4(...) _VA_FRONT_PTR_ARG3(__VA_ARGS__), _VA_ARG3_PTR(__VA_ARGS__)
|
||||
#define _VA_FRONT_PTR_ARG5(...) _VA_FRONT_PTR_ARG4(__VA_ARGS__), _VA_ARG4_PTR(__VA_ARGS__)
|
||||
#define _VA_FRONT_PTR_ARG6(...) _VA_FRONT_PTR_ARG5(__VA_ARGS__), _VA_ARG5_PTR(__VA_ARGS__)
|
||||
#define _VA_FRONT_PTR_ARG7(...) _VA_FRONT_PTR_ARG6(__VA_ARGS__), _VA_ARG6_PTR(__VA_ARGS__)
|
||||
#define _VA_FRONT_PTR_ARG8(...) _VA_FRONT_PTR_ARG7(__VA_ARGS__), _VA_ARG7_PTR(__VA_ARGS__)
|
||||
#define _VA_FRONT_PTR_ARG9(...) _VA_FRONT_PTR_ARG8(__VA_ARGS__), _VA_ARG8_PTR(__VA_ARGS__)
|
||||
#define _VA_FRONT_PTR_ARG10(...) _VA_FRONT_PTR_ARG9(__VA_ARGS__), _VA_ARG9_PTR(__VA_ARGS__)
|
||||
#define _VA_FRONT_PTR_ARG11(...) _VA_FRONT_PTR_ARG10(__VA_ARGS__), _VA_ARG10_PTR(__VA_ARGS__)
|
||||
#define _VA_FRONT_PTR_ARG12(...) _VA_FRONT_PTR_ARG11(__VA_ARGS__), _VA_ARG11_PTR(__VA_ARGS__)
|
||||
|
||||
#define _VA_ARGS_SECOND(x1, ...) __VA_ARGS__
|
||||
#define _VA_WRAP_INNER(wrap, x, ...) wrap x
|
||||
#define _VA_FRONT_WRAP_ARG1(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG2(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG1(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG3(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG2(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG4(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG3(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG5(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG4(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG6(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG5(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG7(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG6(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG8(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG7(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG9(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG8(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG10(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG9(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG11(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG10(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG12(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG11(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG13(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG12(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG14(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG13(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG15(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG14(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG16(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG15(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG17(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG16(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG18(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG17(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG19(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG18(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG20(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG19(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG21(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG20(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG22(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG21(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG23(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG22(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG24(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG23(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG25(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG24(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG26(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG25(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG27(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG26(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG28(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG27(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG29(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG28(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG30(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG29(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG31(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG30(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG32(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG31(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG33(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG32(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG34(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG33(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG35(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG34(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG36(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG35(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG37(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG36(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG38(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG37(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG39(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG38(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG40(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG39(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG41(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG40(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG42(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG41(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG43(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG42(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG44(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG43(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG45(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG44(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG46(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG45(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG47(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG46(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG48(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG47(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG49(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG48(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG50(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG49(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG51(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG50(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG52(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG51(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG53(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG52(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG54(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG53(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG55(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG54(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG56(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG55(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG57(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG56(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG58(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG57(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG59(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG58(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG60(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG59(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG61(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG60(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG62(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG61(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG63(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG62(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG64(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG63(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG65(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG64(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG66(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG65(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG67(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG66(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG68(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG67(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG69(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG68(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG70(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG69(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG71(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG70(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG72(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG71(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG73(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG72(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG74(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG73(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG75(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG74(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG76(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG75(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG77(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG76(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG78(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG77(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG79(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG78(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG80(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG79(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG81(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG80(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG82(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG81(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG83(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG82(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG84(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG83(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG85(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG84(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG86(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG85(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG87(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG86(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG88(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG87(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG89(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG88(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG90(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG89(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG91(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG90(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG92(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG91(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG93(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG92(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG94(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG93(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG95(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG94(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG96(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG95(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG97(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG96(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG98(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG97(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG99(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG98(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG100(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG99(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG101(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG100(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG102(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG101(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG103(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG102(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG104(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG103(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG105(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG104(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG106(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG105(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG107(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG106(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG108(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG107(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG109(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG108(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG110(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG109(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG111(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG110(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG112(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG111(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG113(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG112(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG114(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG113(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG115(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG114(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG116(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG115(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG117(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG116(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG118(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG117(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG119(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG118(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG120(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG119(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG121(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG120(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG122(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG121(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG123(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG122(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG124(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG123(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG125(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG124(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG126(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG125(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG127(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG126(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG128(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG127(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG129(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG128(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG130(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG129(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG131(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG130(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG132(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG131(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG133(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG132(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG134(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG133(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG135(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG134(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG136(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG135(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG137(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG136(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG138(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG137(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG139(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG138(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG140(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG139(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG141(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG140(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG142(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG141(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG143(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG142(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG144(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG143(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG145(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG144(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG146(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG145(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG147(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG146(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG148(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG147(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG149(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG148(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG150(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG149(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG151(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG150(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG152(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG151(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG153(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG152(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG154(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG153(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG155(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG154(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG156(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG155(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG157(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG156(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG158(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG157(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG159(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG158(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
#define _VA_FRONT_WRAP_ARG160(wrap, ...) _VA_WRAP_INNER(wrap, _VA_ARG0(__VA_ARGS__)), _VA_FRONT_WRAP_ARG159(wrap, _VA_ARGS_SECOND(__VA_ARGS__))
|
||||
/// @todo support more, but currently supports up to 160
|
||||
|
||||
#define _VA_LAST_ARG1(x0, ...) __VA_ARGS__
|
||||
#define _VA_LAST_ARG2(x0, x1, ...) __VA_ARGS__
|
||||
#define _VA_LAST_ARG3(x0, x1, x2, ...) __VA_ARGS__
|
||||
#define _VA_LAST_ARG4(x0, x1, x2, x3, ...) __VA_ARGS__
|
||||
#define _VA_LAST_ARG5(x0, x1, x2, x3, x4, ...) __VA_ARGS__
|
||||
#define _VA_LAST_ARG6(x0, x1, x2, x3, x4, x5, ...) __VA_ARGS__
|
||||
#define _VA_LAST_ARG7(x0, x1, x2, x3, x4, x5, x6, ...) __VA_ARGS__
|
||||
#define _VA_LAST_ARG8(x0, x1, x2, x3, x4, x5, x6, x7, ...) __VA_ARGS__
|
||||
#define _VA_LAST_ARG9(x0, x1, x2, x3, x4, x5, x6, x7, x8, ...) __VA_ARGS__
|
||||
#define _VA_LAST_ARG10(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, ...) __VA_ARGS__
|
||||
#define _VA_LAST_ARG11(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, ...) __VA_ARGS__
|
||||
#define _VA_LAST_ARG12(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, ...) __VA_ARGS__
|
||||
|
||||
#define IPC_MSG_SET_ARG1(msg, v1, l1) \
|
||||
do { \
|
||||
ipc_msg_set_nth_arg(msg, 0, v1, l1); \
|
||||
} while (0)
|
||||
|
||||
#define IPC_MSG_SET_ARG2(msg, v1, v2, l1, l2) \
|
||||
do { \
|
||||
ipc_msg_set_nth_arg(msg, 0, v1, l1); \
|
||||
ipc_msg_set_nth_arg(msg, 1, v2, l2); \
|
||||
} while (0)
|
||||
|
||||
#define IPC_MSG_SET_ARG3(msg, v1, v2, v3, l1, l2, l3) \
|
||||
do { \
|
||||
ipc_msg_set_nth_arg(msg, 0, v1, l1); \
|
||||
ipc_msg_set_nth_arg(msg, 1, v2, l2); \
|
||||
ipc_msg_set_nth_arg(msg, 2, v3, l3); \
|
||||
} while (0)
|
||||
|
||||
#define IPC_MSG_SET_ARG4(msg, v1, v2, v3, v4, l1, l2, l3, l4) \
|
||||
do { \
|
||||
ipc_msg_set_nth_arg(msg, 0, v1, l1); \
|
||||
ipc_msg_set_nth_arg(msg, 1, v2, l2); \
|
||||
ipc_msg_set_nth_arg(msg, 2, v3, l3); \
|
||||
ipc_msg_set_nth_arg(msg, 3, v4, l4); \
|
||||
} while (0)
|
||||
|
||||
#define IPC_MSG_SET_ARG5(msg, v1, v2, v3, v4, v5, l1, l2, l3, l4, l5) \
|
||||
do { \
|
||||
ipc_msg_set_nth_arg(msg, 0, v1, l1); \
|
||||
ipc_msg_set_nth_arg(msg, 1, v2, l2); \
|
||||
ipc_msg_set_nth_arg(msg, 2, v3, l3); \
|
||||
ipc_msg_set_nth_arg(msg, 3, v4, l4); \
|
||||
ipc_msg_set_nth_arg(msg, 4, v5, l5); \
|
||||
} while (0)
|
||||
|
||||
#define IPC_MSG_SET_ARG6(msg, v1, v2, v3, v4, v5, v6, l1, l2, l3, l4, l5, l6) \
|
||||
do { \
|
||||
ipc_msg_set_nth_arg(msg, 0, v1, l1); \
|
||||
ipc_msg_set_nth_arg(msg, 1, v2, l2); \
|
||||
ipc_msg_set_nth_arg(msg, 2, v3, l3); \
|
||||
ipc_msg_set_nth_arg(msg, 3, v4, l4); \
|
||||
ipc_msg_set_nth_arg(msg, 4, v5, l5); \
|
||||
ipc_msg_set_nth_arg(msg, 5, v6, l6); \
|
||||
} while (0)
|
||||
|
||||
#define IPC_MSG_SET_ARG7(msg, v1, v2, v3, v4, v5, v6, v7, l1, l2, l3, l4, l5, l6, l7) \
|
||||
do { \
|
||||
ipc_msg_set_nth_arg(msg, 0, v1, l1); \
|
||||
ipc_msg_set_nth_arg(msg, 1, v2, l2); \
|
||||
ipc_msg_set_nth_arg(msg, 2, v3, l3); \
|
||||
ipc_msg_set_nth_arg(msg, 3, v4, l4); \
|
||||
ipc_msg_set_nth_arg(msg, 4, v5, l5); \
|
||||
ipc_msg_set_nth_arg(msg, 5, v6, l6); \
|
||||
ipc_msg_set_nth_arg(msg, 6, v7, l7); \
|
||||
} while (0)
|
||||
|
||||
#define IPC_MSG_SET_ARG8(msg, v1, v2, v3, v4, v5, v6, v7, v8, l1, l2, l3, l4, l5, l6, l7, l8) \
|
||||
do { \
|
||||
ipc_msg_set_nth_arg(msg, 0, v1, l1); \
|
||||
ipc_msg_set_nth_arg(msg, 1, v2, l2); \
|
||||
ipc_msg_set_nth_arg(msg, 2, v3, l3); \
|
||||
ipc_msg_set_nth_arg(msg, 3, v4, l4); \
|
||||
ipc_msg_set_nth_arg(msg, 4, v5, l5); \
|
||||
ipc_msg_set_nth_arg(msg, 5, v6, l6); \
|
||||
ipc_msg_set_nth_arg(msg, 6, v7, l7); \
|
||||
ipc_msg_set_nth_arg(msg, 7, v8, l8); \
|
||||
} while (0)
|
||||
|
||||
#define IPC_MSG_SET_ARG9(msg, v1, v2, v3, v4, v5, v6, v7, v8, v9, l1, l2, l3, l4, l5, l6, l7, l8, l9) \
|
||||
do { \
|
||||
ipc_msg_set_nth_arg(msg, 0, v1, l1); \
|
||||
ipc_msg_set_nth_arg(msg, 1, v2, l2); \
|
||||
ipc_msg_set_nth_arg(msg, 2, v3, l3); \
|
||||
ipc_msg_set_nth_arg(msg, 3, v4, l4); \
|
||||
ipc_msg_set_nth_arg(msg, 4, v5, l5); \
|
||||
ipc_msg_set_nth_arg(msg, 5, v6, l6); \
|
||||
ipc_msg_set_nth_arg(msg, 6, v7, l7); \
|
||||
ipc_msg_set_nth_arg(msg, 7, v8, l8); \
|
||||
ipc_msg_set_nth_arg(msg, 8, v9, l9); \
|
||||
} while (0)
|
||||
|
||||
#define IPC_MSG_SET_ARG10(msg, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10) \
|
||||
do { \
|
||||
ipc_msg_set_nth_arg(msg, 0, v1, l1); \
|
||||
ipc_msg_set_nth_arg(msg, 1, v2, l2); \
|
||||
ipc_msg_set_nth_arg(msg, 2, v3, l3); \
|
||||
ipc_msg_set_nth_arg(msg, 3, v4, l4); \
|
||||
ipc_msg_set_nth_arg(msg, 4, v5, l5); \
|
||||
ipc_msg_set_nth_arg(msg, 5, v6, l6); \
|
||||
ipc_msg_set_nth_arg(msg, 6, v7, l7); \
|
||||
ipc_msg_set_nth_arg(msg, 7, v8, l8); \
|
||||
ipc_msg_set_nth_arg(msg, 8, v9, l9); \
|
||||
ipc_msg_set_nth_arg(msg, 9, v10, l10); \
|
||||
} while (0)
|
||||
|
||||
#define IPC_MSG_SET_ARG11(msg, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11) \
|
||||
do { \
|
||||
ipc_msg_set_nth_arg(msg, 0, v1, l1); \
|
||||
ipc_msg_set_nth_arg(msg, 1, v2, l2); \
|
||||
ipc_msg_set_nth_arg(msg, 2, v3, l3); \
|
||||
ipc_msg_set_nth_arg(msg, 3, v4, l4); \
|
||||
ipc_msg_set_nth_arg(msg, 4, v5, l5); \
|
||||
ipc_msg_set_nth_arg(msg, 5, v6, l6); \
|
||||
ipc_msg_set_nth_arg(msg, 6, v7, l7); \
|
||||
ipc_msg_set_nth_arg(msg, 7, v8, l8); \
|
||||
ipc_msg_set_nth_arg(msg, 8, v9, l9); \
|
||||
ipc_msg_set_nth_arg(msg, 9, v10, l10); \
|
||||
ipc_msg_set_nth_arg(msg, 10, v11, l11); \
|
||||
} while (0)
|
||||
|
||||
#define IPC_MSG_SET_ARG12(msg, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12) \
|
||||
do { \
|
||||
ipc_msg_set_nth_arg(msg, 0, v1, l1); \
|
||||
ipc_msg_set_nth_arg(msg, 1, v2, l2); \
|
||||
ipc_msg_set_nth_arg(msg, 2, v3, l3); \
|
||||
ipc_msg_set_nth_arg(msg, 3, v4, l4); \
|
||||
ipc_msg_set_nth_arg(msg, 4, v5, l5); \
|
||||
ipc_msg_set_nth_arg(msg, 5, v6, l6); \
|
||||
ipc_msg_set_nth_arg(msg, 6, v7, l7); \
|
||||
ipc_msg_set_nth_arg(msg, 7, v8, l8); \
|
||||
ipc_msg_set_nth_arg(msg, 8, v9, l9); \
|
||||
ipc_msg_set_nth_arg(msg, 9, v10, l10); \
|
||||
ipc_msg_set_nth_arg(msg, 10, v11, l11); \
|
||||
ipc_msg_set_nth_arg(msg, 11, v12, l12); \
|
||||
} while (0)
|
||||
|
||||
#define IPC_MSG_GET_ARG1(msg, v1, l1) \
|
||||
do { \
|
||||
ipc_msg_get_nth_arg(msg, 0, v1, l1); \
|
||||
} while (0)
|
||||
|
||||
#define IPC_MSG_GET_ARG2(msg, v1, v2, l1, l2) \
|
||||
do { \
|
||||
ipc_msg_get_nth_arg(msg, 0, v1, l1); \
|
||||
ipc_msg_get_nth_arg(msg, 1, v2, l2); \
|
||||
} while (0)
|
||||
|
||||
#define IPC_MSG_GET_ARG3(msg, v1, v2, v3, l1, l2, l3) \
|
||||
do { \
|
||||
ipc_msg_get_nth_arg(msg, 0, v1, l1); \
|
||||
ipc_msg_get_nth_arg(msg, 1, v2, l2); \
|
||||
ipc_msg_get_nth_arg(msg, 2, v3, l3); \
|
||||
} while (0)
|
||||
|
||||
#define IPC_MSG_GET_ARG4(msg, v1, v2, v3, v4, l1, l2, l3, l4) \
|
||||
do { \
|
||||
ipc_msg_get_nth_arg(msg, 0, v1, l1); \
|
||||
ipc_msg_get_nth_arg(msg, 1, v2, l2); \
|
||||
ipc_msg_get_nth_arg(msg, 2, v3, l3); \
|
||||
ipc_msg_get_nth_arg(msg, 3, v4, l4); \
|
||||
} while (0)
|
||||
|
||||
#define IPC_MSG_GET_ARG5(msg, v1, v2, v3, v4, v5, l1, l2, l3, l4, l5) \
|
||||
do { \
|
||||
ipc_msg_get_nth_arg(msg, 0, v1, l1); \
|
||||
ipc_msg_get_nth_arg(msg, 1, v2, l2); \
|
||||
ipc_msg_get_nth_arg(msg, 2, v3, l3); \
|
||||
ipc_msg_get_nth_arg(msg, 3, v4, l4); \
|
||||
ipc_msg_get_nth_arg(msg, 4, v5, l5); \
|
||||
} while (0)
|
||||
|
||||
#define IPC_MSG_GET_ARG6(msg, v1, v2, v3, v4, v5, v6, l1, l2, l3, l4, l5, l6) \
|
||||
do { \
|
||||
ipc_msg_get_nth_arg(msg, 0, v1, l1); \
|
||||
ipc_msg_get_nth_arg(msg, 1, v2, l2); \
|
||||
ipc_msg_get_nth_arg(msg, 2, v3, l3); \
|
||||
ipc_msg_get_nth_arg(msg, 3, v4, l4); \
|
||||
ipc_msg_get_nth_arg(msg, 4, v5, l5); \
|
||||
ipc_msg_get_nth_arg(msg, 5, v6, l6); \
|
||||
} while (0)
|
||||
|
||||
#define IPC_MSG_GET_ARG7(msg, v1, v2, v3, v4, v5, v6, v7, l1, l2, l3, l4, l5, l6, l7) \
|
||||
do { \
|
||||
ipc_msg_get_nth_arg(msg, 0, v1, l1); \
|
||||
ipc_msg_get_nth_arg(msg, 1, v2, l2); \
|
||||
ipc_msg_get_nth_arg(msg, 2, v3, l3); \
|
||||
ipc_msg_get_nth_arg(msg, 3, v4, l4); \
|
||||
ipc_msg_get_nth_arg(msg, 4, v5, l5); \
|
||||
ipc_msg_get_nth_arg(msg, 5, v6, l6); \
|
||||
ipc_msg_get_nth_arg(msg, 6, v7, l7); \
|
||||
} while (0)
|
||||
|
||||
#define IPC_MSG_GET_ARG8(msg, v1, v2, v3, v4, v5, v6, v7, v8, l1, l2, l3, l4, l5, l6, l7, l8) \
|
||||
do { \
|
||||
ipc_msg_get_nth_arg(msg, 0, v1, l1); \
|
||||
ipc_msg_get_nth_arg(msg, 1, v2, l2); \
|
||||
ipc_msg_get_nth_arg(msg, 2, v3, l3); \
|
||||
ipc_msg_get_nth_arg(msg, 3, v4, l4); \
|
||||
ipc_msg_get_nth_arg(msg, 4, v5, l5); \
|
||||
ipc_msg_get_nth_arg(msg, 5, v6, l6); \
|
||||
ipc_msg_get_nth_arg(msg, 6, v7, l7); \
|
||||
ipc_msg_get_nth_arg(msg, 7, v8, l8); \
|
||||
} while (0)
|
||||
|
||||
#define IPC_MSG_GET_ARG9(msg, v1, v2, v3, v4, v5, v6, v7, v8, v9, l1, l2, l3, l4, l5, l6, l7, l8, l9) \
|
||||
do { \
|
||||
ipc_msg_get_nth_arg(msg, 0, v1, l1); \
|
||||
ipc_msg_get_nth_arg(msg, 1, v2, l2); \
|
||||
ipc_msg_get_nth_arg(msg, 2, v3, l3); \
|
||||
ipc_msg_get_nth_arg(msg, 3, v4, l4); \
|
||||
ipc_msg_get_nth_arg(msg, 4, v5, l5); \
|
||||
ipc_msg_get_nth_arg(msg, 5, v6, l6); \
|
||||
ipc_msg_get_nth_arg(msg, 6, v7, l7); \
|
||||
ipc_msg_get_nth_arg(msg, 7, v8, l8); \
|
||||
ipc_msg_get_nth_arg(msg, 8, v9, l9); \
|
||||
} while (0)
|
||||
|
||||
#define IPC_MSG_GET_ARG10(msg, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10) \
|
||||
do { \
|
||||
ipc_msg_get_nth_arg(msg, 0, v1, l1); \
|
||||
ipc_msg_get_nth_arg(msg, 1, v2, l2); \
|
||||
ipc_msg_get_nth_arg(msg, 2, v3, l3); \
|
||||
ipc_msg_get_nth_arg(msg, 3, v4, l4); \
|
||||
ipc_msg_get_nth_arg(msg, 4, v5, l5); \
|
||||
ipc_msg_get_nth_arg(msg, 5, v6, l6); \
|
||||
ipc_msg_get_nth_arg(msg, 6, v7, l7); \
|
||||
ipc_msg_get_nth_arg(msg, 7, v8, l8); \
|
||||
ipc_msg_get_nth_arg(msg, 8, v9, l9); \
|
||||
ipc_msg_get_nth_arg(msg, 9, v10, l10); \
|
||||
} while (0)
|
||||
|
||||
#define IPC_MSG_GET_ARG11(msg, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11) \
|
||||
do { \
|
||||
ipc_msg_get_nth_arg(msg, 0, v1, l1); \
|
||||
ipc_msg_get_nth_arg(msg, 1, v2, l2); \
|
||||
ipc_msg_get_nth_arg(msg, 2, v3, l3); \
|
||||
ipc_msg_get_nth_arg(msg, 3, v4, l4); \
|
||||
ipc_msg_get_nth_arg(msg, 4, v5, l5); \
|
||||
ipc_msg_get_nth_arg(msg, 5, v6, l6); \
|
||||
ipc_msg_get_nth_arg(msg, 6, v7, l7); \
|
||||
ipc_msg_get_nth_arg(msg, 7, v8, l8); \
|
||||
ipc_msg_get_nth_arg(msg, 8, v9, l9); \
|
||||
ipc_msg_get_nth_arg(msg, 9, v10, l10); \
|
||||
ipc_msg_get_nth_arg(msg, 10, v11, l11); \
|
||||
} while (0)
|
||||
|
||||
#define IPC_MSG_GET_ARG12(msg, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12) \
|
||||
do { \
|
||||
ipc_msg_get_nth_arg(msg, 0, v1, l1); \
|
||||
ipc_msg_get_nth_arg(msg, 1, v2, l2); \
|
||||
ipc_msg_get_nth_arg(msg, 2, v3, l3); \
|
||||
ipc_msg_get_nth_arg(msg, 3, v4, l4); \
|
||||
ipc_msg_get_nth_arg(msg, 4, v5, l5); \
|
||||
ipc_msg_get_nth_arg(msg, 5, v6, l6); \
|
||||
ipc_msg_get_nth_arg(msg, 6, v7, l7); \
|
||||
ipc_msg_get_nth_arg(msg, 7, v8, l8); \
|
||||
ipc_msg_get_nth_arg(msg, 8, v9, l9); \
|
||||
ipc_msg_get_nth_arg(msg, 9, v10, l10); \
|
||||
ipc_msg_get_nth_arg(msg, 10, v11, l11); \
|
||||
ipc_msg_get_nth_arg(msg, 11, v12, l12); \
|
||||
} while (0)
|
||||
|
||||
#define IPC_DO_SERVE1(ipc_name) IPC_DO_SERVE_FUNC(ipc_name)(argv[0])
|
||||
#define IPC_DO_SERVE2(ipc_name) IPC_DO_SERVE_FUNC(ipc_name)(argv[0], argv[1])
|
||||
#define IPC_DO_SERVE3(ipc_name) IPC_DO_SERVE_FUNC(ipc_name)(argv[0], argv[1], argv[2])
|
||||
#define IPC_DO_SERVE4(ipc_name) IPC_DO_SERVE_FUNC(ipc_name)(argv[0], argv[1], argv[2], argv[3])
|
||||
#define IPC_DO_SERVE5(ipc_name) IPC_DO_SERVE_FUNC(ipc_name)(argv[0], argv[1], argv[2], argv[3], argv[4])
|
||||
#define IPC_DO_SERVE6(ipc_name) IPC_DO_SERVE_FUNC(ipc_name)(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5])
|
||||
#define IPC_DO_SERVE7(ipc_name) IPC_DO_SERVE_FUNC(ipc_name)(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6])
|
||||
#define IPC_DO_SERVE8(ipc_name) IPC_DO_SERVE_FUNC(ipc_name)(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7])
|
||||
#define IPC_DO_SERVE9(ipc_name) IPC_DO_SERVE_FUNC(ipc_name)(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8])
|
||||
#define IPC_DO_SERVE10(ipc_name) IPC_DO_SERVE_FUNC(ipc_name)(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9])
|
||||
#define IPC_DO_SERVE11(ipc_name) IPC_DO_SERVE_FUNC(ipc_name)(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10])
|
||||
#define IPC_DO_SERVE12(ipc_name) IPC_DO_SERVE_FUNC(ipc_name)(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11])
|
||||
@@ -0,0 +1,206 @@
|
||||
/*
|
||||
* Copyright (c) 2020 AIIT XUOS Lab
|
||||
* XiUOS is licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
*/
|
||||
/**
|
||||
* @file libipc.c
|
||||
* @brief package seesion for inter process call perpose
|
||||
* @version 3.0
|
||||
* @author AIIT XUOS Lab
|
||||
* @date 2023.08.25
|
||||
*/
|
||||
|
||||
/*************************************************
|
||||
File name: libipc.c
|
||||
Description: package seesion for inter process call perpose
|
||||
Others:
|
||||
History:
|
||||
1. Date: 2023-08-28
|
||||
Author: AIIT XUOS Lab
|
||||
Modification:
|
||||
1. first version
|
||||
*************************************************/
|
||||
#include <string.h>
|
||||
|
||||
#include "libipc.h"
|
||||
#include "libserial.h"
|
||||
#include "usyscall.h"
|
||||
|
||||
/// @warning this file doesnt support multi threads
|
||||
|
||||
/// ipc part
|
||||
|
||||
struct IpcMsg* new_ipc_msg(struct Session* session, const int argc, const int* arg_size)
|
||||
{
|
||||
int len = IPC_ARG_INFO_BASE_OFFSET;
|
||||
|
||||
int arg_info_offset = len; // start of arg info
|
||||
len += argc * sizeof(struct IpcArgInfo);
|
||||
|
||||
int arg_buf_offset = len; // start of arg buffer
|
||||
for (int i = 0; i < argc; i++) {
|
||||
len += arg_size[i];
|
||||
}
|
||||
struct IpcMsg* buf = session_alloc_buf(session, len);
|
||||
if (buf == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
buf->header.len = len;
|
||||
buf->header.done = 0;
|
||||
buf->header.valid = 0;
|
||||
|
||||
for (int i = 0; i < argc; i++) {
|
||||
struct IpcArgInfo* arg_info = (struct IpcArgInfo*)((char*)buf + arg_info_offset);
|
||||
arg_info->len = arg_size[i];
|
||||
arg_info->offset = arg_buf_offset;
|
||||
|
||||
// update arg_info_offset and arg_buf_offset
|
||||
arg_info_offset += sizeof(struct IpcArgInfo);
|
||||
arg_buf_offset += arg_size[i];
|
||||
}
|
||||
buf->header.nr_args = argc;
|
||||
buf->header.init = 1;
|
||||
return buf;
|
||||
}
|
||||
|
||||
/// @brief set nth arg in ipc_msg with data
|
||||
/// @param msg
|
||||
/// @param arg_num start with 0 for first arg
|
||||
/// @param data
|
||||
/// @param len data buffer len
|
||||
/// @return
|
||||
bool ipc_msg_set_nth_arg(struct IpcMsg* msg, const int arg_num, const void* const data, const int len)
|
||||
{
|
||||
if (arg_num >= msg->header.nr_args) {
|
||||
printf("[%s] IPC: arg_num out of msg range, arg_num: %d, nr_args: %d\n", __func__, arg_num, msg->header.nr_args);
|
||||
return false;
|
||||
}
|
||||
struct IpcArgInfo* nth_arg_info = IPCMSG_ARG_INFO(msg, arg_num);
|
||||
if (len > nth_arg_info->len) {
|
||||
printf("[%s] IPC: size of arg out of buffer range, given len: %d, len %d\n", __func__, len, nth_arg_info->len);
|
||||
return false;
|
||||
}
|
||||
void* buf = ipc_msg_get_nth_arg_buf(msg, arg_num);
|
||||
memmove(buf, data, len);
|
||||
return true;
|
||||
}
|
||||
|
||||
/// @brief get nth arg in ipc_msg and move value to data
|
||||
/// @param msg
|
||||
/// @param arg_num start with 0 for first arg
|
||||
/// @param data
|
||||
/// @param len data buffer len
|
||||
/// @return
|
||||
bool ipc_msg_get_nth_arg(struct IpcMsg* msg, const int arg_num, void* data, const int len)
|
||||
{
|
||||
if (arg_num >= msg->header.nr_args) {
|
||||
printf("[%s] IPC: arg_num out of msg range", __func__);
|
||||
return false;
|
||||
}
|
||||
struct IpcArgInfo* nth_arg_info = IPCMSG_ARG_INFO(msg, arg_num);
|
||||
if (len > nth_arg_info->len) {
|
||||
printf("[%s] IPC: size of arg out of buffer range", __func__);
|
||||
return false;
|
||||
}
|
||||
void* buf = ipc_msg_get_nth_arg_buf(msg, arg_num);
|
||||
memmove(data, buf, len);
|
||||
return true;
|
||||
}
|
||||
|
||||
void ipc_msg_send_wait(struct IpcMsg* msg)
|
||||
{
|
||||
msg->header.magic = IPC_MSG_MAGIC;
|
||||
msg->header.valid = 1;
|
||||
msg->header.done = 0;
|
||||
while (msg->header.done == 0) {
|
||||
/// @todo syscall yield with prio decrease
|
||||
yield();
|
||||
}
|
||||
assert(msg->header.done == 1);
|
||||
}
|
||||
|
||||
void ipc_msg_send_nowait(struct IpcMsg* msg)
|
||||
{
|
||||
msg->header.magic = IPC_MSG_MAGIC;
|
||||
msg->header.valid = 1;
|
||||
msg->header.done = 0;
|
||||
}
|
||||
|
||||
int ipc_session_wait(struct Session* session)
|
||||
{
|
||||
struct IpcMsg* msg = IPCSESSION_MSG(session);
|
||||
while (msg->header.done == 0) {
|
||||
/// @todo syscall yield with prio decrease
|
||||
yield();
|
||||
}
|
||||
assert(msg->header.done == 1);
|
||||
return msg->header.ret_val;
|
||||
}
|
||||
|
||||
static int cur_sess_id = -1;
|
||||
int cur_session_id(void)
|
||||
{
|
||||
return cur_sess_id;
|
||||
}
|
||||
|
||||
static bool session_delayed = false;
|
||||
void delay_session(void)
|
||||
{
|
||||
session_delayed = true;
|
||||
}
|
||||
|
||||
void ipc_server_loop(struct IpcNode* ipc_node)
|
||||
{
|
||||
struct Session session_list[NR_MAX_SESSION];
|
||||
for (;;) {
|
||||
/* if connect sessions are greater than NR_MAX_SESSION,
|
||||
a full round will require multiple polls.
|
||||
Eg.(3 polls to with 6 sessions and NR_MAX_SESSION = 4):
|
||||
[0, 1, 2, 3], [4, 5, 0, 1], [2, 3, 4, 5]
|
||||
*/
|
||||
poll_session(session_list, NR_MAX_SESSION);
|
||||
/* handle each session */
|
||||
for (int i = 0; i < NR_MAX_SESSION; i++) {
|
||||
if (session_list[i].buf == NULL) {
|
||||
yield();
|
||||
break;
|
||||
}
|
||||
cur_sess_id = session_list[i].id;
|
||||
struct IpcMsg* msg = IPCSESSION_MSG(&session_list[i]);
|
||||
/* handle every message in current session
|
||||
a session could be delay in case one of its message(current message) needs to wait for an interrupt message's arrival
|
||||
interfaces[opcode] should explicitly call delay_session() and return to delay this session
|
||||
*/
|
||||
while (msg->header.magic == IPC_MSG_MAGIC && msg->header.valid == 1 && msg->header.done != 1) {
|
||||
// printf("session %d [%d, %d]\n", session_list[i].id, session_list[i].head, session_list[i].tail);
|
||||
if (session_used_size(&session_list[i]) == 0 && session_forward_tail(&session_list[i], msg->header.len) < 0) {
|
||||
break;
|
||||
}
|
||||
if (ipc_node->interfaces[msg->header.opcode]) {
|
||||
ipc_node->interfaces[msg->header.opcode](msg);
|
||||
// check if this session is delayed by op handler, all messages after the delayed message in current session is blocked.
|
||||
if (session_delayed) {
|
||||
session_delayed = false;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
printf("Unsupport opcode(%d) for server: %s\n", msg->header.opcode, ipc_node->name);
|
||||
}
|
||||
// finish this message in server's perspective
|
||||
while (session_forward_head(&session_list[i], msg->header.len) < 0) {
|
||||
yield();
|
||||
}
|
||||
msg = IPCSESSION_MSG(&session_list[i]);
|
||||
}
|
||||
// stop handle this session
|
||||
cur_sess_id = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,235 @@
|
||||
/*
|
||||
* Copyright (c) 2020 AIIT XUOS Lab
|
||||
* XiUOS is licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
*/
|
||||
/**
|
||||
* @file libipc.h
|
||||
* @brief libipc header
|
||||
* @version 3.0
|
||||
* @author AIIT XUOS Lab
|
||||
* @date 2023.08.25
|
||||
*/
|
||||
|
||||
/*************************************************
|
||||
File name: libipc.h
|
||||
Description: libipc header
|
||||
Others:
|
||||
History:
|
||||
1. Date: 2023-08-28
|
||||
Author: AIIT XUOS Lab
|
||||
Modification:
|
||||
1. first version
|
||||
*************************************************/
|
||||
#pragma once
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "ipcargs.h"
|
||||
#include "session.h"
|
||||
|
||||
#define NR_MAX_SESSION 16
|
||||
#define IPC_MSG_MAGIC 0xABCDDCBA
|
||||
|
||||
typedef struct {
|
||||
union {
|
||||
uint64_t header;
|
||||
struct {
|
||||
uint64_t valid : 1; // for server to peek new msg
|
||||
uint64_t done : 1; // for client to check request done
|
||||
uint64_t init : 1; // for client to check request done
|
||||
uint64_t reserved : 1;
|
||||
uint64_t nr_args : 4;
|
||||
uint64_t opcode : 8;
|
||||
uint64_t len : 16;
|
||||
uint64_t magic : 32;
|
||||
};
|
||||
};
|
||||
int32_t ret_val;
|
||||
} __attribute__((packed)) ipc_msg_header;
|
||||
|
||||
struct IpcArgInfo {
|
||||
uint16_t offset;
|
||||
uint16_t len;
|
||||
};
|
||||
|
||||
/* [header, ipc_arg_buffer_len[], ipc_arg_buffer[]] */
|
||||
struct IpcMsg {
|
||||
ipc_msg_header header;
|
||||
uintptr_t buf[];
|
||||
};
|
||||
enum {
|
||||
IPC_ARG_INFO_BASE_OFFSET = sizeof(ipc_msg_header),
|
||||
};
|
||||
|
||||
typedef int (*IpcInterface)(struct IpcMsg* msg);
|
||||
|
||||
struct IpcNode {
|
||||
char* name;
|
||||
IpcInterface interfaces[UINT8_MAX];
|
||||
};
|
||||
|
||||
#define IPC_SERVER_LOOP(ipc_node_name) rpc_server_loop_##rpc_node_name
|
||||
#define IPC_SERVICES(ipc_node_name, ...) \
|
||||
typedef enum { \
|
||||
ipc_node_name##_IPC_OP_CODE_DEFAULT = 0, \
|
||||
__VA_ARGS__, \
|
||||
ipc_node_name##_IPC_OP_CODE_END, \
|
||||
} IpcOpCode_##ipc_node_name;
|
||||
|
||||
#define _IPC_INSERT_SERVE(interface) [interface] = IPC_SERVE(interface)
|
||||
#define IPC_SERVER_REGISTER_INTERFACES(ipc_node_name, num_interfaces, ...) \
|
||||
static struct IpcNode ipc_node_name = (struct IpcNode) \
|
||||
{ \
|
||||
.interfaces = { \
|
||||
_VA_FRONT_WRAP_ARG##num_interfaces(_IPC_INSERT_SERVE, __VA_ARGS__), \
|
||||
}, \
|
||||
}
|
||||
|
||||
#define IPCSESSION_MSG(session) ((struct IpcMsg*)((char*)((session)->buf) + (session)->head))
|
||||
#define IPCMSG_ARG_INFO_BASE(msg) ((struct IpcArgInfo*)((char*)msg + sizeof(ipc_msg_header)))
|
||||
#define IPCMSG_ARG_INFO(msg, nth) ((struct IpcArgInfo*)((char*)IPCMSG_ARG_INFO_BASE(msg) + (nth * sizeof(struct IpcArgInfo))))
|
||||
|
||||
/// @brief get buffer of nth arg in ipc_msg
|
||||
/// @param msg
|
||||
/// @param arg_num start with 0 for first arg
|
||||
/// @return
|
||||
__attribute__((__always_inline__)) static inline void* ipc_msg_get_nth_arg_buf(struct IpcMsg* msg, int arg_num)
|
||||
{
|
||||
return (void*)((char*)msg + IPCMSG_ARG_INFO(msg, arg_num)->offset);
|
||||
}
|
||||
|
||||
/// @brief get return val of ipc call after done, used by client
|
||||
/// @param msg
|
||||
/// @param ret_val
|
||||
__attribute__((__always_inline__)) static inline void ipc_msg_get_return(struct IpcMsg* msg, int32_t* ret_val)
|
||||
{
|
||||
assert(msg->header.done == 1);
|
||||
memcpy(ret_val, &msg->header.ret_val, sizeof(msg->header.ret_val));
|
||||
return;
|
||||
}
|
||||
|
||||
/// @brief set return val of ipc call after serve, used by server
|
||||
/// @param msg
|
||||
/// @param ret_val
|
||||
__attribute__((__always_inline__)) static inline void ipc_msg_set_return(struct IpcMsg* msg, int32_t* ret_val)
|
||||
{
|
||||
assert(msg->header.valid == 1);
|
||||
memcpy(&msg->header.ret_val, ret_val, sizeof(msg->header.ret_val));
|
||||
return;
|
||||
}
|
||||
|
||||
/// @brief set opcode to msg
|
||||
/// @param msg
|
||||
/// @param opcode
|
||||
/// @return
|
||||
__attribute__((__always_inline__)) static inline bool ipc_msg_set_opcode(struct IpcMsg* msg, int opcode)
|
||||
{
|
||||
if (opcode < 0 || opcode > UINT8_MAX) {
|
||||
return false;
|
||||
}
|
||||
msg->header.opcode = opcode;
|
||||
return true;
|
||||
}
|
||||
|
||||
/// @brief get opcode from msg
|
||||
/// @param msg
|
||||
/// @return opcode, -1 if opcode is invalid
|
||||
__attribute__((__always_inline__)) static inline int ipc_msg_get_opcode(struct IpcMsg* msg)
|
||||
{
|
||||
assert(msg->header.valid == 1);
|
||||
int opcode = msg->header.opcode;
|
||||
if (opcode < 0 || opcode > UINT8_MAX) {
|
||||
return -1;
|
||||
}
|
||||
return opcode;
|
||||
}
|
||||
|
||||
/// @brief delete first msg in session
|
||||
/// @param session
|
||||
/// @return
|
||||
__attribute__((__always_inline__)) static inline bool ipc_session_forward(struct Session* session)
|
||||
{
|
||||
struct IpcMsg* msg = IPCSESSION_MSG(session);
|
||||
if (msg->header.init != 1) {
|
||||
return false;
|
||||
}
|
||||
return session_free_buf(session, msg->header.len);
|
||||
}
|
||||
|
||||
struct IpcMsg* new_ipc_msg(struct Session* session, const int argc, const int* arg_size);
|
||||
bool ipc_msg_set_nth_arg(struct IpcMsg* msg, const int arg_num, const void* const data, const int len);
|
||||
bool ipc_msg_get_nth_arg(struct IpcMsg* msg, const int arg_num, void* data, const int len);
|
||||
void ipc_msg_send_wait(struct IpcMsg* msg);
|
||||
void ipc_msg_send_nowait(struct IpcMsg* msg);
|
||||
int ipc_session_wait(struct Session* session);
|
||||
|
||||
void ipc_server_loop(struct IpcNode* ipc_node);
|
||||
|
||||
#define IPC_CREATE_MSG_FUNC(ipc_name) ipc_msg_##ipc_name
|
||||
#define IPC_MSG_ARGS_COPY_SET_FUNC(ipc_name) ipc_msg_args_copy_set_##ipc_name
|
||||
#define IPC_MSG_ARGS_COPY_GET_FUNC(ipc_name) ipc_msg_args_copy_get_##ipc_name
|
||||
#define IPC_CALL(ipc_name) ipc_call_copy_args_##ipc_name
|
||||
|
||||
#define IPC_SERVE(ipc_name) ipc_serve_##ipc_name
|
||||
#define IPC_DO_SERVE_FUNC(ipc_name) ipc_do_serve_##ipc_name
|
||||
|
||||
#define IPC_INTERFACE(ipc_name, argc, ...) \
|
||||
__always_inline static inline struct IpcMsg* IPC_CREATE_MSG_FUNC(ipc_name)(struct Session * session, _VA_FRONT_PTR_ARG##argc(__VA_ARGS__)) \
|
||||
{ \
|
||||
int argv[argc] = { _VA_LAST_ARG##argc(__VA_ARGS__) }; \
|
||||
return new_ipc_msg(session, argc, argv); \
|
||||
} \
|
||||
\
|
||||
__always_inline static inline bool IPC_MSG_ARGS_COPY_SET_FUNC(ipc_name)(struct IpcMsg * msg, _VA_FRONT_PTR_ARG##argc(__VA_ARGS__)) \
|
||||
{ \
|
||||
IPC_MSG_SET_ARG##argc(msg, __VA_ARGS__); \
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
__always_inline static inline bool IPC_MSG_ARGS_COPY_GET_FUNC(ipc_name)(struct IpcMsg * msg, _VA_FRONT_PTR_ARG##argc(__VA_ARGS__)) \
|
||||
{ \
|
||||
IPC_MSG_GET_ARG##argc(msg, __VA_ARGS__); \
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
static int IPC_CALL(ipc_name)(struct Session * session, _VA_FRONT_PTR_ARG##argc(__VA_ARGS__)) \
|
||||
{ \
|
||||
if (session == NULL) { \
|
||||
return -1; \
|
||||
} \
|
||||
struct IpcMsg* msg = IPC_CREATE_MSG_FUNC(ipc_name)(session, _VA_FRONT_ARG##argc(__VA_ARGS__)); \
|
||||
int ret = IPC_MSG_ARGS_COPY_SET_FUNC(ipc_name)(msg, _VA_FRONT_ARG##argc(__VA_ARGS__)); \
|
||||
ret = ipc_msg_set_opcode(msg, ipc_name); \
|
||||
ipc_msg_send_wait(msg); \
|
||||
ret = IPC_MSG_ARGS_COPY_GET_FUNC(ipc_name)(msg, _VA_FRONT_ARG##argc(__VA_ARGS__)); \
|
||||
int32_t res = 0; \
|
||||
ipc_msg_get_return(msg, &res); \
|
||||
ipc_session_forward(session); \
|
||||
return res; \
|
||||
}
|
||||
|
||||
#define IPC_SERVER_INTERFACE(ipc_name, argc) \
|
||||
static int IPC_SERVE(ipc_name)(struct IpcMsg * msg) \
|
||||
{ \
|
||||
void* argv[argc]; \
|
||||
for (int i = 0; i < argc; i++) { \
|
||||
argv[i] = ipc_msg_get_nth_arg_buf(msg, i); \
|
||||
} \
|
||||
int32_t _ret = IPC_DO_SERVE##argc(ipc_name); \
|
||||
ipc_msg_set_return(msg, &_ret); \
|
||||
msg->header.done = 1; \
|
||||
return 0; \
|
||||
}
|
||||
|
||||
int cur_session_id(void);
|
||||
void delay_session(void);
|
||||
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
* Copyright (c) 2020 AIIT XUOS Lab
|
||||
* XiUOS is licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
*/
|
||||
/**
|
||||
* @file session.c
|
||||
* @brief session
|
||||
* @version 3.0
|
||||
* @author AIIT XUOS Lab
|
||||
* @date 2023.08.25
|
||||
*/
|
||||
|
||||
/*************************************************
|
||||
File name: session.c
|
||||
Description: session
|
||||
Others:
|
||||
History:
|
||||
1. Date: 2023-08-28
|
||||
Author: AIIT XUOS Lab
|
||||
Modification:
|
||||
1. first version
|
||||
*************************************************/
|
||||
#include <assert.h>
|
||||
|
||||
#include "session.h"
|
||||
#include "usyscall.h"
|
||||
|
||||
int connect_session(struct Session* _session, char* _path, int _capacity)
|
||||
{
|
||||
return session(_path, _capacity, _session);
|
||||
}
|
||||
|
||||
int free_session(struct Session* session)
|
||||
{
|
||||
return close_session(session);
|
||||
}
|
||||
|
||||
// ipc_msg alloc_buffer(ipc_session)
|
||||
|
||||
void* session_alloc_buf(struct Session* session, int len)
|
||||
{
|
||||
if (len > session_remain_capacity(session)) {
|
||||
return NULL;
|
||||
}
|
||||
void* buf = session->buf + session->tail;
|
||||
// we mapped double size of page, so it's ok to write buffer directly
|
||||
memset(buf, 0, len);
|
||||
session_forward_tail(session, len);
|
||||
return buf;
|
||||
}
|
||||
|
||||
bool session_free_buf(struct Session* session, int len)
|
||||
{
|
||||
if (len > session_used_size(session)) {
|
||||
return false;
|
||||
}
|
||||
assert(session_forward_head(session, len) != 1);
|
||||
return true;
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Copyright (c) 2020 AIIT XUOS Lab
|
||||
* XiUOS is licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
*/
|
||||
/**
|
||||
* @file session.h
|
||||
* @brief session header
|
||||
* @version 3.0
|
||||
* @author AIIT XUOS Lab
|
||||
* @date 2023.08.25
|
||||
*/
|
||||
|
||||
/*************************************************
|
||||
File name: session.h
|
||||
Description: session header
|
||||
Others:
|
||||
History:
|
||||
1. Date: 2023-08-28
|
||||
Author: AIIT XUOS Lab
|
||||
Modification:
|
||||
1. first version
|
||||
*************************************************/
|
||||
#pragma once
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "libserial.h"
|
||||
|
||||
struct Session {
|
||||
int id;
|
||||
int capacity;
|
||||
int head;
|
||||
int tail;
|
||||
void* buf;
|
||||
};
|
||||
|
||||
__attribute__((__always_inline__)) static inline int session_used_size(struct Session* session)
|
||||
{
|
||||
return ((session->tail + session->capacity) - session->head) % session->capacity;
|
||||
}
|
||||
|
||||
__attribute__((__always_inline__)) static inline int session_remain_capacity(struct Session* session)
|
||||
{
|
||||
return session->capacity - session_used_size(session);
|
||||
}
|
||||
|
||||
__attribute__((__always_inline__)) static inline int session_forward_head(struct Session* session, int len)
|
||||
{
|
||||
if (((session->head + len) % session->capacity) > session->tail) {
|
||||
printf("forward head with too much size\n");
|
||||
return -1;
|
||||
}
|
||||
session->head = (session->head + len) % session->capacity;
|
||||
return session->head;
|
||||
}
|
||||
|
||||
__attribute__((__always_inline__)) static inline int session_forward_tail(struct Session* session, int len)
|
||||
{
|
||||
if (len > session_remain_capacity(session)) {
|
||||
printf("forward tail with too much size\n");
|
||||
return -1;
|
||||
}
|
||||
session->tail = (session->tail + len) % session->capacity;
|
||||
return session->tail;
|
||||
}
|
||||
|
||||
int connect_session(struct Session* session, char* path, int capacity);
|
||||
int free_session(struct Session* session);
|
||||
void* session_alloc_buf(struct Session* session, int len);
|
||||
bool session_free_buf(struct Session* session, int len);
|
||||
Reference in New Issue
Block a user