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()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 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)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