testsuite: Skip 90020.c on AIX.
[official-gcc.git] / libphobos / testsuite / libphobos.shared / load.d
blob5a2dd01b778e3c45fd239f6ecb2640ff00509bbb
1 import core.runtime;
2 import core.stdc.stdio;
3 import core.stdc.string;
4 import core.thread;
6 import core.sys.posix.dlfcn;
8 version (DragonFlyBSD) import core.sys.dragonflybsd.dlfcn : RTLD_NOLOAD;
9 version (FreeBSD) import core.sys.freebsd.dlfcn : RTLD_NOLOAD;
10 version (linux) import core.sys.linux.dlfcn : RTLD_NOLOAD;
11 version (NetBSD) import core.sys.netbsd.dlfcn : RTLD_NOLOAD;
12 version (OSX) import core.sys.darwin.dlfcn : RTLD_NOLOAD;
13 version (Solaris) import core.sys.solaris.dlfcn : RTLD_NOLOAD;
15 static assert(__traits(compiles, RTLD_NOLOAD), "unimplemented");
17 void loadSym(T)(void* handle, ref T val, const char* mangle)
19 val = cast(T).dlsym(handle, mangle);
22 void* openLib(string s)
24 auto h = Runtime.loadLibrary(s);
25 assert(h !is null);
27 loadSym(h, libThrowException, "_D3lib14throwExceptionFZv");
28 loadSym(h, libCollectException, "_D3lib16collectExceptionFDFZvZC9Exception");
30 loadSym(h, libAlloc, "_D3lib5allocFZv");
31 loadSym(h, libTlsAlloc, "_D3lib9tls_allocFZv");
32 loadSym(h, libAccess, "_D3lib6accessFZv");
33 loadSym(h, libTlsAccess, "_D3lib10tls_accessFZv");
34 loadSym(h, libFree, "_D3lib4freeFZv");
35 loadSym(h, libTlsFree, "_D3lib8tls_freeFZv");
37 loadSym(h, libSharedStaticCtor, "_D3lib18shared_static_ctorOk");
38 loadSym(h, libSharedStaticDtor, "_D3lib18shared_static_dtorOk");
39 loadSym(h, libStaticCtor, "_D3lib11static_ctorOk");
40 loadSym(h, libStaticDtor, "_D3lib11static_dtorOk");
42 return h;
45 void closeLib(void* h)
47 Runtime.unloadLibrary(h);
50 __gshared
52 void function() libThrowException;
53 Exception function(void delegate()) libCollectException;
55 void function() libAlloc;
56 void function() libTlsAlloc;
57 void function() libAccess;
58 void function() libTlsAccess;
59 void function() libFree;
60 void function() libTlsFree;
62 shared uint* libSharedStaticCtor;
63 shared uint* libSharedStaticDtor;
64 shared uint* libStaticCtor;
65 shared uint* libStaticDtor;
68 void testEH()
70 bool passed;
71 try
72 libThrowException();
73 catch (Exception e)
74 passed = true;
75 assert(passed); passed = false;
77 assert(libCollectException({throw new Exception(null);}) !is null);
78 assert(libCollectException({libThrowException();}) !is null);
81 void testGC()
83 import core.memory;
84 libAlloc();
85 libTlsAlloc();
86 libAccess();
87 libTlsAccess();
88 GC.collect();
89 libTlsAccess();
90 libAccess();
91 libTlsFree();
92 libFree();
95 void testInit()
98 assert(*libStaticCtor == 1);
99 assert(*libStaticDtor == 0);
100 static void run()
102 assert(*libSharedStaticCtor == 1);
103 assert(*libSharedStaticDtor == 0);
104 assert(*libStaticCtor == 2);
105 assert(*libStaticDtor == 0);
107 auto thr = new Thread(&run);
108 thr.start();
109 thr.join();
110 assert(*libSharedStaticCtor == 1);
111 assert(*libSharedStaticDtor == 0);
112 assert(*libStaticCtor == 2);
113 assert(*libStaticDtor == 1);
116 const(ModuleInfo)* findModuleInfo(string name)
118 foreach (m; ModuleInfo)
119 if (m.name == name) return m;
120 return null;
123 void runTests(string libName)
125 assert(findModuleInfo("lib") is null);
126 auto handle = openLib(libName);
127 assert(findModuleInfo("lib") !is null);
129 testEH();
130 testGC();
131 testInit();
133 closeLib(handle);
134 assert(findModuleInfo("lib") is null);
137 void main(string[] args)
139 auto name = args[0] ~ '\0';
140 const pathlen = strrchr(name.ptr, '/') - name.ptr + 1;
141 name = name[0 .. pathlen] ~ "lib.so";
143 runTests(name);
145 // lib is no longer resident
146 name ~= '\0';
147 assert(.dlopen(name.ptr, RTLD_LAZY | RTLD_NOLOAD) is null);
148 name = name[0 .. $-1];
150 auto thr = new Thread({runTests(name);});
151 thr.start();
152 thr.join();