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

Reply via email to