[gnome-scan] Avoid loading twice a library (one .la then one .so)
- From: Étienne Bersac <bersace src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-scan] Avoid loading twice a library (one .la then one .so)
- Date: Sat, 20 Feb 2010 15:01:21 +0000 (UTC)
commit a90c6bc2c74439e379aca3f235c82fbd2bb01965
Author: Ã?tienne Bersac <bersace gnome org>
Date: Sat Feb 20 14:52:47 2010 +0100
Avoid loading twice a library (one .la then one .so)
lib/gnome-scan-module-manager.vala | 48 ++++++++++++++++++++++++++++++++---
lib/gnome-scan-module.vala | 7 +---
2 files changed, 45 insertions(+), 10 deletions(-)
---
diff --git a/lib/gnome-scan-module-manager.vala b/lib/gnome-scan-module-manager.vala
index 5c26c11..6b69c0c 100644
--- a/lib/gnome-scan-module-manager.vala
+++ b/lib/gnome-scan-module-manager.vala
@@ -21,6 +21,13 @@
using GLib;
+errordomain ModuleError {
+ NONAME,
+ INVALID,
+ LOADED,
+ FAIL
+}
+
namespace Gnome.Scan {
/**
* SECTION: gnome-scan-module-manager
@@ -57,6 +64,23 @@ namespace Gnome.Scan {
this.path = path;
}
+ string module_name_from_filename(string filename) throws ModuleError {
+ try {
+ string name;
+ var regex = new Regex ("lib(.*)\\..*$");
+ MatchInfo match;
+ if (! regex.match(filename, 0, out match))
+ throw new ModuleError.NONAME("No name matched");
+ name = match.fetch(1);
+ if (name == null)
+ throw new ModuleError.NONAME("No name fetched");
+ return name;
+ } catch (Error e) {
+ var message = "Unable to determine %s module name: %s".printf(filename, e.message);
+ throw new ModuleError.NONAME(message);
+ }
+ }
+
/**
* gnome_scan_module_manager_query_modules:
* @self: a #GnomeScanModuleManager
@@ -69,7 +93,9 @@ namespace Gnome.Scan {
Module module;
Dir dir = null;
string[] paths = path.split (GLib.Path.SEARCHPATH_SEPARATOR_S);
+ var loaded = new SList<string>();
string name;
+ string module_name;
string filename;
foreach (string path in paths) {
@@ -87,15 +113,27 @@ namespace Gnome.Scan {
/* Scan for lib*.{so,la} */
while ((name = dir.read_name ()) != null) {
- if (is_valid_module_name (name)) {
+ try {
+ if (!is_valid_module_name (name))
+ throw new ModuleError.INVALID("%s: File not a module".printf(name));
+ module_name = module_name_from_filename(name);
+
+ foreach(string lname in loaded)
+ if (module_name == lname)
+ throw new ModuleError.LOADED("%s: Module already loaded".printf(name));
+
filename = Path.build_filename (path, name);
module = new Module (filename);
- if (!module.use ()) {
- warning ("%s", GLib.Module.error());
- // throw exception ?
- }
+ if (!module.use ())
+ throw new ModuleError.FAIL(GLib.Module.error());
+
modules.append (module);
+ loaded.append (module_name);
+ }
+ catch (ModuleError e) {
+ if (e is ModuleError.FAIL)
+ warning (e.message);
}
}
}
diff --git a/lib/gnome-scan-module.vala b/lib/gnome-scan-module.vala
index 587bb1a..bbde277 100644
--- a/lib/gnome-scan-module.vala
+++ b/lib/gnome-scan-module.vala
@@ -44,10 +44,8 @@ namespace Gnome.Scan {
public override bool load () {
library = GLib.Module.open (filename, ModuleFlags.BIND_MASK);
- if (library == null) {
- warning("%s",GLib.Module.error());
+ if (library == null)
return false;
- }
void * init_function = null;
void * finalize_function = null;
@@ -83,7 +81,6 @@ namespace Gnome.Scan {
**/
public Module (string filename) {
this.filename = filename;
- }
-
+ }
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]