Mercurial > octave
changeset 23000:f981282a3bd0
move octave_dynamic_loader into octave namespace
* dynamic-ld.h, dynamic-ld.cc (dynamic_loader): Rename from
octave_dynamic_loader. Declare and define inside octave namespace.
Change all uses.
(dynamic_loader::shlibs_list): Rename from loaded_shlibs_list.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Thu, 05 Jan 2017 09:44:42 -0500 |
parents | f4781639f847 |
children | b69e39c3e200 |
files | libinterp/corefcn/dynamic-ld.cc libinterp/corefcn/dynamic-ld.h libinterp/octave-value/ov-dld-fcn.cc libinterp/octave-value/ov-mex-fcn.cc libinterp/parse-tree/oct-parse.in.yy |
diffstat | 5 files changed, 361 insertions(+), 356 deletions(-) [+] |
line wrap: on
line diff
--- a/libinterp/corefcn/dynamic-ld.cc Wed Jan 04 23:09:46 2017 -0500 +++ b/libinterp/corefcn/dynamic-ld.cc Thu Jan 05 09:44:42 2017 -0500 @@ -47,316 +47,316 @@ #define STRINGIFY(s) STRINGIFY1(s) #define STRINGIFY1(s) #s -void -octave_dynamic_loader::loaded_shlibs_list::append - (const octave::dynamic_library& shl) -{ - lib_list.push_back (shl); -} - -void -octave_dynamic_loader::loaded_shlibs_list::remove - (octave::dynamic_library& shl, - octave::dynamic_library::close_hook cl_hook) -{ - for (iterator p = lib_list.begin (); p != lib_list.end (); p++) - { - if (*p == shl) - { - // Erase first to avoid potentially invalidating the pointer by the - // following hooks. - lib_list.erase (p); - - shl.close (cl_hook); - - break; - } - } -} - -octave::dynamic_library -octave_dynamic_loader::loaded_shlibs_list::find_file (const std::string& file_name) const -{ - octave::dynamic_library retval; - - for (const auto& lib : lib_list) - { - if (lib.file_name () == file_name) - { - retval = lib; - break; - } - } - - return retval; -} - -void -octave_dynamic_loader::loaded_shlibs_list::display (void) const -{ - std::cerr << "current shared libraries:" << std::endl; - for (const auto& lib : lib_list) - std::cerr << " " << lib.file_name () << std::endl; -} - -octave_dynamic_loader *octave_dynamic_loader::instance = 0; - -bool octave_dynamic_loader::doing_load = false; - -bool -octave_dynamic_loader::instance_ok (void) -{ - bool retval = true; - - if (! instance) - { - instance = new octave_dynamic_loader (); - - if (instance) - singleton_cleanup_list::add (cleanup_instance); - } - - if (! instance) - error ("unable to create dynamic loader object!"); - - return retval; -} - -static void -do_clear_function (const std::string& fcn_name) -{ - warning_with_id ("Octave:reload-forces-clear", " %s", fcn_name.c_str ()); - - symbol_table::clear_dld_function (fcn_name); -} - -void -octave_dynamic_loader::do_clear (octave::dynamic_library& oct_file) -{ - if (oct_file.number_of_functions_loaded () > 1) - { - warning_with_id ("Octave:reload-forces-clear", - "reloading %s clears the following functions:", - oct_file.file_name ().c_str ()); - - loaded_shlibs.remove (oct_file, do_clear_function); - } - else - loaded_shlibs.remove (oct_file, symbol_table::clear_dld_function); -} - -octave_function * -octave_dynamic_loader::do_load_oct (const std::string& fcn_name, - const std::string& file_name, - bool relative) -{ - octave_function *retval = 0; - - octave::unwind_protect frame; - - frame.protect_var (octave_dynamic_loader::doing_load); - - doing_load = true; - - octave::dynamic_library oct_file = loaded_shlibs.find_file (file_name); - - if (oct_file && oct_file.is_out_of_date ()) - do_clear (oct_file); - - if (! oct_file) - { - oct_file.open (file_name); - - if (oct_file) - loaded_shlibs.append (oct_file); - } - - if (! oct_file) - error ("%s is not a valid shared library", file_name.c_str ()); - - void *function = oct_file.search (fcn_name, name_mangler); - - if (! function) - { - // FIXME: can we determine this C mangling scheme - // automatically at run time or configure time? - - function = oct_file.search (fcn_name, name_uscore_mangler); - } - - if (function) - { - octave_dld_fcn_getter f - = reinterpret_cast<octave_dld_fcn_getter> (function); - - retval = f (oct_file, relative); - - if (! retval) - error ("failed to install .oct file function '%s'", - fcn_name.c_str ()); - } - - return retval; -} - -octave_function * -octave_dynamic_loader::do_load_mex (const std::string& fcn_name, - const std::string& file_name, - bool /*relative*/) +namespace octave { - octave_function *retval = 0; - - octave::unwind_protect frame; - - frame.protect_var (octave_dynamic_loader::doing_load); - - doing_load = true; + void + dynamic_loader::shlibs_list::append (const dynamic_library& shl) + { + lib_list.push_back (shl); + } - octave::dynamic_library mex_file = loaded_shlibs.find_file (file_name); + void + dynamic_loader::shlibs_list::remove (dynamic_library& shl, + dynamic_library::close_hook cl_hook) + { + for (iterator p = lib_list.begin (); p != lib_list.end (); p++) + { + if (*p == shl) + { + // Erase first to avoid potentially invalidating the pointer by the + // following hooks. + lib_list.erase (p); - if (mex_file && mex_file.is_out_of_date ()) - do_clear (mex_file); + shl.close (cl_hook); - if (! mex_file) - { - mex_file.open (file_name); + break; + } + } + } + + dynamic_library + dynamic_loader::shlibs_list::find_file (const std::string& file_name) const + { + dynamic_library retval; - if (mex_file) - loaded_shlibs.append (mex_file); - } + for (const auto& lib : lib_list) + { + if (lib.file_name () == file_name) + { + retval = lib; + break; + } + } - if (! mex_file) - error ("%s is not a valid shared library", file_name.c_str ()); + return retval; + } - void *function = 0; + void + dynamic_loader::shlibs_list::display (void) const + { + std::cerr << "current shared libraries:" << std::endl; + for (const auto& lib : lib_list) + std::cerr << " " << lib.file_name () << std::endl; + } - bool have_fmex = false; + dynamic_loader *dynamic_loader::instance = 0; + + bool dynamic_loader::doing_load = false; - function = mex_file.search (fcn_name, mex_mangler); + bool + dynamic_loader::instance_ok (void) + { + bool retval = true; - if (! function) - { - // FIXME: can we determine this C mangling scheme - // automatically at run time or configure time? + if (! instance) + { + instance = new dynamic_loader (); - function = mex_file.search (fcn_name, mex_uscore_mangler); + if (instance) + singleton_cleanup_list::add (cleanup_instance); + } + + if (! instance) + error ("unable to create dynamic loader object!"); + + return retval; + } - if (! function) - { - function = mex_file.search (fcn_name, mex_f77_mangler); + void + dynamic_loader::do_clear_function (const std::string& fcn_name) + { + warning_with_id ("Octave:reload-forces-clear", " %s", fcn_name.c_str ()); + + symbol_table::clear_dld_function (fcn_name); + } + + void + dynamic_loader::do_clear (dynamic_library& oct_file) + { + if (oct_file.number_of_functions_loaded () > 1) + { + warning_with_id ("Octave:reload-forces-clear", + "reloading %s clears the following functions:", + oct_file.file_name ().c_str ()); - if (function) - have_fmex = true; - } - } + loaded_shlibs.remove (oct_file, do_clear_function); + } + else + loaded_shlibs.remove (oct_file, symbol_table::clear_dld_function); + } - if (function) - retval = new octave_mex_function (function, have_fmex, mex_file, fcn_name); - else - error ("failed to install .mex file function '%s'", fcn_name.c_str ()); + octave_function * + dynamic_loader::do_load_oct (const std::string& fcn_name, + const std::string& file_name, + bool relative) + { + octave_function *retval = 0; - return retval; -} + unwind_protect frame; + + frame.protect_var (dynamic_loader::doing_load); + + doing_load = true; + + dynamic_library oct_file = loaded_shlibs.find_file (file_name); -bool -octave_dynamic_loader::do_remove_oct (const std::string& fcn_name, - octave::dynamic_library& shl) -{ - bool retval = false; + if (oct_file && oct_file.is_out_of_date ()) + do_clear (oct_file); + + if (! oct_file) + { + oct_file.open (file_name); - // We don't need to do anything if this is called because we are in - // the process of reloading a .oct file that has changed. + if (oct_file) + loaded_shlibs.append (oct_file); + } + + if (! oct_file) + error ("%s is not a valid shared library", file_name.c_str ()); + + void *function = oct_file.search (fcn_name, name_mangler); - if (! doing_load) - { - retval = shl.remove (fcn_name); + if (! function) + { + // FIXME: can we determine this C mangling scheme + // automatically at run time or configure time? + + function = oct_file.search (fcn_name, name_uscore_mangler); + } - if (shl.number_of_functions_loaded () == 0) - loaded_shlibs.remove (shl); - } + if (function) + { + octave_dld_fcn_getter f + = reinterpret_cast<octave_dld_fcn_getter> (function); + + retval = f (oct_file, relative); - return retval; -} + if (! retval) + error ("failed to install .oct file function '%s'", + fcn_name.c_str ()); + } + + return retval; + } -bool -octave_dynamic_loader::do_remove_mex (const std::string& fcn_name, - octave::dynamic_library& shl) -{ - bool retval = false; + octave_function * + dynamic_loader::do_load_mex (const std::string& fcn_name, + const std::string& file_name, + bool /*relative*/) + { + octave_function *retval = 0; + + unwind_protect frame; + + frame.protect_var (dynamic_loader::doing_load); + + doing_load = true; + + dynamic_library mex_file = loaded_shlibs.find_file (file_name); - // We don't need to do anything if this is called because we are in - // the process of reloading a .oct file that has changed. + if (mex_file && mex_file.is_out_of_date ()) + do_clear (mex_file); + + if (! mex_file) + { + mex_file.open (file_name); - if (! doing_load) - { - retval = shl.remove (fcn_name); + if (mex_file) + loaded_shlibs.append (mex_file); + } - if (shl.number_of_functions_loaded () == 0) - loaded_shlibs.remove (shl); - } + if (! mex_file) + error ("%s is not a valid shared library", file_name.c_str ()); + + void *function = 0; + + bool have_fmex = false; + + function = mex_file.search (fcn_name, mex_mangler); - return retval; -} + if (! function) + { + // FIXME: can we determine this C mangling scheme + // automatically at run time or configure time? + + function = mex_file.search (fcn_name, mex_uscore_mangler); + + if (! function) + { + function = mex_file.search (fcn_name, mex_f77_mangler); + + if (function) + have_fmex = true; + } + } + + if (function) + retval = new octave_mex_function (function, have_fmex, mex_file, fcn_name); + else + error ("failed to install .mex file function '%s'", fcn_name.c_str ()); -octave_function * -octave_dynamic_loader::load_oct (const std::string& fcn_name, - const std::string& file_name, - bool relative) -{ - return (instance_ok ()) - ? instance->do_load_oct (fcn_name, file_name, relative) : 0; -} + return retval; + } + + bool + dynamic_loader::do_remove_oct (const std::string& fcn_name, + dynamic_library& shl) + { + bool retval = false; -octave_function * -octave_dynamic_loader::load_mex (const std::string& fcn_name, - const std::string& file_name, - bool relative) -{ - return (instance_ok ()) - ? instance->do_load_mex (fcn_name, file_name, relative) : 0; -} + // We don't need to do anything if this is called because we are in + // the process of reloading a .oct file that has changed. + + if (! doing_load) + { + retval = shl.remove (fcn_name); + + if (shl.number_of_functions_loaded () == 0) + loaded_shlibs.remove (shl); + } + + return retval; + } -bool -octave_dynamic_loader::remove_oct (const std::string& fcn_name, - octave::dynamic_library& shl) -{ - return (instance_ok ()) ? instance->do_remove_oct (fcn_name, shl) : false; -} + bool + dynamic_loader::do_remove_mex (const std::string& fcn_name, + dynamic_library& shl) + { + bool retval = false; + + // We don't need to do anything if this is called because we are in + // the process of reloading a .oct file that has changed. + + if (! doing_load) + { + retval = shl.remove (fcn_name); + + if (shl.number_of_functions_loaded () == 0) + loaded_shlibs.remove (shl); + } -bool -octave_dynamic_loader::remove_mex (const std::string& fcn_name, - octave::dynamic_library& shl) -{ - return (instance_ok ()) ? instance->do_remove_mex (fcn_name, shl) : false; -} + return retval; + } -std::string -octave_dynamic_loader::name_mangler (const std::string& name) -{ - return "G" + name; -} + octave_function * + dynamic_loader::load_oct (const std::string& fcn_name, + const std::string& file_name, + bool relative) + { + return (instance_ok ()) + ? instance->do_load_oct (fcn_name, file_name, relative) : 0; + } + + octave_function * + dynamic_loader::load_mex (const std::string& fcn_name, + const std::string& file_name, + bool relative) + { + return (instance_ok ()) + ? instance->do_load_mex (fcn_name, file_name, relative) : 0; + } -std::string -octave_dynamic_loader::name_uscore_mangler (const std::string& name) -{ - return "_G" + name; -} + bool + dynamic_loader::remove_oct (const std::string& fcn_name, + dynamic_library& shl) + { + return (instance_ok ()) ? instance->do_remove_oct (fcn_name, shl) : false; + } -std::string -octave_dynamic_loader::mex_mangler (const std::string&) -{ - return "mexFunction"; -} + bool + dynamic_loader::remove_mex (const std::string& fcn_name, + dynamic_library& shl) + { + return (instance_ok ()) ? instance->do_remove_mex (fcn_name, shl) : false; + } + + std::string + dynamic_loader::name_mangler (const std::string& name) + { + return "G" + name; + } -std::string -octave_dynamic_loader::mex_uscore_mangler (const std::string&) -{ - return "_mexFunction"; -} + std::string + dynamic_loader::name_uscore_mangler (const std::string& name) + { + return "_G" + name; + } + + std::string + dynamic_loader::mex_mangler (const std::string&) + { + return "mexFunction"; + } -std::string -octave_dynamic_loader::mex_f77_mangler (const std::string&) -{ - return STRINGIFY (F77_FUNC (mexfunction, MEXFUNCTION)); + std::string + dynamic_loader::mex_uscore_mangler (const std::string&) + { + return "_mexFunction"; + } + + std::string + dynamic_loader::mex_f77_mangler (const std::string&) + { + return STRINGIFY (F77_FUNC (mexfunction, MEXFUNCTION)); + } } -
--- a/libinterp/corefcn/dynamic-ld.h Wed Jan 04 23:09:46 2017 -0500 +++ b/libinterp/corefcn/dynamic-ld.h Thu Jan 05 09:44:42 2017 -0500 @@ -32,114 +32,119 @@ class octave_function; -class -octave_dynamic_loader +namespace octave { -private: - class - loaded_shlibs_list + dynamic_loader { - public: + private: + + class + shlibs_list + { + public: - typedef std::list<octave::dynamic_library>::iterator iterator; - typedef std::list<octave::dynamic_library>::const_iterator const_iterator; + typedef std::list<octave::dynamic_library>::iterator iterator; + typedef std::list<octave::dynamic_library>::const_iterator const_iterator; + + shlibs_list (void) : lib_list () { } + + ~shlibs_list (void) = default; + + void append (const octave::dynamic_library& shl); - loaded_shlibs_list (void) : lib_list () { } + void remove (octave::dynamic_library& shl, + octave::dynamic_library::close_hook cl_hook = 0); + + octave::dynamic_library find_file (const std::string& file_name) const; - ~loaded_shlibs_list (void) = default; + void display (void) const; - void append (const octave::dynamic_library& shl); + private: + + // No copying! - void remove (octave::dynamic_library& shl, - octave::dynamic_library::close_hook cl_hook = 0); + shlibs_list (const shlibs_list&) = delete; + + shlibs_list& operator = (const shlibs_list&) = delete; - octave::dynamic_library find_file (const std::string& file_name) const; + // List of libraries we have loaded. + std::list<octave::dynamic_library> lib_list; + }; - void display (void) const; + protected: - private: + dynamic_loader (void) : loaded_shlibs () { } + + public: // No copying! - loaded_shlibs_list (const loaded_shlibs_list&) = delete; - - loaded_shlibs_list& operator = (const loaded_shlibs_list&) = delete; + dynamic_loader (const dynamic_loader&) = delete; - // List of libraries we have loaded. - std::list<octave::dynamic_library> lib_list; - }; + dynamic_loader& operator = (const dynamic_loader&) = delete; + + virtual ~dynamic_loader (void) = default; -protected: - - octave_dynamic_loader (void) : loaded_shlibs () { } + static octave_function * + load_oct (const std::string& fcn_name, + const std::string& file_name = "", + bool relative = false); -public: - - // No copying! - - octave_dynamic_loader (const octave_dynamic_loader&) = delete; + static octave_function * + load_mex (const std::string& fcn_name, + const std::string& file_name = "", + bool relative = false); - octave_dynamic_loader& operator = (const octave_dynamic_loader&) = delete; - - virtual ~octave_dynamic_loader (void) = default; + static bool remove_oct (const std::string& fcn_name, + octave::dynamic_library& shl); - static octave_function * - load_oct (const std::string& fcn_name, - const std::string& file_name = "", - bool relative = false); + static bool remove_mex (const std::string& fcn_name, + octave::dynamic_library& shl); + + private: - static octave_function * - load_mex (const std::string& fcn_name, - const std::string& file_name = "", - bool relative = false); + static dynamic_loader *instance; + + static void cleanup_instance (void) { delete instance; instance = 0; } - static bool remove_oct (const std::string& fcn_name, - octave::dynamic_library& shl); + static bool instance_ok (void); - static bool remove_mex (const std::string& fcn_name, - octave::dynamic_library& shl); + static void do_clear_function (const std::string& fcn_name); -private: - - static octave_dynamic_loader *instance; + void do_clear (octave::dynamic_library& oct_file); - static void cleanup_instance (void) { delete instance; instance = 0; } - - static bool instance_ok (void); - - void do_clear (octave::dynamic_library& oct_file); + octave_function * + do_load_oct (const std::string& fcn_name, + const std::string& file_name = "", + bool relative = false); - octave_function * - do_load_oct (const std::string& fcn_name, - const std::string& file_name = "", - bool relative = false); + octave_function * + do_load_mex (const std::string& fcn_name, + const std::string& file_name = "", + bool relative = false); - octave_function * - do_load_mex (const std::string& fcn_name, - const std::string& file_name = "", - bool relative = false); + bool do_remove_oct (const std::string& fcn_name, octave::dynamic_library& shl); + + bool do_remove_mex (const std::string& fcn_name, octave::dynamic_library& shl); - bool do_remove_oct (const std::string& fcn_name, octave::dynamic_library& shl); + static bool doing_load; - bool do_remove_mex (const std::string& fcn_name, octave::dynamic_library& shl); + protected: - static bool doing_load; + shlibs_list loaded_shlibs; -protected: - - loaded_shlibs_list loaded_shlibs; + static std::string name_mangler (const std::string& name); - static std::string name_mangler (const std::string& name); + static std::string name_uscore_mangler (const std::string& name); - static std::string name_uscore_mangler (const std::string& name); + static std::string mex_mangler (const std::string& name); - static std::string mex_mangler (const std::string& name); + static std::string mex_uscore_mangler (const std::string& name); - static std::string mex_uscore_mangler (const std::string& name); - - static std::string mex_f77_mangler (const std::string& name); -}; + static std::string mex_f77_mangler (const std::string& name); + }; +} #endif
--- a/libinterp/octave-value/ov-dld-fcn.cc Wed Jan 04 23:09:46 2017 -0500 +++ b/libinterp/octave-value/ov-dld-fcn.cc Thu Jan 05 09:44:42 2017 -0500 @@ -54,7 +54,7 @@ octave_dld_function::~octave_dld_function (void) { - octave_dynamic_loader::remove_oct (my_name, sh_lib); + octave::dynamic_loader::remove_oct (my_name, sh_lib); } std::string
--- a/libinterp/octave-value/ov-mex-fcn.cc Wed Jan 04 23:09:46 2017 -0500 +++ b/libinterp/octave-value/ov-mex-fcn.cc Thu Jan 05 09:44:42 2017 -0500 @@ -62,7 +62,7 @@ if (exit_fcn_ptr) (*exit_fcn_ptr) (); - octave_dynamic_loader::remove_mex (my_name, sh_lib); + octave::dynamic_loader::remove_mex (my_name, sh_lib); } std::string
--- a/libinterp/parse-tree/oct-parse.in.yy Wed Jan 04 23:09:46 2017 -0500 +++ b/libinterp/parse-tree/oct-parse.in.yy Thu Jan 05 09:44:42 2017 -0500 @@ -4367,7 +4367,7 @@ if (autoload && ! fcn_name.empty ()) nm = fcn_name; - retval = octave_dynamic_loader::load_oct (nm, file, relative_lookup); + retval = octave::dynamic_loader::load_oct (nm, file, relative_lookup); } else if (len > 4 && file.substr (len-4, len-1) == ".mex") { @@ -4380,7 +4380,7 @@ autoload, autoload, relative_lookup, ""); - retval = octave_dynamic_loader::load_mex (nm, file, relative_lookup); + retval = octave::dynamic_loader::load_mex (nm, file, relative_lookup); if (tmpfcn) retval->document (tmpfcn->doc_string ());