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