C++: simplify output from suggest_alternatives_for
[official-gcc.git] / libphobos / testsuite / libphobos.shared / load.d
blob8c13f51eac6ca7fe1ebb956f2fef4914a845e01e
1 import core.runtime;
2 import core.stdc.stdio;
3 import core.stdc.string;
4 import core.thread;
6 version (linux) import core.sys.linux.dlfcn;
7 else version (FreeBSD) import core.sys.freebsd.dlfcn;
8 else version (NetBSD) import core.sys.netbsd.dlfcn;
9 else static assert(0, "unimplemented");
11 void loadSym(T)(void* handle, ref T val, const char* mangle)
13 val = cast(T).dlsym(handle, mangle);
16 void* openLib(string s)
18 auto h = Runtime.loadLibrary(s);
19 assert(h !is null);
21 loadSym(h, libThrowException, "_D3lib14throwExceptionFZv");
22 loadSym(h, libCollectException, "_D3lib16collectExceptionFDFZvZC9Exception");
24 loadSym(h, libAlloc, "_D3lib5allocFZv");
25 loadSym(h, libTlsAlloc, "_D3lib9tls_allocFZv");
26 loadSym(h, libAccess, "_D3lib6accessFZv");
27 loadSym(h, libTlsAccess, "_D3lib10tls_accessFZv");
28 loadSym(h, libFree, "_D3lib4freeFZv");
29 loadSym(h, libTlsFree, "_D3lib8tls_freeFZv");
31 loadSym(h, libSharedStaticCtor, "_D3lib18shared_static_ctorOk");
32 loadSym(h, libSharedStaticDtor, "_D3lib18shared_static_dtorOk");
33 loadSym(h, libStaticCtor, "_D3lib11static_ctorOk");
34 loadSym(h, libStaticDtor, "_D3lib11static_dtorOk");
36 return h;
39 void closeLib(void* h)
41 Runtime.unloadLibrary(h);
44 __gshared
46 void function() libThrowException;
47 Exception function(void delegate()) libCollectException;
49 void function() libAlloc;
50 void function() libTlsAlloc;
51 void function() libAccess;
52 void function() libTlsAccess;
53 void function() libFree;
54 void function() libTlsFree;
56 shared uint* libSharedStaticCtor;
57 shared uint* libSharedStaticDtor;
58 shared uint* libStaticCtor;
59 shared uint* libStaticDtor;
62 void testEH()
64 bool passed;
65 try
66 libThrowException();
67 catch (Exception e)
68 passed = true;
69 assert(passed); passed = false;
71 assert(libCollectException({throw new Exception(null);}) !is null);
72 assert(libCollectException({libThrowException();}) !is null);
75 void testGC()
77 import core.memory;
78 libAlloc();
79 libTlsAlloc();
80 libAccess();
81 libTlsAccess();
82 GC.collect();
83 libTlsAccess();
84 libAccess();
85 libTlsFree();
86 libFree();
89 void testInit()
92 assert(*libStaticCtor == 1);
93 assert(*libStaticDtor == 0);
94 static void run()
96 assert(*libSharedStaticCtor == 1);
97 assert(*libSharedStaticDtor == 0);
98 assert(*libStaticCtor == 2);
99 assert(*libStaticDtor == 0);
101 auto thr = new Thread(&run);
102 thr.start();
103 thr.join();
104 assert(*libSharedStaticCtor == 1);
105 assert(*libSharedStaticDtor == 0);
106 assert(*libStaticCtor == 2);
107 assert(*libStaticDtor == 1);
110 const(ModuleInfo)* findModuleInfo(string name)
112 foreach (m; ModuleInfo)
113 if (m.name == name) return m;
114 return null;
117 void runTests(string libName)
119 assert(findModuleInfo("lib") is null);
120 auto handle = openLib(libName);
121 assert(findModuleInfo("lib") !is null);
123 testEH();
124 testGC();
125 testInit();
127 closeLib(handle);
128 assert(findModuleInfo("lib") is null);
131 void main(string[] args)
133 auto name = args[0] ~ '\0';
134 const pathlen = strrchr(name.ptr, '/') - name.ptr + 1;
135 name = name[0 .. pathlen] ~ "lib.so";
137 runTests(name);
139 // lib is no longer resident
140 name ~= '\0';
141 assert(.dlopen(name.ptr, RTLD_LAZY | RTLD_NOLOAD) is null);
142 name = name[0 .. $-1];
144 auto thr = new Thread({runTests(name);});
145 thr.start();
146 thr.join();