Skip to content
Snippets Groups Projects
Commit 2b30f83a authored by Georgy Moshkin's avatar Georgy Moshkin :speech_balloon:
Browse files

refactor: stringify_cfunc macro now accepts full path to function

parent 3d1a96e8
No related branches found
No related tags found
1 merge request!151Refactor/more minor changes
......@@ -128,14 +128,9 @@ fn init_handlers() {
"#,
);
use discovery::proc_discover;
declare_cfunc!(proc_discover);
use traft::node::raft_interact;
declare_cfunc!(raft_interact);
use traft::node::raft_join;
declare_cfunc!(raft_join);
declare_cfunc!(discovery::proc_discover);
declare_cfunc!(traft::node::raft_interact);
declare_cfunc!(traft::node::raft_join);
}
fn rm_tarantool_files(data_dir: &str) {
......@@ -485,8 +480,7 @@ fn start_join(args: &args::Run, leader_address: String) {
advertise_address: args.advertise_address(),
};
use traft::node::raft_join;
let fn_name = stringify_cfunc!(raft_join);
let fn_name = stringify_cfunc!(traft::node::raft_join);
let resp: traft::JoinResponse = tarantool::net_box_call_retry(&leader_address, fn_name, &req);
picolib_setup(args);
......@@ -608,8 +602,7 @@ fn postjoin(args: &args::Run) {
let leader_id = node.status().leader_id.expect("leader_id deinitialized");
let leader = traft::Storage::peer_by_raft_id(leader_id).unwrap().unwrap();
use traft::node::raft_join;
let fn_name = stringify_cfunc!(raft_join);
let fn_name = stringify_cfunc!(traft::node::raft_join);
let now = Instant::now();
match tarantool::net_box_call(&leader.peer_address, fn_name, &req, timeout) {
Err(e) => {
......
......@@ -8,21 +8,31 @@ use ::tarantool::net_box;
use ::tarantool::tlua::{self, LuaFunction, LuaTable};
use ::tarantool::tuple::AsTuple;
#[macro_export]
macro_rules! stringify_last_token {
($tail:tt) => { std::stringify!($tail) };
($head:tt $($tail:tt)+) => { $crate::stringify_last_token!($($tail)+) };
}
/// Checks that the given function exists and returns it's name suitable for
/// calling it via tarantool rpc.
///
/// The argument can be a full path to the function.
#[macro_export]
macro_rules! stringify_cfunc {
( $func_name:expr ) => {{
( $($func_name:tt)+ ) => {{
use ::tarantool::tuple::FunctionArgs;
use ::tarantool::tuple::FunctionCtx;
use libc::c_int;
let _: unsafe extern "C" fn(FunctionCtx, FunctionArgs) -> c_int = $func_name;
concat!(".", stringify!($func_name))
let _: unsafe extern "C" fn(FunctionCtx, FunctionArgs) -> c_int = $($func_name)+;
concat!(".", $crate::stringify_last_token!($($func_name)+))
}};
}
#[macro_export]
macro_rules! declare_cfunc {
( $func_name:expr ) => {{
( $($func_name:tt)+ ) => {{
use ::tarantool::tuple::FunctionArgs;
use ::tarantool::tuple::FunctionCtx;
use libc::c_int;
......@@ -32,10 +42,10 @@ macro_rules! declare_cfunc {
// and we may get this error: dlsym(RTLD_DEFAULT, some_fn): symbol not found
fn used(_: unsafe extern "C" fn(FunctionCtx, FunctionArgs) -> c_int) {}
used($func_name);
crate::tarantool::eval(concat!(
used($($func_name)+);
$crate::tarantool::eval(concat!(
"box.schema.func.create('.",
stringify!($func_name),
$crate::stringify_last_token!($($func_name)+),
"', {
language = 'C',
if_not_exists = true
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment