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