Loading...
Searching...
No Matches
eonc::MetatomicLoader Class Reference

#include <MetatomicLoader.h>

Public Types

using create_fn = EonMtaPot *(*)(const EonMtaConfig *, char *, size_t)
using destroy_fn = void (*)(EonMtaPot *)
using force_fn
using abi_version_fn = int (*)(void)

Public Member Functions

bool try_load ()
 Attempt (re)load if not yet successful. Safe after potentials_path inject.
bool is_loaded () const noexcept
void require_loaded ()
 MetatomicLoader (const MetatomicLoader &)=delete
MetatomicLoaderoperator= (const MetatomicLoader &)=delete

Static Public Member Functions

static MetatomicLoaderinstance ()

Public Attributes

create_fn create {nullptr}
destroy_fn destroy {nullptr}
force_fn force {nullptr}
abi_version_fn abi_version {nullptr}

Private Member Functions

 MetatomicLoader ()=default
 ~MetatomicLoader ()

Private Attributes

bool m_loaded {false}
dynlib::Handle m_handle {}

Detailed Description

Definition at line 18 of file MetatomicLoader.h.

Member Typedef Documentation

◆ abi_version_fn

Definition at line 24 of file MetatomicLoader.h.

◆ create_fn

using eonc::MetatomicLoader::create_fn = EonMtaPot *(*)(const EonMtaConfig *, char *, size_t)

Definition at line 20 of file MetatomicLoader.h.

◆ destroy_fn

Definition at line 21 of file MetatomicLoader.h.

◆ force_fn

Initial value:
int (*)(EonMtaPot *, long, const double *, const int *,
double *, double *, double *, const double *)

Definition at line 22 of file MetatomicLoader.h.

Constructor & Destructor Documentation

◆ MetatomicLoader() [1/2]

eonc::MetatomicLoader::MetatomicLoader ( const MetatomicLoader & )
delete

◆ MetatomicLoader() [2/2]

eonc::MetatomicLoader::MetatomicLoader ( )
privatedefault

◆ ~MetatomicLoader()

eonc::MetatomicLoader::~MetatomicLoader ( )
private

Definition at line 106 of file MetatomicLoader.cpp.

dynlib::Handle m_handle
void close(Handle h) noexcept
Definition DynLib.h:77

Member Function Documentation

◆ instance()

MetatomicLoader & eonc::MetatomicLoader::instance ( )
static

Definition at line 19 of file MetatomicLoader.cpp.

19 {
20 static MetatomicLoader loader;
21 return loader;
22}
MetatomicLoader(const MetatomicLoader &)=delete

◆ is_loaded()

bool eonc::MetatomicLoader::is_loaded ( ) const
inlinenodiscardnoexcept

Definition at line 31 of file MetatomicLoader.h.

31{ return m_loaded; }

◆ operator=()

MetatomicLoader & eonc::MetatomicLoader::operator= ( const MetatomicLoader & )
delete

◆ require_loaded()

void eonc::MetatomicLoader::require_loaded ( )

Definition at line 108 of file MetatomicLoader.cpp.

108 {
109 if (!try_load()) {
110 throw std::runtime_error(
111 "Metatomic potential requested but libmetatomic_pot.so not found or "
112 "ABI mismatch.\n"
113 "Build with -Dwith_metatomic=true and put the plugin on "
114 "LD_LIBRARY_PATH / EON_POTENTIALS_PATH / [Potential] potentials_path.");
115 }
116}
bool try_load()
Attempt (re)load if not yet successful. Safe after potentials_path inject.

◆ try_load()

bool eonc::MetatomicLoader::try_load ( )

Attempt (re)load if not yet successful. Safe after potentials_path inject.

Definition at line 24 of file MetatomicLoader.cpp.

24 {
25 if (m_loaded)
26 return true;
27
28#ifdef _WIN32
29 const char *candidates[] = {"metatomic_pot.dll", "libmetatomic_pot.dll",
30 nullptr};
31#elif defined(__APPLE__)
32 const char *candidates[] = {"libmetatomic_pot.dylib", "libmetatomic_pot.so",
33 nullptr};
34#else
35 const char *candidates[] = {"libmetatomic_pot.so", nullptr};
36#endif
37
38 // RTLD_GLOBAL without DEEPBIND so MetatomicPotential's Potential/PotRegistry
39 // symbols bind to the already-loaded host libeonclib (single registry).
40 auto open_mta = [](const char *name) -> dynlib::Handle {
41#if defined(__linux__)
42 return ::dlopen(name, RTLD_NOW | RTLD_GLOBAL);
43#elif defined(_WIN32)
44 return dynlib::open(name);
45#else
46 return ::dlopen(name, RTLD_NOW | RTLD_GLOBAL);
47#endif
48 };
49
50 for (const char **p = candidates; *p; ++p) {
51 m_handle = open_mta(*p);
52 if (m_handle)
53 break;
54 }
55 if (!m_handle) {
56 for (const auto &dir : PluginLoader::instance().search_paths()) {
57 for (const char **p = candidates; *p; ++p) {
58 std::string full = dir;
59 if (!full.empty() && full.back() != '/' && full.back() != '\\')
60 full += '/';
61 full += *p;
62 m_handle = open_mta(full.c_str());
63 if (m_handle)
64 break;
65 }
66 if (m_handle)
67 break;
68 }
69 }
70 if (!m_handle)
71 return false;
72
73 create = dynlib::loadSym<create_fn>(m_handle, "eon_mta_pot_create");
74 destroy = dynlib::loadSym<destroy_fn>(m_handle, "eon_mta_pot_destroy");
75 force = dynlib::loadSym<force_fn>(m_handle, "eon_mta_pot_force");
77 dynlib::loadSym<abi_version_fn>(m_handle, "eon_mta_abi_version");
78
79 if (!create || !destroy || !force || !abi_version) {
80 std::cerr << "[Metatomic] libmetatomic_pot loaded but missing C ABI "
81 "symbols\n";
83 m_handle = {};
84 create = nullptr;
85 destroy = nullptr;
86 force = nullptr;
87 abi_version = nullptr;
88 return false;
89 }
90 const int ver = abi_version();
91 if (ver != EON_MTA_ABI_VERSION) {
92 std::cerr << "[Metatomic] ABI version mismatch: library=" << ver
93 << " host=" << EON_MTA_ABI_VERSION << "\n";
95 m_handle = {};
96 create = nullptr;
97 destroy = nullptr;
98 force = nullptr;
99 abi_version = nullptr;
100 return false;
101 }
102 m_loaded = true;
103 return true;
104}
#define EON_MTA_ABI_VERSION
abi_version_fn abi_version
static PluginLoader & instance()
Thread-safe singleton accessor (Meyer's pattern).
void * Handle
Definition DynLib.h:60
Handle open(const char *name) noexcept
Definition DynLib.h:62
Fn loadSym(Handle h, const char *name) noexcept
Load a symbol and cast to a function pointer type.
Definition DynLib.h:99

Member Data Documentation

◆ abi_version

abi_version_fn eonc::MetatomicLoader::abi_version {nullptr}

Definition at line 37 of file MetatomicLoader.h.

37{nullptr};

◆ create

create_fn eonc::MetatomicLoader::create {nullptr}

Definition at line 34 of file MetatomicLoader.h.

34{nullptr};

◆ destroy

destroy_fn eonc::MetatomicLoader::destroy {nullptr}

Definition at line 35 of file MetatomicLoader.h.

35{nullptr};

◆ force

force_fn eonc::MetatomicLoader::force {nullptr}

Definition at line 36 of file MetatomicLoader.h.

36{nullptr};

◆ m_handle

dynlib::Handle eonc::MetatomicLoader::m_handle {}
private

Definition at line 47 of file MetatomicLoader.h.

47{};

◆ m_loaded

bool eonc::MetatomicLoader::m_loaded {false}
private

Definition at line 46 of file MetatomicLoader.h.

46{false};

The documentation for this class was generated from the following files: