26#if defined (HAVE_CONFIG_H)
49#define STRINGIFY(s) STRINGIFY1(s)
50#define STRINGIFY1(s) #s
57 m_lib_list.push_back (shl);
63 std::list<std::string> removed_fcns;
65 for (
auto p = m_lib_list.begin (); p != m_lib_list.end (); p++)
71 removed_fcns = shl.
close ();
81dynamic_loader::shlibs_list::find_file (
const std::string& file_name)
const
85 for (
const auto& lib : m_lib_list)
87 if (lib.file_name () == file_name)
98dynamic_loader::shlibs_list::display ()
const
100 std::cerr <<
"current shared libraries:" << std::endl;
101 for (
const auto& lib : m_lib_list)
102 std::cerr <<
" " << lib.file_name () << std::endl;
106dynamic_loader::clear_function (
const std::string& fcn_name)
108 warning_with_id (
"Octave:reload-forces-clear",
" %s", fcn_name.c_str ());
125 "reloading %s clears the following functions:",
128 std::list<std::string> removed_fcns = m_loaded_shlibs.remove (oct_file);
130 for (
const auto& fcn_name : removed_fcns)
131 clear_function (fcn_name);
135 std::list<std::string> removed_fcns = m_loaded_shlibs.remove (oct_file);
143 for (
const auto& fcn_name : removed_fcns)
144 symtab.clear_dld_function (fcn_name);
150 const std::string& file_name,
164 oct_file.
open (file_name);
167 m_loaded_shlibs.append (oct_file);
171 error (
"%s is not a valid shared library", file_name.c_str ());
173 void *function = oct_file.
search (fcn_name, name_mangler);
180 function = oct_file.
search (fcn_name, name_uscore_mangler);
188 retval =
f (oct_file, relative);
191 error (
"failed to install .oct file function '%s'",
200 const std::string& fcn_name)
205 void *function = mex_file.
search (fcn_name, mex_mangler);
212 function = mex_file.
search (fcn_name, mex_uscore_mangler);
220 const std::string& file_name,
232 mex_file.
open (file_name);
235 m_loaded_shlibs.append (mex_file);
239 error (
"%s is not a valid shared library", file_name.c_str ());
241 void *function = try_load_mex (mex_file, fcn_name);
244 error (
"failed to install .mex file function '%s'", fcn_name.c_str ());
246 void *symbol = mex_file.
search (
"__mx_has_interleaved_complex__");
248 bool interleaved = symbol !=
nullptr;
251 mex_file.
remove (
"__mx_has_interleaved_complex__");
254 reinterpret_cast<int *
> (mex_file.
search (
"__octave_mex_soversion__"));
257 error (
"No SOVERSION found in .mex file function '%s'.\n"
258 " This can lead to incorrect results or other failures.\n"
259 " You can fix this problem by recompiling this .mex file",
263 ([&mex_file] () { mex_file.
remove (
"__octave_mex_soversion__"); });
265 if (*mex_soversion != OCTAVE_MEX_SOVERSION)
266 error (
"SOVERSION %d found in .mex file function '%s'\n"
267 " does not match the running Octave (SOVERSION %d).\n"
268 " This can lead to incorrect results or other failures.\n"
269 " You can fix this problem by recompiling this .mex file",
270 *mex_soversion, fcn_name.c_str (), OCTAVE_MEX_SOVERSION);
286 retval = shl.
remove (fcn_name);
289 m_loaded_shlibs.remove (shl);
304dynamic_loader::name_mangler (
const std::string& name)
310dynamic_loader::name_uscore_mangler (
const std::string& name)
316dynamic_loader::mex_mangler (
const std::string&)
318 return "mexFunction";
322dynamic_loader::mex_uscore_mangler (
const std::string&)
324 return "_mexFunction";
327OCTAVE_END_NAMESPACE(octave)
void open(const std::string &f)
std::string file_name() const
bool is_out_of_date() const
void * search(const std::string &nm, const name_mangler &mangler=name_mangler()) const
std::list< std::string > close()
std::size_t number_of_functions_loaded() const
bool remove(const std::string &name)
bool remove_oct(const std::string &fcn_name, dynamic_library &shl)
bool remove_mex(const std::string &fcn_name, dynamic_library &shl)
octave_function * load_oct(const std::string &fcn_name, const std::string &file_name="", bool relative=false)
octave_function * load_mex(const std::string &fcn_name, const std::string &file_name="", bool relative=false)
symbol_table & get_symbol_table()
void clear_dld_function(const std::string &name)
OCTAVE_BEGIN_NAMESPACE(octave) static octave_value daspk_fcn
octave_function *(* octave_dld_fcn_getter)(const octave::dynamic_library &, bool relative)
void warning_with_id(const char *id, const char *fmt,...)
void error(const char *fmt,...)
F77_RET_T const F77_DBLE const F77_DBLE * f