Mercurial > octave
annotate liboctave/util/oct-shlib.cc @ 27700:6455c82d5180
When loading a library display error message from OS on Windows (bug #57202).
* oct-shlib.cc (octave_w32_shlib::octave_w32_shlib): Get error message from
system resources.
author | Markus Mützel <markus.muetzel@gmx.de> |
---|---|
date | Sat, 16 Nov 2019 15:13:12 +0100 |
parents | 3db033e86376 |
children | 847dece1ae10 |
rev | line source |
---|---|
3326 | 1 /* |
2 | |
26376
00f796120a6d
maint: Update copyright dates in all source files.
John W. Eaton <jwe@octave.org>
parents:
25524
diff
changeset
|
3 Copyright (C) 1999-2019 John W. Eaton |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
4 Copyright (C) 2009 VZLU Prague |
3326 | 5 |
6 This file is part of Octave. | |
7 | |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
23795
diff
changeset
|
8 Octave is free software: you can redistribute it and/or modify it |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
9 under the terms of the GNU General Public License as published by |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
23795
diff
changeset
|
10 the Free Software Foundation, either version 3 of the License, or |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
11 (at your option) any later version. |
3326 | 12 |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
13 Octave is distributed in the hope that it will be useful, but |
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
14 WITHOUT ANY WARRANTY; without even the implied warranty of |
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
16 GNU General Public License for more details. |
3326 | 17 |
18 You should have received a copy of the GNU General Public License | |
7016 | 19 along with Octave; see the file COPYING. If not, see |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
23795
diff
changeset
|
20 <https://www.gnu.org/licenses/>. |
3326 | 21 |
22 */ | |
23 | |
21724
aba2e6293dd8
use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents:
21661
diff
changeset
|
24 #if defined (HAVE_CONFIG_H) |
21301
40de9f8f23a6
Use '#include "config.h"' rather than <config.h>.
Rik <rik@octave.org>
parents:
21236
diff
changeset
|
25 # include "config.h" |
3326 | 26 #endif |
27 | |
7749
14e05160b99f
reference counting for functions loaded from shared libraries
John W. Eaton <jwe@octave.org>
parents:
7520
diff
changeset
|
28 #include <map> |
14e05160b99f
reference counting for functions loaded from shared libraries
John W. Eaton <jwe@octave.org>
parents:
7520
diff
changeset
|
29 |
3326 | 30 extern "C" |
31 { | |
4110 | 32 #if defined (HAVE_DLOPEN_API) |
21202
f7121e111991
maint: indent #ifdef blocks in liboctave and src directories.
Rik <rik@octave.org>
parents:
21136
diff
changeset
|
33 # if defined (HAVE_DLFCN_H) |
f7121e111991
maint: indent #ifdef blocks in liboctave and src directories.
Rik <rik@octave.org>
parents:
21136
diff
changeset
|
34 # include <dlfcn.h> |
f7121e111991
maint: indent #ifdef blocks in liboctave and src directories.
Rik <rik@octave.org>
parents:
21136
diff
changeset
|
35 # else |
23446
cd4e1ee28716
maint: Use convention 'void * fcn ()' for functions which return pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
36 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
|
37 extern const char * dlerror (void); |
cd4e1ee28716
maint: Use convention 'void * fcn ()' for functions which return pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
38 extern void * dlsym (void *, const char *); |
3326 | 39 extern int dlclose (void *); |
21202
f7121e111991
maint: indent #ifdef blocks in liboctave and src directories.
Rik <rik@octave.org>
parents:
21136
diff
changeset
|
40 # endif |
5451 | 41 #elif defined (HAVE_LOADLIBRARY_API) |
21213
f7d1050b9b53
maint: Clean up various usages of #ifdef.
Rik <rik@octave.org>
parents:
21202
diff
changeset
|
42 # 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
|
43 # 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
|
44 # include <psapi.h> |
3326 | 45 #endif |
46 } | |
47 | |
22146
ef91e43f162a
set DLL directory when loading DLLs on Windows systems (bug #48511)
John W. Eaton <jwe@octave.org>
parents:
21942
diff
changeset
|
48 #include "file-ops.h" |
3326 | 49 #include "file-stat.h" |
50 #include "lo-error.h" | |
51 #include "oct-shlib.h" | |
52 #include "str-vec.h" | |
53 | |
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
|
54 #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
|
55 # 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
|
56 #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
|
57 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
58 namespace octave |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
59 { |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
60 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
|
61 : 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
|
62 m_search_all_loaded (false) |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
63 { |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
64 s_instances[f] = this; |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
65 |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
66 if (is_out_of_date ()) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
67 (*current_liboctave_warning_with_id_handler) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
68 ("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
|
69 "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
|
70 } |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
71 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
72 bool |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
73 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
|
74 { |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
75 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
|
76 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
|
77 } |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
78 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
79 void |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
80 dynamic_library::dynlib_rep::fake_reload (void) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
81 { |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
82 // 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
|
83 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
|
84 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
|
85 { |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
86 m_time_loaded = fs.mtime (); |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
87 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
88 (*current_liboctave_warning_with_id_handler) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
89 ("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
|
90 "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
|
91 } |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
92 } |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
93 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
94 dynamic_library::dynlib_rep * |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
95 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
|
96 { |
23457
21baad6b35c4
maint: Use C++11 nullptr rather than 0 or NULL when possible.
Rik <rik@octave.org>
parents:
23446
diff
changeset
|
97 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
|
98 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
|
99 if (p != s_instances.end ()) |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
100 { |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
101 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
|
102 retval->m_count++; |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
103 if (fake) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
104 retval->fake_reload (); |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
105 } |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
106 else |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
107 retval = new_instance (f); |
3326 | 108 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
109 return retval; |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
110 } |
3326 | 111 |
23554
b075b1629c26
don't use hook function in dynamic_library::dynlib_rep::close function
John W. Eaton <jwe@octave.org>
parents:
23457
diff
changeset
|
112 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
|
113 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
|
114 { |
b075b1629c26
don't use hook function in dynamic_library::dynlib_rep::close function
John W. Eaton <jwe@octave.org>
parents:
23457
diff
changeset
|
115 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
|
116 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
117 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
|
118 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
|
119 |
b075b1629c26
don't use hook function in dynamic_library::dynlib_rep::close function
John W. Eaton <jwe@octave.org>
parents:
23457
diff
changeset
|
120 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
|
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 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
123 void |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
124 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
|
125 { |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
126 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
|
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 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
|
129 m_fcn_names[name] = 1; |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
130 else |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
131 ++(p->second); |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
132 } |
3326 | 133 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
134 bool |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
135 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
|
136 { |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
137 bool retval = false; |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
138 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
139 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
|
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 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
|
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 m_fcn_names.erase (fcn_name); |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
144 retval = true; |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
145 } |
3326 | 146 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
147 return retval; |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
148 } |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
149 |
22402
4caa7b28d183
maint: Style check C++ code in liboctave/
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
150 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
|
151 dynamic_library::dynlib_rep::s_instances; |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
152 |
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 dynamic_library::s_nil_rep; |
3326 | 154 |
4110 | 155 #if defined (HAVE_DLOPEN_API) |
3326 | 156 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
157 class |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
158 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
|
159 { |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
160 public: |
3326 | 161 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
162 octave_dlopen_shlib (const std::string& f); |
3326 | 163 |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22865
diff
changeset
|
164 // No copying! |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22865
diff
changeset
|
165 |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22865
diff
changeset
|
166 octave_dlopen_shlib (const octave_dlopen_shlib&) = delete; |
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& operator = (const octave_dlopen_shlib&) = delete; |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22865
diff
changeset
|
169 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
170 ~octave_dlopen_shlib (void); |
3326 | 171 |
23446
cd4e1ee28716
maint: Use convention 'void * fcn ()' for functions which return pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
172 void * search (const std::string& name, |
23795
980f39c3ab90
Use C++11 nullptr rather than 0 in code (bug #51565).
Rik <rik@octave.org>
parents:
23696
diff
changeset
|
173 dynamic_library::name_mangler mangler = nullptr); |
3326 | 174 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
175 // 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
|
176 // 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
|
177 // library. Leave it here for possible future use. |
3326 | 178 |
24656
cd79f32fba85
Fix errors in changeset f0de21a6a426 (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24653
diff
changeset
|
179 bool is_open (void) const |
cd79f32fba85
Fix errors in changeset f0de21a6a426 (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24653
diff
changeset
|
180 { |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
181 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
|
182 } |
3326 | 183 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
184 private: |
3326 | 185 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
186 void *m_library; |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
187 }; |
3326 | 188 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
189 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
|
190 : 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
|
191 { |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
192 int flags = 0; |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
193 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
194 // 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
|
195 // 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
|
196 // 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
|
197 // 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
|
198 # if defined (RTLD_NOW) |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
199 flags |= RTLD_NOW; |
21202
f7121e111991
maint: indent #ifdef blocks in liboctave and src directories.
Rik <rik@octave.org>
parents:
21136
diff
changeset
|
200 # endif |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
201 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
202 // 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
|
203 // 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
|
204 # if defined (RTLD_GLOBAL) |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
205 flags |= RTLD_GLOBAL; |
21202
f7121e111991
maint: indent #ifdef blocks in liboctave and src directories.
Rik <rik@octave.org>
parents:
21136
diff
changeset
|
206 # endif |
20493
3f01c585f54e
oct-shlib.cc: Use RTLD_GLOBAL option for dlopen
Mike Miller <mtmiller@octave.org>
parents:
19697
diff
changeset
|
207 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
208 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
|
209 { |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
210 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
|
211 return; |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
212 } |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
213 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
214 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
|
215 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
216 if (! m_library) |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
217 { |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
218 const char *msg = dlerror (); |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
219 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
220 if (msg) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
221 (*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
|
222 m_file.c_str (), msg); |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
223 else |
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", |
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 ()); |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
226 } |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
227 } |
3326 | 228 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
229 octave_dlopen_shlib::~octave_dlopen_shlib (void) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
230 { |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
231 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
|
232 dlclose (m_library); |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
233 } |
3326 | 234 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
235 void * |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
236 octave_dlopen_shlib::search (const std::string& name, |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
237 dynamic_library::name_mangler mangler) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
238 { |
23457
21baad6b35c4
maint: Use C++11 nullptr rather than 0 or NULL when possible.
Rik <rik@octave.org>
parents:
23446
diff
changeset
|
239 void *function = nullptr; |
3326 | 240 |
24656
cd79f32fba85
Fix errors in changeset f0de21a6a426 (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24653
diff
changeset
|
241 if (! is_open ()) |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
242 (*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
|
243 ("shared library %s is not open", m_file.c_str ()); |
3326 | 244 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
245 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
|
246 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
247 if (mangler) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
248 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
|
249 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
250 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
|
251 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
|
252 else |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
253 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
|
254 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
255 return function; |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
256 } |
3326 | 257 |
4110 | 258 #elif defined (HAVE_LOADLIBRARY_API) |
259 | |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
260 class |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
261 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
|
262 { |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
263 public: |
4110 | 264 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
265 octave_w32_shlib (const std::string& f); |
4110 | 266 |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22865
diff
changeset
|
267 // No copying! |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22865
diff
changeset
|
268 |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22865
diff
changeset
|
269 octave_w32_shlib (const octave_w32_shlib&) = delete; |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22865
diff
changeset
|
270 |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22865
diff
changeset
|
271 octave_w32_shlib& operator = (const octave_w32_shlib&) = delete; |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22865
diff
changeset
|
272 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
273 ~octave_w32_shlib (void); |
4110 | 274 |
23446
cd4e1ee28716
maint: Use convention 'void * fcn ()' for functions which return pointers.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
275 void * search (const std::string& name, |
24677
69b89e81d3d3
Fix unloading dynamic libraries (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24663
diff
changeset
|
276 dynamic_library::name_mangler mangler = nullptr); |
4110 | 277 |
24653
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
278 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
|
279 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
280 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
|
281 { |
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
282 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
|
283 } |
4110 | 284 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
285 private: |
4110 | 286 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
287 HINSTANCE m_handle; |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
288 }; |
4110 | 289 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
290 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
|
291 : 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
|
292 { |
24653
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
293 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
|
294 { |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
295 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
|
296 return; |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
297 } |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
298 |
23696
08036a7f3660
remove octave:: namespace tag from symbols used inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23554
diff
changeset
|
299 std::string dir = sys::file_ops::dirname (f); |
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
|
300 SetDllDirectoryW (dir.empty () |
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
|
301 ? nullptr : sys::u8_to_wstring (dir).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
|
302 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
303 m_handle = LoadLibraryW (sys::u8_to_wstring (m_file).c_str ()); |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
304 |
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 (nullptr); |
22157
c5842206aaea
maint: Strip trailing whitespace from source files.
John W. Eaton <jwe@octave.org>
parents:
22146
diff
changeset
|
306 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
307 if (! m_handle) |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
308 { |
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
|
309 DWORD last_error = GetLastError (); |
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 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
|
312 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
|
313 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
|
314 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
|
315 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
|
316 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
|
317 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
|
318 |
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
|
319 std::string msg = "opening the library '" + m_file + "' failed: "; |
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 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
|
321 { |
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 msg.append (sys::u8_from_wstring (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
|
323 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
|
324 } |
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
|
325 else |
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
|
326 { |
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
|
327 std::ostringstream err_str; |
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 err_str << "Unknown error (" << 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
|
329 msg.append (err_str.str ()); |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
330 } |
9958
80432f0ee895
improve octave_shlib for safer shared libs treatment
Jaroslav Hajek <highegg@gmail.com>
parents:
9493
diff
changeset
|
331 |
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
|
332 (*current_liboctave_error_handler) ("%s", msg.c_str ()); |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
333 } |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
334 } |
4110 | 335 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
336 octave_w32_shlib::~octave_w32_shlib (void) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
337 { |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
338 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
|
339 FreeLibrary (m_handle); |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
340 } |
4110 | 341 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
342 void * |
24653
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
343 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
|
344 { |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
345 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
|
346 |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
347 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
|
348 |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
349 if (! proc) |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
350 (*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
|
351 ("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
|
352 |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
353 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
|
354 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
|
355 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
|
356 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
|
357 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
|
358 |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
359 // 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
|
360 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
|
361 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
|
362 &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
|
363 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
|
364 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
|
365 { |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
366 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
|
367 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
|
368 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
|
369 &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
|
370 } |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
371 |
25103
078b795c5219
maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
372 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
|
373 { |
24663
ca416267c65f
oct-shlib: move common property to base class.
Markus Mützel <markus.muetzel@gmx.de>
parents:
24656
diff
changeset
|
374 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
|
375 { |
25103
078b795c5219
maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
376 // Check for function in library. |
078b795c5219
maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
377 function = reinterpret_cast<void *> |
078b795c5219
maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
378 (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
|
379 |
25103
078b795c5219
maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
380 if (function) |
078b795c5219
maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
381 break; |
24653
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
382 } |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
383 } |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
384 |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
385 // 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
|
386 CloseHandle (proc); |
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 return function; |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
389 } |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
390 |
f0de21a6a426
Use new LAPACK functions in gsvd if available (bug #50463).
Markus Mützel <markus.muetzel@gmx.de>
parents:
24534
diff
changeset
|
391 void * |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
392 octave_w32_shlib::search (const std::string& name, |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
393 dynamic_library::name_mangler mangler) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
394 { |
23457
21baad6b35c4
maint: Use C++11 nullptr rather than 0 or NULL when possible.
Rik <rik@octave.org>
parents:
23446
diff
changeset
|
395 void *function = nullptr; |
4110 | 396 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
397 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
|
398 (*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
|
399 ("shared library %s is not open", m_file.c_str ()); |
4110 | 400 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
401 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
|
402 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
403 if (mangler) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
404 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
|
405 |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
406 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
|
407 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
|
408 else |
27379
3db033e86376
use m_ prefix for data members in most liboctave/util classes
John W. Eaton <jwe@octave.org>
parents:
26604
diff
changeset
|
409 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
|
410 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
|
411 |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
412 return function; |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
413 } |
4110 | 414 |
3326 | 415 #endif |
416 | |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
417 dynamic_library::dynlib_rep * |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
418 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
|
419 { |
4110 | 420 #if defined (HAVE_DLOPEN_API) |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
421 return new octave_dlopen_shlib (f); |
4110 | 422 #elif defined (HAVE_LOADLIBRARY_API) |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
423 return new octave_w32_shlib (f); |
3326 | 424 #else |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
425 (*current_liboctave_error_handler) |
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
426 ("support for dynamically loaded libraries was unavailable or disabled when liboctave was built"); |
3326 | 427 #endif |
21750
6720e5a220ba
use namespace for octave_shlib class
John W. Eaton <jwe@octave.org>
parents:
21736
diff
changeset
|
428 } |
3326 | 429 } |