Hi *, My IPluginFactoryImpl implementation is a simple code that I saw used in Firebird's codebase.
IPluginBase* Factory::createPlugin(ThrowStatusWrapper* status, IPluginConfig* factoryParameter) { auto p = new Plugin(); p->addRef(); return p; } Is this correct? Especially the `addRef` call? The `addRef` and `release` implementations are again very simple. void Plugin::addRef() { ++refCounter; } int Plugin::release() { if (--refCounter == 0) { delete this; return 0; } return 1; } My problem is, that the `release` is never called enough times to hit 0 and hence do any cleanup. Removing the `addRef` eventually ends with AV. Exception thrown at 0x00007FFF01ED3464 (engine12.dll) in firebird.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF. engine12.dll!Jrd::ExtEngineManager::makeFunction(Jrd::thread_db * tdbb, Jrd::CompilerScratch * csb, Jrd::Function * udf, const Firebird::MetaName & engine, const Firebird::StringBase<Firebird::StringComparator> & entryPoint, const Firebird::StringBase<Firebird::StringComparator> & body) Line 1194 C++ engine12.dll!Jrd::Function::loadMetadata(Jrd::thread_db * tdbb, unsigned short id, bool noscan, unsigned short flags) Line 1107 C++ engine12.dll!Jrd::Function::lookup(Jrd::thread_db * tdbb, const Firebird::QualifiedName & name, bool noscan) Line 646 C++ engine12.dll!`anonymous namespace'::RoutineManager<`anonymous namespace'::FunctionManager,Jrd::Function,15,&Jrd::Function::lookup,&Jrd::Function::lookup,&Jrd::Function::loadMetadata>::createRoutine(Jrd::thread_db * tdbb, short phase, Jrd::DeferredWork * work, Jrd::jrd_tra * transaction) Line 3934 C++ engine12.dll!DFW_perform_work(Jrd::thread_db * tdbb, Jrd::jrd_tra * transaction) Line 4792 C++ engine12.dll!TRA_commit(Jrd::thread_db * tdbb, Jrd::jrd_tra * transaction, const bool retaining_flag) Line 383 C++ engine12.dll!Jrd::JTransaction::commit(Firebird::CheckStatusWrapper * user_status) Line 2224 C++ engine12.dll!Firebird::ITransactionBaseImpl<Jrd::JTransaction,Firebird::CheckStatusWrapper,Firebird::IReferenceCountedImpl<Jrd::JTransaction,Firebird::CheckStatusWrapper,Firebird::Inherit<Firebird::IVersionedImpl<Jrd::JTransaction,Firebird::CheckStatusWrapper,Firebird::Inherit<Firebird::ITransaction>>>>>::cloopcommitDispatcher(Firebird::ITransaction * self, Firebird::IStatus * status) Line 7326 C++ fbclient.dll!Why::YTransaction::commit(Firebird::CheckStatusWrapper * status) Line 4793 C++ fbclient.dll!Firebird::ITransactionBaseImpl<Why::YTransaction,Firebird::CheckStatusWrapper,Firebird::IReferenceCountedImpl<Why::YTransaction,Firebird::CheckStatusWrapper,Firebird::Inherit<Firebird::IVersionedImpl<Why::YTransaction,Firebird::CheckStatusWrapper,Firebird::Inherit<Firebird::ITransaction>>>>>::cloopcommitDispatcher(Firebird::ITransaction * self, Firebird::IStatus * status) Line 7326 C++ firebird.exe!rem_port::end_transaction(P_OP operation, p_rlse * release, packet * sendL) Line 3252 C++ firebird.exe!process_packet(rem_port * port, packet * sendL, packet * receive, rem_port * * result) Line 4472 C++ firebird.exe!loopThread(void * __formal) Line 6020 C++ firebird.exe!threadStart(void * arg) Line 97 C++ Running on 3.0.7.33374. Any ideas what I'm doing wrong? -- Mgr. Jiří Činčura https://www.tabsoverspaces.com/ Firebird-Devel mailing list, web interface at https://lists.sourceforge.net/lists/listinfo/firebird-devel