annotate base/src/java/nonstandard/SharedLib.d @ 46:17310ba3c1bc

Moved all load lib functionality into own module
author Frank Benoit <benoit@tionex.de>
date Fri, 27 Mar 2009 11:10:45 +0100
parents
children 65761bc28ab2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
46
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1 module java.nonstandard.SharedLib;
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
3 import java.lang.all;
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
4
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
5 struct Symbol {
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
6 String name;
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
7 void** symbol;
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
8 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
9
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
10 struct SymbolVersioned2 {
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
11 String name;
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
12 void** symbol;
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
13 int major;
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
14 int minor;
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
15 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
16
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
17 struct SharedLib {
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
18 static void loadLibSymbols( SymbolVersioned2[] symbols, String libname, int major, int minor ){
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
19 version(Tango){
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
20 if (auto lib = tango.sys.SharedLib.SharedLib.load(libname)) {
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
21 foreach( inout s; symbols ){
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
22 if( s.major < major ) continue;
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
23 if( s.major == major && s.minor > minor ) continue;
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
24 *s.symbol = lib.getSymbol( s.name.ptr );
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
25 if( s.symbol is null ){
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
26 getDwtLogger.error( __FILE__, __LINE__, "{}: Symbol '{}' not found", libname, s.name );
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
27 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
28 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
29 } else {
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
30 getDwtLogger.error( __FILE__, __LINE__, "Could not load the library {}", libname );
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
31 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
32 } else { // Phobos
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
33 implMissing( __FILE__, __LINE__ );
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
34 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
35 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
36 static void loadLibSymbols( Symbol[] symbols, String libname ){
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
37 version(Tango){
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
38 if (auto lib = tango.sys.SharedLib.SharedLib.load(libname)) {
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
39 foreach( inout s; symbols ){
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
40 *s.symbol = lib.getSymbol( s.name.ptr );
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
41 if( s.symbol is null ){
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
42 getDwtLogger.error( __FILE__, __LINE__, "{}: Symbol '{}' not found", libname, s.name );
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
43 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
44 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
45 } else {
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
46 getDwtLogger.error( __FILE__, __LINE__, "Could not load the library {}", libname );
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
47 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
48 } else { // Phobos
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
49 implMissing( __FILE__, __LINE__ );
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
50 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
51 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
52 static bool tryUseSymbol( String symbolname, String libname, void delegate( void*) dg ){
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
53 bool result = false;
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
54 version(Tango){
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
55 if (auto lib = tango.sys.SharedLib.SharedLib.load( libname ) ) {
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
56 void* ptr = lib.getSymbol(symbolname);
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
57 if (ptr !is null){
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
58 dg(ptr);
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
59 result = true;
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
60 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
61 lib.unload();
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
62 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
63 } else { // Phobos
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
64 implMissing( __FILE__, __LINE__ );
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
65 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
66 return result;
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
67 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
68 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
69
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
70