Skip to content
Snippets Groups Projects
Commit 41733bda authored by Georgy Moshkin's avatar Georgy Moshkin :speech_balloon: Committed by Maksim Kaitmazian
Browse files

fix: don't allow multiple service restrar functions per plugin dynlib

parent b489cf13
No related branches found
No related tags found
1 merge request!1206fix: don't allow multiple service registrar functions per plugin dynlib
Pipeline #48289 passed
......@@ -2591,7 +2591,6 @@ version = "0.1.0"
dependencies = [
"abi_stable",
"gensym",
"linkme 0.3.26",
"log",
"picoplugin_gen",
"reqwest",
......
......@@ -8,7 +8,6 @@ license-file = "./../LICENSE"
crate-type = ["lib"]
[dependencies]
linkme = "0.3.14"
gensym = "0.1.0"
abi_stable = "0.11.2"
picoplugin_gen = { path = "../picoplugin_gen" }
......
use crate::util::FfiSafeStr;
use abi_stable::std_types::{RBox, RHashMap, ROk, RString, RVec};
use abi_stable::{sabi_trait, RTuple, StableAbi};
use linkme::distributed_slice;
use std::error::Error;
use std::fmt::Display;
......@@ -334,14 +333,7 @@ pub type ServiceBox = ServiceStable_TO<'static, RBox<()>>;
// ---------------------------- Registrar ----------------------------------------------
/// List of registrar functions.
#[distributed_slice]
pub static REGISTRARS: [extern "C" fn(registry: &mut ServiceRegistry)] = [..];
#[no_mangle]
extern "C" fn registrars() -> RSlice<'static, extern "C" fn(registry: &mut ServiceRegistry)> {
RSlice::from_slice(&REGISTRARS)
}
pub type FnServiceRegistrar = extern "C" fn(registry: &mut ServiceRegistry);
/// The reason for the existence of this trait is that [`abi_stable`] crate doesn't support
/// closures.
......
pub use crate::plugin::interface::PicoContext;
pub use crate::plugin::interface::Service;
pub use crate::plugin::interface::ServiceRegistry;
pub use linkme;
pub use picoplugin_gen::proc_service_registrar as service_registrar;
pub use tarantool;
......@@ -48,10 +48,11 @@ pub fn proc_service_registrar(_attr: TokenStream, input: TokenStream) -> TokenSt
// embeds function for check input argument
quote! {
#[linkme::distributed_slice(picoplugin::plugin::interface::REGISTRARS)]
extern "C" fn #ident(registry: &mut picoplugin::plugin::interface::ServiceRegistry) {
#[export_name = "pico_service_registrar"]
pub extern "C" fn #ident(registry: &mut picoplugin::plugin::interface::ServiceRegistry) {
#[inline(always)]
fn #inner_fn_name (#inputs) {
#block
#block
}
#inner_fn_name(registry)
......
......@@ -16,6 +16,7 @@ use crate::{tlog, traft, warn_or_panic};
use abi_stable::derive_macro_reexports::{RErr, RResult, RSlice};
use picoplugin::background::{Error, InternalGlobalWorkerManager, ServiceId};
use picoplugin::metrics::InternalGlobalMetricsCollection;
use picoplugin::plugin::interface::FnServiceRegistrar;
use picoplugin::plugin::interface::{PicoContext, ServiceRegistry};
use picoplugin::util::DisplayErrorLocation;
use std::collections::HashMap;
......@@ -129,13 +130,8 @@ impl PluginManager {
// fill registry with factories
let mut registry = ServiceRegistry::default();
type FnRegistrars =
fn() -> RSlice<'static, extern "C" fn(registry: &mut ServiceRegistry)>;
let make_registrars = unsafe { lib.get::<FnRegistrars>("registrars")? };
let service_registrars = make_registrars();
service_registrars.iter().for_each(|registrar| {
registrar(&mut registry);
});
let registrar = unsafe { lib.get::<FnServiceRegistrar>("pico_service_registrar")? };
registrar(&mut registry);
tlog!(
Info,
......
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