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,17 +96,26 @@ namespace GObject {
|
|||
public bool load_modules (string dir_path, ref Gee.ArrayList<Module>? modules) {
|
||||
|
||||
modules = new Gee.ArrayList<Module> ();
|
||||
var paths = new Gee.HashSet<string> ();
|
||||
|
||||
try {
|
||||
var libPath = File.new_for_path (dir_path);
|
||||
var lib_enumerator = libPath.enumerate_children (FileAttribute.STANDARD_NAME, 0, null);
|
||||
FileInfo file_info = null;
|
||||
while ((file_info = lib_enumerator.next_file (null)) != null) {
|
||||
if (Regex.match_simple ("^.*\\.(so|dll)$", file_info.get_name ())) {
|
||||
var module = new Module (GLib.Module.build_path (dir_path, file_info.get_name ()));
|
||||
if (module.load ())
|
||||
modules.add (module);
|
||||
for (var i = 0; i < 32; ++i) {
|
||||
var saved_length = modules.size;
|
||||
var lib_enumerator = libPath.enumerate_children (FileAttribute.STANDARD_NAME, 0, null);
|
||||
FileInfo file_info = null;
|
||||
while ((file_info = lib_enumerator.next_file (null)) != null) {
|
||||
if (Regex.match_simple ("^.*\\.(so|dll)$", file_info.get_name ())) {
|
||||
var path = GLib.Module.build_path (dir_path, file_info.get_name ());
|
||||
if (paths.contains(path)) continue;
|
||||
var module = new Module (path);
|
||||
if (module.load ()) {
|
||||
modules.add (module);
|
||||
paths.add(path);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (modules.size == saved_length) break;
|
||||
}
|
||||
} catch (Error e) {
|
||||
message (e.message);
|
||||
|
@ -130,26 +139,35 @@ namespace GObject {
|
|||
public bool load_modules_depth2 (string dir_path, ref Gee.ArrayList<Module>? modules) {
|
||||
|
||||
modules = new Gee.ArrayList<Module> ();
|
||||
var paths = new Gee.HashSet<string> ();
|
||||
|
||||
try {
|
||||
var libPath = File.new_for_path (dir_path);
|
||||
var dir_enumerator = libPath.enumerate_children ("standard::*",
|
||||
FileQueryInfoFlags.NOFOLLOW_SYMLINKS, null);
|
||||
FileInfo dir_info = null;
|
||||
while ((dir_info = dir_enumerator.next_file (null)) != null ) {
|
||||
if (dir_info.get_file_type () == FileType.DIRECTORY) {
|
||||
File subdir = libPath.resolve_relative_path (dir_info.get_name ());
|
||||
var lib_enumerator = subdir.enumerate_children (FileAttribute.STANDARD_NAME, 0, null);
|
||||
FileInfo file_info = null;
|
||||
while ((file_info = lib_enumerator.next_file (null)) != null) {
|
||||
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 module = new Module (GLib.Module.build_path (path, file_info.get_name ()));
|
||||
if (module.load ())
|
||||
modules.add (module);
|
||||
for (var i = 0; i < 32; ++i) {
|
||||
var saved_length = modules.size;
|
||||
var dir_enumerator = libPath.enumerate_children ("standard::*",
|
||||
FileQueryInfoFlags.NOFOLLOW_SYMLINKS, null);
|
||||
FileInfo dir_info = null;
|
||||
while ((dir_info = dir_enumerator.next_file (null)) != null ) {
|
||||
if (dir_info.get_file_type () == FileType.DIRECTORY) {
|
||||
File subdir = libPath.resolve_relative_path (dir_info.get_name ());
|
||||
var lib_enumerator = subdir.enumerate_children (FileAttribute.STANDARD_NAME, 0, null);
|
||||
FileInfo file_info = null;
|
||||
while ((file_info = lib_enumerator.next_file (null)) != null) {
|
||||
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 ());
|
||||
path = GLib.Module.build_path (path, file_info.get_name ());
|
||||
if (paths.contains(path)) continue;
|
||||
var module = new Module (path);
|
||||
if (module.load ()) {
|
||||
modules.add (module);
|
||||
paths.add(path);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (modules.size == saved_length) break;
|
||||
}
|
||||
} catch (Error e) {
|
||||
message (e.message);
|
||||
|
|
Loading…
Reference in New Issue