SNode.C
Loading...
Searching...
No Matches
core::DynamicLoader Class Reference

#include <DynamicLoader.h>

Collaboration diagram for core::DynamicLoader:

Classes

struct  Library
 

Public Member Functions

 DynamicLoader ()=delete
 
 ~DynamicLoader ()=delete
 

Static Public Member Functions

static void * dlRegisterHandle (void *handle, const std::string &libFile)
 
static void dlCloseDelayed (void *handle)
 
static int dlClose (void *handle)
 
static void * dlSym (void *handle, const std::string &symbol)
 
static char * dlError ()
 

Static Private Member Functions

static int dlClose (const Library &library)
 
static int realExecDlClose (const Library &library)
 
static void execDlCloseDeleyed ()
 
static void execDlCloseAll ()
 

Static Private Attributes

static std::map< void *, LibrarydlOpenedLibraries
 
static std::list< void * > closeHandles
 

Friends

class EventLoop
 
class EventMultiplexer
 

Detailed Description

Definition at line 35 of file DynamicLoader.h.

Constructor & Destructor Documentation

◆ DynamicLoader()

core::DynamicLoader::DynamicLoader ( )
delete

◆ ~DynamicLoader()

core::DynamicLoader::~DynamicLoader ( )
delete

Member Function Documentation

◆ dlClose() [1/2]

int core::DynamicLoader::dlClose ( const Library & library)
staticprivate

Definition at line 97 of file DynamicLoader.cpp.

97 {
98 int ret = 0;
99 ret = realExecDlClose(library);
100
101 if (ret != 0) {
102 LOG(TRACE) << " dlClose: " << DynamicLoader::dlError();
103 } else {
104 LOG(TRACE) << " dlClose: " << library.fileName << ": success";
105 }
106
107 return ret;
108 }
static char * dlError()
static int realExecDlClose(const Library &library)

◆ dlClose() [2/2]

int core::DynamicLoader::dlClose ( void * handle)
static

Definition at line 67 of file DynamicLoader.cpp.

67 {
68 int ret = 0;
69
70 if (handle != nullptr) {
71 if (dlOpenedLibraries.contains(handle)) {
72 ret = dlClose(dlOpenedLibraries[handle]);
73
74 dlOpenedLibraries.erase(handle);
75 } else {
76 LOG(TRACE) << "DynLoader: dlCloseDelayed: " << handle << ": not opened using dlOpen";
77 }
78 } else {
79 LOG(TRACE) << "DynLoader: dlClose handle: nullptr";
80 }
81
82 return ret;
83 }
static int dlClose(void *handle)
static std::map< void *, Library > dlOpenedLibraries

◆ dlCloseDelayed()

void core::DynamicLoader::dlCloseDelayed ( void * handle)
static

Definition at line 49 of file DynamicLoader.cpp.

49 {
50 if (handle != nullptr) {
51 if (dlOpenedLibraries.contains(handle)) {
52 if (std::find(closeHandles.begin(), closeHandles.end(), handle) == closeHandles.end()) {
53 LOG(TRACE) << "DynLoader: dlCloseDelayed: " << dlOpenedLibraries[handle].fileName;
54
55 closeHandles.push_back(handle);
56 } else {
57 LOG(TRACE) << "DynLoader: dlCloseDelayed: " << dlOpenedLibraries[handle].fileName << ": already registered: ";
58 }
59 } else {
60 LOG(TRACE) << "DynLoader: dlCloseDelayed: " << handle << ": not opened using dlOpen";
61 }
62 } else {
63 LOG(TRACE) << "DynLoader: dlCloseDelayed: handle is nullptr";
64 }
65 }
static std::list< void * > closeHandles

◆ dlError()

char * core::DynamicLoader::dlError ( )
static

Definition at line 89 of file DynamicLoader.cpp.

89 {
90 return core::system::dlerror();
91 }
char * dlerror()
Definition dlfcn.cpp:45

◆ dlRegisterHandle()

void * core::DynamicLoader::dlRegisterHandle ( void * handle,
const std::string & libFile )
static

Definition at line 35 of file DynamicLoader.cpp.

35 {
36 if (handle != nullptr) {
37 if (!dlOpenedLibraries.contains(handle)) {
38 dlOpenedLibraries[handle].fileName = libFile;
39 dlOpenedLibraries[handle].handle = handle;
40 }
41 LOG(TRACE) << "DynLoader: dlOpen: " << libFile << ": success";
42 } else {
43 LOG(TRACE) << "DynLoader: dlOpen: " << DynamicLoader::dlError();
44 }
45
46 return handle;
47 }

◆ dlSym()

void * core::DynamicLoader::dlSym ( void * handle,
const std::string & symbol )
static

Definition at line 85 of file DynamicLoader.cpp.

85 {
86 return core::system::dlsym(handle, symbol.c_str());
87 }
void * dlsym(void *handle, const char *symbol)
Definition dlfcn.cpp:40

◆ execDlCloseAll()

void core::DynamicLoader::execDlCloseAll ( )
staticprivate

Definition at line 125 of file DynamicLoader.cpp.

125 {
126 LOG(TRACE) << "DynLoader: execDlCloseAll";
127
128 for (auto& [handle, library] : dlOpenedLibraries) {
129 dlClose(library);
130 }
131
132 dlOpenedLibraries.clear();
133 closeHandles.clear();
134
135 LOG(TRACE) << "DynLoader: execDlCloseAll done";
136 }

◆ execDlCloseDeleyed()

void core::DynamicLoader::execDlCloseDeleyed ( )
staticprivate

Definition at line 110 of file DynamicLoader.cpp.

110 {
111 if (!closeHandles.empty()) {
112 LOG(TRACE) << "DynLoader: execDlCloseDeleyed";
113
114 for (void* handle : closeHandles) {
115 dlClose(dlOpenedLibraries[handle]);
116 dlOpenedLibraries.erase(handle);
117 }
118
119 closeHandles.clear();
120
121 LOG(TRACE) << "DynLoader: execDlCloseDeleyed done";
122 }
123 }

Referenced by core::EventMultiplexer::releaseExpiredResources().

Here is the caller graph for this function:

◆ realExecDlClose()

int core::DynamicLoader::realExecDlClose ( const Library & library)
staticprivate

Definition at line 93 of file DynamicLoader.cpp.

93 {
94 return core::system::dlclose(library.handle);
95 }
int dlclose(void *handle)
Definition dlfcn.cpp:35

Friends And Related Symbol Documentation

◆ EventLoop

friend class EventLoop
friend

Definition at line 64 of file DynamicLoader.h.

◆ EventMultiplexer

friend class EventMultiplexer
friend

Definition at line 65 of file DynamicLoader.h.

Member Data Documentation

◆ closeHandles

std::list< void * > core::DynamicLoader::closeHandles
staticprivate

Definition at line 62 of file DynamicLoader.h.

◆ dlOpenedLibraries

std::map< void *, DynamicLoader::Library > core::DynamicLoader::dlOpenedLibraries
staticprivate

Definition at line 61 of file DynamicLoader.h.


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