mirror of
https://github.com/autc04/Retro68.git
synced 2024-11-29 12:50:35 +00:00
64 lines
1.3 KiB
D
64 lines
1.3 KiB
D
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);
|
|
}
|