Skip to content

Commit ae766a5

Browse files
author
meir
committed
Added linkme to auto creation of register objects.
1 parent d11f43d commit ae766a5

File tree

5 files changed

+22
-20
lines changed

5 files changed

+22
-20
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ serde_json = "1.0"
1212
serde = "1.0"
1313
serde_derive = "1.0"
1414
libc = "0.2"
15+
linkme = "0.3"
1516

1617
[build-dependencies]
1718
bindgen = "0.59.2"

LibMRDerive/src/lib.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,27 @@
11
extern crate proc_macro;
22
use proc_macro::TokenStream;
33
use quote::quote;
4+
use quote::format_ident;
45
use syn;
56

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

12+
let func_name = format_ident!("register_{}", name.to_string().to_lowercase());
13+
1114
let gen = quote! {
1215
impl BaseObject for #name {
1316
fn get_name() -> &'static str {
1417
concat!(stringify!(#name), "\0")
1518
}
1619
}
20+
21+
#[linkme::distributed_slice(mr::libmr::REGISTER_LIST)]
22+
fn #func_name() {
23+
#name::register();
24+
}
1725
};
1826

1927
gen.into()

rust_api/libmr/mod.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55
*/
66

77
use crate::libmr_c_raw::bindings::{MRRecordType, MR_CalculateSlot, MR_Init, RedisModuleCtx};
8-
98
use redis_module::Context;
109

1110
use std::os::raw::c_char;
1211

12+
use linkme::distributed_slice;
13+
1314
pub mod accumulator;
1415
pub mod base_object;
1516
pub mod execution_builder;
@@ -20,6 +21,9 @@ pub mod reader;
2021
pub mod record;
2122
pub mod remote_task;
2223

24+
#[distributed_slice()]
25+
pub static REGISTER_LIST: [fn()] = [..];
26+
2327
impl Default for crate::libmr_c_raw::bindings::Record {
2428
fn default() -> Self {
2529
crate::libmr_c_raw::bindings::Record {
@@ -33,6 +37,10 @@ pub type RustMRError = String;
3337
pub fn mr_init(ctx: &Context, num_threads: usize) {
3438
unsafe { MR_Init(ctx.ctx as *mut RedisModuleCtx, num_threads) };
3539
record::init();
40+
41+
for register in REGISTER_LIST {
42+
register();
43+
}
3644
}
3745

3846
pub fn calc_slot(s: &[u8]) -> usize {

tests/mr_test_module/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ serde_derive = "1.0"
1616
libc = "0.2"
1717
lib_mr = { path = "../../" }
1818
lib_mr_derive = { path = "../../LibMRDerive/" }
19+
linkme = "0.3"
1920

2021
[build-dependencies]
2122
bindgen = "0.57"

tests/mr_test_module/src/lib.rs

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -848,28 +848,12 @@ impl Drop for KeysReader {
848848
fn init_func(ctx: &Context, _args: &Vec<RedisString>) -> Status {
849849
unsafe {
850850
DETACHED_CTX = RedisModule_GetDetachedThreadSafeContext.unwrap()(ctx.ctx);
851-
852-
mr_init(ctx, 3);
853851
}
854852

855-
StringRecord::register();
856-
IntRecord::register();
853+
mr_init(ctx, 3);
854+
857855
KeysReader::register();
858-
MaxIdleReader::register();
859-
ErrorReader::register();
860-
TypeMapper::register();
861-
ErrorMapper::register();
862-
DummyMapper::register();
863-
TypeFilter::register();
864-
DummyFilter::register();
865-
ErrorFilter::register();
866-
WriteDummyString::register();
867-
ReadStringMapper::register();
868-
CountAccumulator::register();
869-
ErrorAccumulator::register();
870-
UnevenWorkMapper::register();
871-
RemoteTaskGet::register();
872-
RemoteTaskDBSize::register();
856+
873857
Status::Ok
874858
}
875859

0 commit comments

Comments
 (0)