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*627f7eb2Smrgvoid 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*627f7eb2Smrgvoid 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