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:
Kolan Sh 2018-06-21 17:59:49 +03:00
parent 9b11bca35b
commit ee8c6209db
1 changed files with 39 additions and 21 deletions

View File

@ -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;