| 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); | |
| } |