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