Mercurial > octave
annotate liboctave/util/oct-shlib.cc @ 28175:b895daca20e2 stable
Avoid potential lifetime issues with temporary std::wstring objects.
* sysdep.cc (F__open_with_system_app__, get_regkey_value, get_regkey_names),
file-ops.cc (rename), lo-sysdep.cc (get_dirlist, fopen, getenv_wrapper),
oct-shlib.cc (octave_w32_shlib): Explicitly create std::wstring object with
well-defined lifetime when passing the pointer to the underlying c_str to a
function.
author | Markus Mützel <markus.muetzel@gmx.de> |
---|---|
date | Fri, 27 Mar 2020 08:52:33 +0100 |
parents | b3701ea5a48d |
children | 0a5b15007766 |
rev | line source |
---|---|
27923
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
1 //////////////////////////////////////////////////////////////////////// |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
2 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
3 // Copyright (C) 1999-2020 The Octave Project Developers |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
4 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
5 // See the file COPYRIGHT.md in the top-level directory of this |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
6 // distribution or <https://octave.org/copyright/>. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
7 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
8 // This file is part of Octave. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
9 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
10 // Octave is free software: you can redistribute it and/or modify it |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
11 // under the terms of the GNU General Public License as published by |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
12 // the Free Software Foundation, either version 3 of the License, or |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
13 // (at your option) any later version. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
14 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
15 // Octave is distributed in the hope that it will be useful, but |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
16 // WITHOUT ANY WARRANTY; without even the implied warranty of |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
18 // GNU General Public License for more details. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
19 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
20 // You should have received a copy of the GNU General Public License |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
21 // along with Octave; see the file COPYING. If not, see |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
22 // <https://www.gnu.org/licenses/>. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
23 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
24 //////////////////////////////////////////////////////////////////////// |
3326 | 25 |
21724
aba2e6293dd8
use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents:
21661
diff
changeset
|
26 #if defined (HAVE_CONFIG_H) |
21301
40de9f8f23a6
Use '#include "config.h"' rather than <config.h>.
Rik <rik@octave.org>
parents:
21236
diff
changeset
|
27 # include "config.h" |
3326 | 28 #endif |
29 | |
7749
14e05160b99f
reference counting for functions loaded from shared libraries
John W. Eaton <jwe@octave.org>
parents:
7520
diff
changeset
|
30 #include <map> |
14e05160b99f
reference counting for functions loaded from shared libraries
John W. Eaton <jwe@octave.org>
parents:
7520
diff
changeset
|
31 |
3326 | 32 extern "C" |
33 { | |
4110 | 34 #if defined (HAVE_DLOPEN_API) |
21202
f7121e111991
maint: indent #ifdef blocks in liboctave and src directories.
Rik <rik@octave.org>
parents:
21136
diff
changeset
|
35 # if defined (HAVE_DLFCN_H) |
f7121e111991
maint: indent #ifdef blocks in liboctave and src directories.
Rik <rik@octave.org>
parents:
21136
diff
changeset
|
36 # include <dlfcn.h> |
f7121e111991
maint: indent #ifdef blocks in liboctave and src directories.
Rik <rik@octave.org>
parents:
21136
diff
changeset
|
37 # else |
23446
cd4e1ee28716
maint: Use convention 'void * fcn ()' for functions which return pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
38 extern void * dlopen (const char *, int); |
cd4e1ee28716
maint: Use convention 'void * fcn ()' for functions which return pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
39 extern const char * dlerror (void); |
cd4e1ee28716
maint: Use convention 'void * fcn ()' for functions which return pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
40 extern void * dlsym (void *, const char *); |
3326 | 41 extern int dlclose (void *); |
21202
f7121e111991
maint: indent #ifdef blocks in liboctave and src directories.
Rik <rik@octave.org>
parents:
21136
diff
changeset
|
42 # endif |
5451 | 43 #elif defined (HAVE_LOADLIBRARY_API) |
21213
f7d1050b9b53
maint: Clean up various usages of #ifdef.
Rik <rik@octave.org>
parents:
21202
diff
changeset
|
44 # define WIN32_LEAN_AND_MEAN 1 |
21202
f7121e111991
maint: indent #ifdef blocks in liboctave and src directories.
Rik <rik@octave.org>
parents:
21136
diff
changeset
|
45 # include <windows.h> |
24653
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
46 # include <psapi.h> |
3326 | 47 #endif |
48 } | |
49 | |
22146
ef91e43f162a
set DLL directory when loading DLLs on Windows systems (bug #48511)
John W. Eaton <jwe@octave.org>
parents:
21942
diff
changeset
|
50 #include "file-ops.h" |
3326 | 51 #include "file-stat.h" |
52 #include "lo-error.h" | |
53 #include "oct-shlib.h" | |
54 #include "str-vec.h" | |
55 | |
25524
366d4b8f6668
Fix loading of shared libraries from paths with non-ASCII chars on Windows (bug #49118).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25103
diff
changeset
|
56 #if defined (HAVE_LOADLIBRARY_API) |
366d4b8f6668
Fix loading of shared libraries from paths with non-ASCII chars on Windows (bug #49118).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25103
diff
changeset
|
57 # include "lo-sysdep.h" |
366d4b8f6668
Fix loading of shared libraries from paths with non-ASCII chars on Windows (bug #49118).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25103
diff
changeset
|
58 #endif |
366d4b8f6668
Fix loading of shared libraries from paths with non-ASCII chars on Windows (bug #49118).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25103
diff
changeset
|
59 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
60 namespace octave |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
61 { |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
62 dynamic_library::dynlib_rep::dynlib_rep (const std::string& f) |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
63 : m_count (1), m_fcn_names (), m_file (f), m_time_loaded (), |
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
64 m_search_all_loaded (false) |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
65 { |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
66 s_instances[f] = this; |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
67 |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
68 if (is_out_of_date ()) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
69 (*current_liboctave_warning_with_id_handler) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
70 ("Octave:warn-future-time-stamp", |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
71 "timestamp on file %s is in the future", m_file.c_str ()); |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
72 } |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
73 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
74 bool |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
75 dynamic_library::dynlib_rep::is_out_of_date (void) const |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
76 { |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
77 sys::file_stat fs (m_file); |
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
78 return (fs && fs.is_newer (m_time_loaded)); |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
79 } |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
80 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
81 void |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
82 dynamic_library::dynlib_rep::fake_reload (void) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
83 { |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
84 // We can't actually reload the library, but we'll pretend we did. |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
85 sys::file_stat fs (m_file); |
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
86 if (fs && fs.is_newer (m_time_loaded)) |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
87 { |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
88 m_time_loaded = fs.mtime (); |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
89 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
90 (*current_liboctave_warning_with_id_handler) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
91 ("Octave:library-reload", |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
92 "library %s not reloaded due to existing references", m_file.c_str ()); |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
93 } |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
94 } |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
95 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
96 dynamic_library::dynlib_rep * |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
97 dynamic_library::dynlib_rep::get_instance (const std::string& f, bool fake) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
98 { |
23457
21baad6b35c4
maint: Use C++11 nullptr rather than 0 or NULL when possible.
Rik <rik@octave.org>
parents:
23446
diff
changeset
|
99 dynlib_rep *retval = nullptr; |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
100 std::map<std::string, dynlib_rep *>::iterator p = s_instances.find (f); |
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
101 if (p != s_instances.end ()) |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
102 { |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
103 retval = p->second; |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
104 retval->m_count++; |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
105 if (fake) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
106 retval->fake_reload (); |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
107 } |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
108 else |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
109 retval = new_instance (f); |
3326 | 110 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
111 return retval; |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
112 } |
3326 | 113 |
23554
b075b1629c26
don't use hook function in dynamic_library::dynlib_rep::close function
John W. Eaton <jwe@octave.org>
parents:
23457
diff
changeset
|
114 std::list<std::string> |
b075b1629c26
don't use hook function in dynamic_library::dynlib_rep::close function
John W. Eaton <jwe@octave.org>
parents:
23457
diff
changeset
|
115 dynamic_library::dynlib_rep::function_names (void) const |
b075b1629c26
don't use hook function in dynamic_library::dynlib_rep::close function
John W. Eaton <jwe@octave.org>
parents:
23457
diff
changeset
|
116 { |
b075b1629c26
don't use hook function in dynamic_library::dynlib_rep::close function
John W. Eaton <jwe@octave.org>
parents:
23457
diff
changeset
|
117 std::list<std::string> retval; |
b075b1629c26
don't use hook function in dynamic_library::dynlib_rep::close function
John W. Eaton <jwe@octave.org>
parents:
23457
diff
changeset
|
118 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
119 for (const auto& p : m_fcn_names) |
23554
b075b1629c26
don't use hook function in dynamic_library::dynlib_rep::close function
John W. Eaton <jwe@octave.org>
parents:
23457
diff
changeset
|
120 retval.push_back (p.first); |
b075b1629c26
don't use hook function in dynamic_library::dynlib_rep::close function
John W. Eaton <jwe@octave.org>
parents:
23457
diff
changeset
|
121 |
b075b1629c26
don't use hook function in dynamic_library::dynlib_rep::close function
John W. Eaton <jwe@octave.org>
parents:
23457
diff
changeset
|
122 return retval; |
b075b1629c26
don't use hook function in dynamic_library::dynlib_rep::close function
John W. Eaton <jwe@octave.org>
parents:
23457
diff
changeset
|
123 } |
b075b1629c26
don't use hook function in dynamic_library::dynlib_rep::close function
John W. Eaton <jwe@octave.org>
parents:
23457
diff
changeset
|
124 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
125 void |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
126 dynamic_library::dynlib_rep::add_fcn_name (const std::string& name) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
127 { |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
128 auto p = m_fcn_names.find (name); |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
129 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
130 if (p == m_fcn_names.end ()) |
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
131 m_fcn_names[name] = 1; |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
132 else |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
133 ++(p->second); |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
134 } |
3326 | 135 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
136 bool |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
137 dynamic_library::dynlib_rep::remove_fcn_name (const std::string& fcn_name) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
138 { |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
139 bool retval = false; |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
140 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
141 auto p = m_fcn_names.find (fcn_name); |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
142 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
143 if (p != m_fcn_names.end () && --(p->second) == 0) |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
144 { |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
145 m_fcn_names.erase (fcn_name); |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
146 retval = true; |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
147 } |
3326 | 148 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
149 return retval; |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
150 } |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
151 |
22402
4caa7b28d183
maint: Style check C++ code in liboctave/
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
152 std::map<std::string, dynamic_library::dynlib_rep *> |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
153 dynamic_library::dynlib_rep::s_instances; |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
154 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
155 dynamic_library::dynlib_rep dynamic_library::s_nil_rep; |
3326 | 156 |
4110 | 157 #if defined (HAVE_DLOPEN_API) |
3326 | 158 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
159 class |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
160 octave_dlopen_shlib : public dynamic_library::dynlib_rep |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
161 { |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
162 public: |
3326 | 163 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
164 octave_dlopen_shlib (const std::string& f); |
3326 | 165 |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22865
diff
changeset
|
166 // No copying! |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22865
diff
changeset
|
167 |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22865
diff
changeset
|
168 octave_dlopen_shlib (const octave_dlopen_shlib&) = delete; |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22865
diff
changeset
|
169 |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22865
diff
changeset
|
170 octave_dlopen_shlib& operator = (const octave_dlopen_shlib&) = delete; |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22865
diff
changeset
|
171 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
172 ~octave_dlopen_shlib (void); |
3326 | 173 |
23446
cd4e1ee28716
maint: Use convention 'void * fcn ()' for functions which return pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
174 void * search (const std::string& name, |
28057
b3701ea5a48d
use std::function object for passing name mangler to search function
John W. Eaton <jwe@octave.org>
parents:
27923
diff
changeset
|
175 const dynamic_library::name_mangler& mangler |
b3701ea5a48d
use std::function object for passing name mangler to search function
John W. Eaton <jwe@octave.org>
parents:
27923
diff
changeset
|
176 = dynamic_library::name_mangler ()); |
3326 | 177 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
178 // FIXME: this is possibly redundant because failure to open a library will |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
179 // normally throw an exception, avoiding the construction of an invalid |
22402
4caa7b28d183
maint: Style check C++ code in liboctave/
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
180 // library. Leave it here for possible future use. |
3326 | 181 |
24656
cd79f32fba85
Fix errors in changeset f0de21a6a426 (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24653
diff
changeset
|
182 bool is_open (void) const |
cd79f32fba85
Fix errors in changeset f0de21a6a426 (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24653
diff
changeset
|
183 { |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
184 return (m_search_all_loaded || m_library != nullptr); |
24656
cd79f32fba85
Fix errors in changeset f0de21a6a426 (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24653
diff
changeset
|
185 } |
3326 | 186 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
187 private: |
3326 | 188 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
189 void *m_library; |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
190 }; |
3326 | 191 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
192 octave_dlopen_shlib::octave_dlopen_shlib (const std::string& f) |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
193 : dynamic_library::dynlib_rep (f), m_library (nullptr) |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
194 { |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
195 int flags = 0; |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
196 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
197 // Use RTLD_NOW to resolve all symbols before dlopen returns. |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
198 // By using this option, dlopen will detect errors and Octave |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
199 // won't exit if there are unresolved symbols in the file we are |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
200 // loading, and we may even get a useful diagnostic. |
21202
f7121e111991
maint: indent #ifdef blocks in liboctave and src directories.
Rik <rik@octave.org>
parents:
21136
diff
changeset
|
201 # if defined (RTLD_NOW) |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
202 flags |= RTLD_NOW; |
21202
f7121e111991
maint: indent #ifdef blocks in liboctave and src directories.
Rik <rik@octave.org>
parents:
21136
diff
changeset
|
203 # endif |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
204 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
205 // Use RTLD_GLOBAL to export symbols from loaded objects so they are |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
206 // available to other subsequently loaded libraries. |
21202
f7121e111991
maint: indent #ifdef blocks in liboctave and src directories.
Rik <rik@octave.org>
parents:
21136
diff
changeset
|
207 # if defined (RTLD_GLOBAL) |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
208 flags |= RTLD_GLOBAL; |
21202
f7121e111991
maint: indent #ifdef blocks in liboctave and src directories.
Rik <rik@octave.org>
parents:
21136
diff
changeset
|
209 # endif |
20493
3f01c585f54e
oct-shlib.cc: Use RTLD_GLOBAL option for dlopen
Mike Miller <mtmiller@octave.org>
parents:
19697
diff
changeset
|
210 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
211 if (m_file.empty ()) |
24653
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
212 { |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
213 m_search_all_loaded = true; |
24653
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
214 return; |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
215 } |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
216 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
217 m_library = dlopen (m_file.c_str (), flags); |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
218 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
219 if (! m_library) |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
220 { |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
221 const char *msg = dlerror (); |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
222 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
223 if (msg) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
224 (*current_liboctave_error_handler) ("%s: failed to load: %s", |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
225 m_file.c_str (), msg); |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
226 else |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
227 (*current_liboctave_error_handler) ("%s: failed to load", |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
228 m_file.c_str ()); |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
229 } |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
230 } |
3326 | 231 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
232 octave_dlopen_shlib::~octave_dlopen_shlib (void) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
233 { |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
234 if (m_library) |
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
235 dlclose (m_library); |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
236 } |
3326 | 237 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
238 void * |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
239 octave_dlopen_shlib::search (const std::string& name, |
28057
b3701ea5a48d
use std::function object for passing name mangler to search function
John W. Eaton <jwe@octave.org>
parents:
27923
diff
changeset
|
240 const dynamic_library::name_mangler& mangler) |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
241 { |
23457
21baad6b35c4
maint: Use C++11 nullptr rather than 0 or NULL when possible.
Rik <rik@octave.org>
parents:
23446
diff
changeset
|
242 void *function = nullptr; |
3326 | 243 |
24656
cd79f32fba85
Fix errors in changeset f0de21a6a426 (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24653
diff
changeset
|
244 if (! is_open ()) |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
245 (*current_liboctave_error_handler) |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
246 ("shared library %s is not open", m_file.c_str ()); |
3326 | 247 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
248 std::string sym_name = name; |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21109
diff
changeset
|
249 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
250 if (mangler) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
251 sym_name = mangler (name); |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21109
diff
changeset
|
252 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
253 if (m_search_all_loaded) |
24653
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
254 function = dlsym (RTLD_DEFAULT, sym_name.c_str ()); |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
255 else |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
256 function = dlsym (m_library, sym_name.c_str ()); |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21109
diff
changeset
|
257 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
258 return function; |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
259 } |
3326 | 260 |
4110 | 261 #elif defined (HAVE_LOADLIBRARY_API) |
262 | |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
263 class |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
264 octave_w32_shlib: public dynamic_library::dynlib_rep |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
265 { |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
266 public: |
4110 | 267 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
268 octave_w32_shlib (const std::string& f); |
4110 | 269 |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22865
diff
changeset
|
270 // No copying! |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22865
diff
changeset
|
271 |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22865
diff
changeset
|
272 octave_w32_shlib (const octave_w32_shlib&) = delete; |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22865
diff
changeset
|
273 |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22865
diff
changeset
|
274 octave_w32_shlib& operator = (const octave_w32_shlib&) = delete; |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22865
diff
changeset
|
275 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
276 ~octave_w32_shlib (void); |
4110 | 277 |
23446
cd4e1ee28716
maint: Use convention 'void * fcn ()' for functions which return pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
278 void * search (const std::string& name, |
28057
b3701ea5a48d
use std::function object for passing name mangler to search function
John W. Eaton <jwe@octave.org>
parents:
27923
diff
changeset
|
279 const dynamic_library::name_mangler& mangler |
b3701ea5a48d
use std::function object for passing name mangler to search function
John W. Eaton <jwe@octave.org>
parents:
27923
diff
changeset
|
280 = dynamic_library::name_mangler ()); |
4110 | 281 |
24653
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
282 void * global_search (const std::string& sym_name); |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
283 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
284 bool is_open (void) const |
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
285 { |
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
286 return (m_search_all_loaded || m_handle != nullptr); |
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
287 } |
4110 | 288 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
289 private: |
4110 | 290 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
291 HINSTANCE m_handle; |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
292 }; |
4110 | 293 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
294 octave_w32_shlib::octave_w32_shlib (const std::string& f) |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
295 : dynamic_library::dynlib_rep (f), m_handle (nullptr) |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
296 { |
24653
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
297 if (f.empty()) |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
298 { |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
299 m_search_all_loaded = true; |
24653
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
300 return; |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
301 } |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
302 |
23696
08036a7f3660
remove octave:: namespace tag from symbols used inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23554
diff
changeset
|
303 std::string dir = sys::file_ops::dirname (f); |
28175
b895daca20e2
Avoid potential lifetime issues with temporary std::wstring objects.
Markus Mützel <markus.muetzel@gmx.de>
parents:
28057
diff
changeset
|
304 std::wstring wdir = sys::u8_to_wstring (dir); |
27700
6455c82d5180
When loading a library display error message from OS on Windows (bug #57202).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27379
diff
changeset
|
305 SetDllDirectoryW (dir.empty () |
28175
b895daca20e2
Avoid potential lifetime issues with temporary std::wstring objects.
Markus Mützel <markus.muetzel@gmx.de>
parents:
28057
diff
changeset
|
306 ? nullptr : wdir.c_str ()); |
22146
ef91e43f162a
set DLL directory when loading DLLs on Windows systems (bug #48511)
John W. Eaton <jwe@octave.org>
parents:
21942
diff
changeset
|
307 |
28175
b895daca20e2
Avoid potential lifetime issues with temporary std::wstring objects.
Markus Mützel <markus.muetzel@gmx.de>
parents:
28057
diff
changeset
|
308 std::wstring wfile = sys::u8_to_wstring (m_file); |
b895daca20e2
Avoid potential lifetime issues with temporary std::wstring objects.
Markus Mützel <markus.muetzel@gmx.de>
parents:
28057
diff
changeset
|
309 m_handle = LoadLibraryW (wfile.c_str ()); |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
310 |
27700
6455c82d5180
When loading a library display error message from OS on Windows (bug #57202).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27379
diff
changeset
|
311 SetDllDirectoryW (nullptr); |
22157
c5842206aaea
maint: Strip trailing whitespace from source files.
John W. Eaton <jwe@octave.org>
parents:
22146
diff
changeset
|
312 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
313 if (! m_handle) |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
314 { |
27700
6455c82d5180
When loading a library display error message from OS on Windows (bug #57202).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27379
diff
changeset
|
315 DWORD last_error = GetLastError (); |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
316 |
27700
6455c82d5180
When loading a library display error message from OS on Windows (bug #57202).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27379
diff
changeset
|
317 wchar_t *error_text = nullptr; |
6455c82d5180
When loading a library display error message from OS on Windows (bug #57202).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27379
diff
changeset
|
318 FormatMessageW (FORMAT_MESSAGE_FROM_SYSTEM | |
6455c82d5180
When loading a library display error message from OS on Windows (bug #57202).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27379
diff
changeset
|
319 FORMAT_MESSAGE_ALLOCATE_BUFFER | |
6455c82d5180
When loading a library display error message from OS on Windows (bug #57202).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27379
diff
changeset
|
320 FORMAT_MESSAGE_IGNORE_INSERTS, |
6455c82d5180
When loading a library display error message from OS on Windows (bug #57202).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27379
diff
changeset
|
321 nullptr, last_error, |
6455c82d5180
When loading a library display error message from OS on Windows (bug #57202).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27379
diff
changeset
|
322 MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), |
6455c82d5180
When loading a library display error message from OS on Windows (bug #57202).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27379
diff
changeset
|
323 reinterpret_cast <wchar_t *> (&error_text), 0, nullptr); |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
324 |
27706
847dece1ae10
Include error number in message if library loading fails (bug #57202).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27700
diff
changeset
|
325 std::ostringstream err_str; |
847dece1ae10
Include error number in message if library loading fails (bug #57202).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27700
diff
changeset
|
326 err_str << "opening the library '" << m_file << "' failed (error " |
847dece1ae10
Include error number in message if library loading fails (bug #57202).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27700
diff
changeset
|
327 << last_error << "): "; |
27700
6455c82d5180
When loading a library display error message from OS on Windows (bug #57202).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27379
diff
changeset
|
328 if (error_text != nullptr) |
6455c82d5180
When loading a library display error message from OS on Windows (bug #57202).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27379
diff
changeset
|
329 { |
27706
847dece1ae10
Include error number in message if library loading fails (bug #57202).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27700
diff
changeset
|
330 err_str << sys::u8_from_wstring (error_text); |
27700
6455c82d5180
When loading a library display error message from OS on Windows (bug #57202).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27379
diff
changeset
|
331 LocalFree (error_text); |
6455c82d5180
When loading a library display error message from OS on Windows (bug #57202).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27379
diff
changeset
|
332 } |
6455c82d5180
When loading a library display error message from OS on Windows (bug #57202).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27379
diff
changeset
|
333 else |
27706
847dece1ae10
Include error number in message if library loading fails (bug #57202).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27700
diff
changeset
|
334 err_str << "Unknown error."; |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
335 |
27706
847dece1ae10
Include error number in message if library loading fails (bug #57202).
Markus Mützel <markus.muetzel@gmx.de>
parents:
27700
diff
changeset
|
336 (*current_liboctave_error_handler) ("%s", err_str.str ().c_str ()); |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
337 } |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
338 } |
4110 | 339 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
340 octave_w32_shlib::~octave_w32_shlib (void) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
341 { |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
342 if (m_handle) |
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
343 FreeLibrary (m_handle); |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
344 } |
4110 | 345 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
346 void * |
24653
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
347 octave_w32_shlib::global_search (const std::string& sym_name) |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
348 { |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
349 void *function = nullptr; |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
350 |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
351 HANDLE proc = GetCurrentProcess (); |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
352 |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
353 if (! proc) |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
354 (*current_liboctave_error_handler) |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
355 ("Unable to get handle to own process."); |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
356 |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
357 size_t lib_num = 64; |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
358 size_t size_lib = sizeof (HMODULE); |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
359 HMODULE *h_libs; |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
360 DWORD bytes_all_libs; |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
361 bool got_libs; |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
362 |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
363 // Get a list of all the libraries in own process. |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
364 h_libs = static_cast<HMODULE *> (malloc (size_lib*lib_num)); |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
365 got_libs = EnumProcessModules (proc, h_libs, size_lib*lib_num, |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
366 &bytes_all_libs); |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
367 int ii = 0; |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
368 while (((size_lib*lib_num) < bytes_all_libs) && ii++ < 3) |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
369 { |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
370 lib_num = bytes_all_libs / size_lib; |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
371 h_libs = static_cast<HMODULE *> (realloc (h_libs, bytes_all_libs)); |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
372 got_libs = EnumProcessModules (proc, h_libs, bytes_all_libs, |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
373 &bytes_all_libs); |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
374 } |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
375 |
25103
078b795c5219
maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
376 if (got_libs) |
24653
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
377 { |
24663
ca416267c65f
oct-shlib: move common property to base class.
Markus Mützel <markus.muetzel@gmx.de>
parents:
24656
diff
changeset
|
378 for (size_t i = 0; i < (bytes_all_libs / size_lib); i++) |
24653
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
379 { |
25103
078b795c5219
maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
380 // Check for function in library. |
078b795c5219
maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
381 function = reinterpret_cast<void *> |
078b795c5219
maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
382 (GetProcAddress (h_libs[i], sym_name.c_str ())); |
24653
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
383 |
25103
078b795c5219
maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
384 if (function) |
078b795c5219
maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
385 break; |
24653
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
386 } |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
387 } |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
388 |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
389 // Release the handle to the process. |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
390 CloseHandle (proc); |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
391 |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
392 return function; |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
393 } |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
394 |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
395 void * |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
396 octave_w32_shlib::search (const std::string& name, |
28057
b3701ea5a48d
use std::function object for passing name mangler to search function
John W. Eaton <jwe@octave.org>
parents:
27923
diff
changeset
|
397 const dynamic_library::name_mangler& mangler) |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
398 { |
23457
21baad6b35c4
maint: Use C++11 nullptr rather than 0 or NULL when possible.
Rik <rik@octave.org>
parents:
23446
diff
changeset
|
399 void *function = nullptr; |
4110 | 400 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
401 if (! m_search_all_loaded && ! is_open ()) |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
402 (*current_liboctave_error_handler) |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
403 ("shared library %s is not open", m_file.c_str ()); |
4110 | 404 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
405 std::string sym_name = name; |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21109
diff
changeset
|
406 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
407 if (mangler) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
408 sym_name = mangler (name); |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21109
diff
changeset
|
409 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
410 if (m_search_all_loaded) |
24653
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
411 function = global_search (sym_name); |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
412 else |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
413 function = reinterpret_cast<void *> (GetProcAddress (m_handle, |
24653
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
414 sym_name.c_str ())); |
21136
7cac4e7458f2
maint: clean up code around calls to current_liboctave_error_handler.
Rik <rik@octave.org>
parents:
21109
diff
changeset
|
415 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
416 return function; |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
417 } |
4110 | 418 |
3326 | 419 #endif |
420 | |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
421 dynamic_library::dynlib_rep * |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
422 dynamic_library::dynlib_rep::new_instance (const std::string& f) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
423 { |
4110 | 424 #if defined (HAVE_DLOPEN_API) |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
425 return new octave_dlopen_shlib (f); |
4110 | 426 #elif defined (HAVE_LOADLIBRARY_API) |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
427 return new octave_w32_shlib (f); |
3326 | 428 #else |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
429 (*current_liboctave_error_handler) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
430 ("support for dynamically loaded libraries was unavailable or disabled when liboctave was built"); |
3326 | 431 #endif |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
432 } |
3326 | 433 } |