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

#include <MetatomicLoader.h>

Inheritance diagram for eonc::MetatomicLoader:

Public Member Functions

bool try_load ()
 Attempt (re)load if not yet successful. Safe after potentials_path inject.
bool is_loaded () const noexcept override
void require_loaded () override
 Load on first use, then throw if libmetatomic_pot is not available.
 ~MetatomicLoader () override
 MetatomicLoader (const MetatomicLoader &)=delete
MetatomicLoader & operator= (const MetatomicLoader &)=delete
Public Member Functions inherited from eonc::IMetatomicLoader
virtual ~IMetatomicLoader ()=default
 IMetatomicLoader (const IMetatomicLoader &)=delete
IMetatomicLoader & operator= (const IMetatomicLoader &)=delete

Static Public Member Functions

static MetatomicLoader & instance ()
 Thread-safe singleton accessor (Meyer's pattern). Does not dlopen.

Private Member Functions

 MetatomicLoader ()=default

Private Attributes

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

Friends

class Runtime

Additional Inherited Members

Public Types inherited from eonc::IMetatomicLoader
using create_fn = EonMtaPot *(*)(const EonMtaConfig *, char *, size_t)
using destroy_fn = void (*)(EonMtaPot *)
using force_fn
using abi_version_fn = int (*)(void)
Public Attributes inherited from eonc::IMetatomicLoader
create_fn create {nullptr}
destroy_fn destroy {nullptr}
force_fn force {nullptr}
abi_version_fn abi_version {nullptr}
Protected Member Functions inherited from eonc::IMetatomicLoader
 IMetatomicLoader ()=default

Detailed Description

Definition at line 49 of file MetatomicLoader.h.

Constructor & Destructor Documentation

◆ ~MetatomicLoader()

eonc::MetatomicLoader::~MetatomicLoader ( )
override

Definition at line 106 of file MetatomicLoader.cpp.

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

◆ MetatomicLoader() [1/2]

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

◆ MetatomicLoader() [2/2]

eonc::MetatomicLoader::MetatomicLoader ( )
privatedefault

Member Function Documentation

◆ instance()

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

Thread-safe singleton accessor (Meyer's pattern). Does not dlopen.

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
inlinenodiscardoverridevirtualnoexcept

Implements eonc::IMetatomicLoader.

Definition at line 57 of file MetatomicLoader.h.

57{ return m_loaded; }

◆ operator=()

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

◆ require_loaded()

void eonc::MetatomicLoader::require_loaded ( )
overridevirtual

Load on first use, then throw if libmetatomic_pot is not available.

Implements eonc::IMetatomicLoader.

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

◆ Runtime

friend class Runtime
friend

Definition at line 68 of file MetatomicLoader.h.

Member Data Documentation

◆ m_handle

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

Definition at line 71 of file MetatomicLoader.h.

71{};

◆ m_loaded

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

Definition at line 70 of file MetatomicLoader.h.

70{false};

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