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