xref: /netbsd-src/external/gpl3/gcc.old/dist/libphobos/testsuite/libphobos.shared/finalize.d (revision 627f7eb200a4419d89b531d55fccd2ee3ffdcde0)
1 import core.runtime;
2 import core.stdc.stdio;
3 import core.stdc.string;
4 import core.thread;
5 import core.sys.posix.dlfcn;
6 
runTest()7 void runTest()
8 {
9     Object obj;
10     obj = Object.factory("lib.MyFinalizer");
11     assert(obj.toString() == "lib.MyFinalizer");
12     obj = Object.factory("lib.MyFinalizerBig");
13     assert(obj.toString() == "lib.MyFinalizerBig");
14 }
15 
16 class NoFinalize
17 {
18     size_t _finalizeCounter;
19 
~this()20     ~this()
21     {
22         ++_finalizeCounter;
23     }
24 }
25 
26 class NoFinalizeBig : NoFinalize
27 {
28     ubyte[4096] _big = void;
29 }
30 
31 extern (C) alias SetFinalizeCounter = void function(shared(size_t*));
32 
main(string[]args)33 void main(string[] args)
34 {
35     auto name = args[0] ~ '\0';
36     const pathlen = strrchr(name.ptr, '/') - name.ptr + 1;
37     name = name[0 .. pathlen] ~ "lib.so";
38 
39     auto h = Runtime.loadLibrary(name);
40     assert(h !is null);
41 
42     auto nf1 = new NoFinalize;
43     auto nf2 = new NoFinalizeBig;
44 
45     shared size_t finalizeCounter;
46     auto setFinalizeCounter = cast(SetFinalizeCounter)dlsym(h, "setFinalizeCounter");
47     setFinalizeCounter(&finalizeCounter);
48 
49     runTest();
50     auto thr = new Thread(&runTest);
51     thr.start();
52     thr.join();
53 
54     auto r = Runtime.unloadLibrary(h);
55     if (!r)
56         assert(0);
57     if (finalizeCounter != 4)
58         assert(0);
59     if (nf1._finalizeCounter)
60         assert(0);
61     if (nf2._finalizeCounter)
62         assert(0);
63 }
64