Dependency accounting between modules.
Typically, common classes are placed in a separate library that is loaded by the system, but if this is not done, then you need to select the correct sequence for loading the modules, which is done in the loop.
This commit is contained in:
parent
9b11bca35b
commit
ee8c6209db
|
@ -96,18 +96,27 @@ namespace GObject {
|
||||||
public bool load_modules (string dir_path, ref Gee.ArrayList<Module>? modules) {
|
public bool load_modules (string dir_path, ref Gee.ArrayList<Module>? modules) {
|
||||||
|
|
||||||
modules = new Gee.ArrayList<Module> ();
|
modules = new Gee.ArrayList<Module> ();
|
||||||
|
var paths = new Gee.HashSet<string> ();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
var libPath = File.new_for_path (dir_path);
|
var libPath = File.new_for_path (dir_path);
|
||||||
|
for (var i = 0; i < 32; ++i) {
|
||||||
|
var saved_length = modules.size;
|
||||||
var lib_enumerator = libPath.enumerate_children (FileAttribute.STANDARD_NAME, 0, null);
|
var lib_enumerator = libPath.enumerate_children (FileAttribute.STANDARD_NAME, 0, null);
|
||||||
FileInfo file_info = null;
|
FileInfo file_info = null;
|
||||||
while ((file_info = lib_enumerator.next_file (null)) != null) {
|
while ((file_info = lib_enumerator.next_file (null)) != null) {
|
||||||
if (Regex.match_simple ("^.*\\.(so|dll)$", file_info.get_name ())) {
|
if (Regex.match_simple ("^.*\\.(so|dll)$", file_info.get_name ())) {
|
||||||
var module = new Module (GLib.Module.build_path (dir_path, file_info.get_name ()));
|
var path = GLib.Module.build_path (dir_path, file_info.get_name ());
|
||||||
if (module.load ())
|
if (paths.contains(path)) continue;
|
||||||
|
var module = new Module (path);
|
||||||
|
if (module.load ()) {
|
||||||
modules.add (module);
|
modules.add (module);
|
||||||
|
paths.add(path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (modules.size == saved_length) break;
|
||||||
|
}
|
||||||
} catch (Error e) {
|
} catch (Error e) {
|
||||||
message (e.message);
|
message (e.message);
|
||||||
return false;
|
return false;
|
||||||
|
@ -130,9 +139,12 @@ namespace GObject {
|
||||||
public bool load_modules_depth2 (string dir_path, ref Gee.ArrayList<Module>? modules) {
|
public bool load_modules_depth2 (string dir_path, ref Gee.ArrayList<Module>? modules) {
|
||||||
|
|
||||||
modules = new Gee.ArrayList<Module> ();
|
modules = new Gee.ArrayList<Module> ();
|
||||||
|
var paths = new Gee.HashSet<string> ();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
var libPath = File.new_for_path (dir_path);
|
var libPath = File.new_for_path (dir_path);
|
||||||
|
for (var i = 0; i < 32; ++i) {
|
||||||
|
var saved_length = modules.size;
|
||||||
var dir_enumerator = libPath.enumerate_children ("standard::*",
|
var dir_enumerator = libPath.enumerate_children ("standard::*",
|
||||||
FileQueryInfoFlags.NOFOLLOW_SYMLINKS, null);
|
FileQueryInfoFlags.NOFOLLOW_SYMLINKS, null);
|
||||||
FileInfo dir_info = null;
|
FileInfo dir_info = null;
|
||||||
|
@ -144,13 +156,19 @@ namespace GObject {
|
||||||
while ((file_info = lib_enumerator.next_file (null)) != null) {
|
while ((file_info = lib_enumerator.next_file (null)) != null) {
|
||||||
if (Regex.match_simple ("^.*\\.(so|dll)$", file_info.get_name ())) {
|
if (Regex.match_simple ("^.*\\.(so|dll)$", file_info.get_name ())) {
|
||||||
var path = Path.build_path (Path.DIR_SEPARATOR_S, dir_path, dir_info.get_name ());
|
var path = Path.build_path (Path.DIR_SEPARATOR_S, dir_path, dir_info.get_name ());
|
||||||
var module = new Module (GLib.Module.build_path (path, file_info.get_name ()));
|
path = GLib.Module.build_path (path, file_info.get_name ());
|
||||||
if (module.load ())
|
if (paths.contains(path)) continue;
|
||||||
|
var module = new Module (path);
|
||||||
|
if (module.load ()) {
|
||||||
modules.add (module);
|
modules.add (module);
|
||||||
|
paths.add(path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (modules.size == saved_length) break;
|
||||||
|
}
|
||||||
} catch (Error e) {
|
} catch (Error e) {
|
||||||
message (e.message);
|
message (e.message);
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in New Issue