Mercurial > projects > dwt2
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 |
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 |