annotate base/src/java/nonstandard/SharedLib.d @ 113:fb3aa8075988

D2 support for the linux port.
author Jacob Carlborg <doob@me.com>
date Wed, 06 Apr 2011 21:57:23 +0200
parents 9f4c18c268b2
children
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;
47
65761bc28ab2 swt linux again compilable for d1.
Frank Benoit <benoit@tionex.de>
parents: 46
diff changeset
4 version(Tango){
65761bc28ab2 swt linux again compilable for d1.
Frank Benoit <benoit@tionex.de>
parents: 46
diff changeset
5 static import tango.sys.SharedLib;
65761bc28ab2 swt linux again compilable for d1.
Frank Benoit <benoit@tionex.de>
parents: 46
diff changeset
6 static import tango.stdc.stringz;
112
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
7 } else { // Phobos
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
8 import std.loader;
47
65761bc28ab2 swt linux again compilable for d1.
Frank Benoit <benoit@tionex.de>
parents: 46
diff changeset
9 }
46
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
10
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
11 struct Symbol {
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
12 String name;
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
13 void** symbol;
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
14 }
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 struct SymbolVersioned2 {
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
17 String name;
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
18 void** symbol;
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
19 int major;
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
20 int minor;
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
21 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
22
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
23 struct SharedLib {
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
24 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
25 version(Tango){
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
26 if (auto lib = tango.sys.SharedLib.SharedLib.load(libname)) {
112
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
27 foreach( ref s; symbols ){
58
8a5386b204bb [swt win] fix dll symbol loading
Frank Benoit <benoit@tionex.de>
parents: 47
diff changeset
28 if( s.major > major ) continue;
46
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
29 if( s.major == major && s.minor > minor ) continue;
47
65761bc28ab2 swt linux again compilable for d1.
Frank Benoit <benoit@tionex.de>
parents: 46
diff changeset
30 *s.symbol = lib.getSymbol( tango.stdc.stringz.toStringz(s.name ) );
46
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
31 if( s.symbol is null ){
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
32 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
33 }
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 } else {
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
36 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
37 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
38 } else { // Phobos
112
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
39 if (auto lib = ExeModule_Load(libname)) {
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
40 foreach( ref s; symbols ){
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
41 if( s.major > major ) continue;
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
42 if( s.major == major && s.minor > minor ) continue;
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
43 *s.symbol = ExeModule_GetSymbol( lib, s.name );
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
44 if( s.symbol is null ){
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
45 getDwtLogger.error( __FILE__, __LINE__, "{}: Symbol '{}' not found", libname, s.name );
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
46 }
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
47 }
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
48 } else {
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
49 getDwtLogger.error( __FILE__, __LINE__, "Could not load the library {}", libname );
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
50 }
46
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 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
53 static void loadLibSymbols( Symbol[] symbols, String libname ){
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
54 version(Tango){
113
fb3aa8075988 D2 support for the linux port.
Jacob Carlborg <doob@me.com>
parents: 112
diff changeset
55 if (auto lib = tango.sys.SharedLib.SharedLib.loadNoThrow(libname)) {
112
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
56 foreach( ref s; symbols ){
113
fb3aa8075988 D2 support for the linux port.
Jacob Carlborg <doob@me.com>
parents: 112
diff changeset
57 *s.symbol = lib.getSymbolNoThrow( tango.stdc.stringz.toStringz(s.name ) );
fb3aa8075988 D2 support for the linux port.
Jacob Carlborg <doob@me.com>
parents: 112
diff changeset
58 if( *s.symbol is null ){
fb3aa8075988 D2 support for the linux port.
Jacob Carlborg <doob@me.com>
parents: 112
diff changeset
59 //getDwtLogger.error( __FILE__, __LINE__, "{}: Symbol '{}' not found", libname, s.name );
46
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 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
62 } else {
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
63 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
64 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
65 } else { // Phobos
112
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
66 if (auto lib = ExeModule_Load(libname)) {
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
67 foreach( ref s; symbols ){
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
68 *s.symbol = ExeModule_GetSymbol( lib, s.name );
113
fb3aa8075988 D2 support for the linux port.
Jacob Carlborg <doob@me.com>
parents: 112
diff changeset
69 if( *s.symbol is null ){
fb3aa8075988 D2 support for the linux port.
Jacob Carlborg <doob@me.com>
parents: 112
diff changeset
70 //getDwtLogger.error( __FILE__, __LINE__, "{}: Symbol '{}' not found", libname, s.name );
112
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
71 }
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
72 }
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
73 } else {
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
74 getDwtLogger.error( __FILE__, __LINE__, "Could not load the library {}", libname );
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
75 }
46
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
76 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
77 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
78 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
79 bool result = false;
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
80 version(Tango){
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
81 if (auto lib = tango.sys.SharedLib.SharedLib.load( libname ) ) {
47
65761bc28ab2 swt linux again compilable for d1.
Frank Benoit <benoit@tionex.de>
parents: 46
diff changeset
82 void* ptr = lib.getSymbol( tango.stdc.stringz.toStringz(symbolname));
46
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
83 if (ptr !is null){
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
84 dg(ptr);
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
85 result = true;
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
86 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
87 lib.unload();
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
88 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
89 } else { // Phobos
112
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
90 if (auto lib = ExeModule_Load( libname ) ) {
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
91 void* ptr = ExeModule_GetSymbol( lib, symbolname );
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
92 if (ptr !is null){
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
93 dg(ptr);
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
94 result = true;
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
95 }
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
96 ExeModule_Release( lib );
9f4c18c268b2 Update to compile and execute with dmd 2.052.
kntroh
parents: 58
diff changeset
97 }
46
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
98 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
99 return result;
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
100 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
101 }
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
102
17310ba3c1bc Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
103