1import core.runtime;
2import core.stdc.stdio;
3import core.stdc.string;
4import core.thread;
5import core.sys.posix.dlfcn;
6
7void 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
16class NoFinalize
17{
18    size_t _finalizeCounter;
19
20    ~this()
21    {
22        ++_finalizeCounter;
23    }
24}
25
26class NoFinalizeBig : NoFinalize
27{
28    ubyte[4096] _big = void;
29}
30
31extern (C) alias SetFinalizeCounter = void function(shared(size_t*));
32
33void 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