Skip to content

Commit

Permalink
Added linkme to auto creation of register objects.
Browse files Browse the repository at this point in the history
  • Loading branch information
MeirShpilraien committed Dec 5, 2022
1 parent d11f43d commit ae766a5
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 20 deletions.
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ serde_json = "1.0"
serde = "1.0"
serde_derive = "1.0"
libc = "0.2"
linkme = "0.3"

[build-dependencies]
bindgen = "0.59.2"
Expand Down
8 changes: 8 additions & 0 deletions LibMRDerive/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,19 +1,27 @@
extern crate proc_macro;
use proc_macro::TokenStream;
use quote::quote;
use quote::format_ident;
use syn;

#[proc_macro_derive(BaseObject)]
pub fn base_object_derive(item: TokenStream) -> TokenStream {
let ast: syn::DeriveInput = syn::parse(item).unwrap();
let name = &ast.ident;

let func_name = format_ident!("register_{}", name.to_string().to_lowercase());

let gen = quote! {
impl BaseObject for #name {
fn get_name() -> &'static str {
concat!(stringify!(#name), "\0")
}
}

#[linkme::distributed_slice(mr::libmr::REGISTER_LIST)]
fn #func_name() {
#name::register();
}
};

gen.into()
Expand Down
10 changes: 9 additions & 1 deletion rust_api/libmr/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@
*/

use crate::libmr_c_raw::bindings::{MRRecordType, MR_CalculateSlot, MR_Init, RedisModuleCtx};

use redis_module::Context;

use std::os::raw::c_char;

use linkme::distributed_slice;

pub mod accumulator;
pub mod base_object;
pub mod execution_builder;
Expand All @@ -20,6 +21,9 @@ pub mod reader;
pub mod record;
pub mod remote_task;

#[distributed_slice()]
pub static REGISTER_LIST: [fn()] = [..];

impl Default for crate::libmr_c_raw::bindings::Record {
fn default() -> Self {
crate::libmr_c_raw::bindings::Record {
Expand All @@ -33,6 +37,10 @@ pub type RustMRError = String;
pub fn mr_init(ctx: &Context, num_threads: usize) {
unsafe { MR_Init(ctx.ctx as *mut RedisModuleCtx, num_threads) };
record::init();

for register in REGISTER_LIST {
register();
}
}

pub fn calc_slot(s: &[u8]) -> usize {
Expand Down
1 change: 1 addition & 0 deletions tests/mr_test_module/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ serde_derive = "1.0"
libc = "0.2"
lib_mr = { path = "../../" }
lib_mr_derive = { path = "../../LibMRDerive/" }
linkme = "0.3"

[build-dependencies]
bindgen = "0.57"
Expand Down
22 changes: 3 additions & 19 deletions tests/mr_test_module/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -848,28 +848,12 @@ impl Drop for KeysReader {
fn init_func(ctx: &Context, _args: &Vec<RedisString>) -> Status {
unsafe {
DETACHED_CTX = RedisModule_GetDetachedThreadSafeContext.unwrap()(ctx.ctx);

mr_init(ctx, 3);
}

StringRecord::register();
IntRecord::register();
mr_init(ctx, 3);

KeysReader::register();
MaxIdleReader::register();
ErrorReader::register();
TypeMapper::register();
ErrorMapper::register();
DummyMapper::register();
TypeFilter::register();
DummyFilter::register();
ErrorFilter::register();
WriteDummyString::register();
ReadStringMapper::register();
CountAccumulator::register();
ErrorAccumulator::register();
UnevenWorkMapper::register();
RemoteTaskGet::register();
RemoteTaskDBSize::register();

Status::Ok
}

Expand Down

0 comments on commit ae766a5

Please sign in to comment.