mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-23 21:23:03 +01:00
Backported PR168 and PR294
This commit is contained in:
parent
09e66e43f5
commit
679ecad8ef
@ -217,6 +217,20 @@ Jrd::Attachment::~Attachment()
|
|||||||
{
|
{
|
||||||
delete att_trace_manager;
|
delete att_trace_manager;
|
||||||
|
|
||||||
|
for (Function** iter = att_functions.begin(); iter < att_functions.end(); ++iter)
|
||||||
|
{
|
||||||
|
Function* const function = *iter;
|
||||||
|
if (function)
|
||||||
|
delete function;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (jrd_prc** iter = att_procedures.begin(); iter < att_procedures.end(); ++iter)
|
||||||
|
{
|
||||||
|
jrd_prc* const procedure = *iter;
|
||||||
|
if (procedure)
|
||||||
|
delete procedure;
|
||||||
|
}
|
||||||
|
|
||||||
while (att_pools.hasData())
|
while (att_pools.hasData())
|
||||||
deletePool(att_pools.pop());
|
deletePool(att_pools.pop());
|
||||||
|
|
||||||
|
@ -886,7 +886,7 @@ ExtEngineManager::Trigger::Trigger(thread_db* tdbb, MemoryPool& pool, CompilerSc
|
|||||||
|
|
||||||
ExtEngineManager::Trigger::~Trigger()
|
ExtEngineManager::Trigger::~Trigger()
|
||||||
{
|
{
|
||||||
// hvlad: shouldn't we call trigger->dispose() here ?
|
trigger->dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1121,22 +1121,23 @@ void ExtEngineManager::initialize()
|
|||||||
|
|
||||||
void ExtEngineManager::closeAttachment(thread_db* tdbb, Attachment* attachment)
|
void ExtEngineManager::closeAttachment(thread_db* tdbb, Attachment* attachment)
|
||||||
{
|
{
|
||||||
Array<IExternalEngine*> enginesCopy;
|
EnginesMap enginesCopy;
|
||||||
|
|
||||||
{ // scope
|
{ // scope
|
||||||
ReadLockGuard readGuard(enginesLock, FB_FUNCTION);
|
ReadLockGuard readGuard(enginesLock, FB_FUNCTION);
|
||||||
|
|
||||||
EnginesMap::Accessor accessor(&engines);
|
EnginesMap::Accessor accessor(&engines);
|
||||||
for (bool found = accessor.getFirst(); found; found = accessor.getNext())
|
for (bool found = accessor.getFirst(); found; found = accessor.getNext())
|
||||||
enginesCopy.add(accessor.current()->second);
|
enginesCopy.put(accessor.current()->first, accessor.current()->second);
|
||||||
}
|
}
|
||||||
|
|
||||||
RefDeb(DEB_RLS_JATT, "ExtEngineManager::closeAttachment");
|
RefDeb(DEB_RLS_JATT, "ExtEngineManager::closeAttachment");
|
||||||
EngineCheckout cout(tdbb, FB_FUNCTION, true);
|
EngineCheckout cout(tdbb, FB_FUNCTION, true);
|
||||||
|
|
||||||
for (Array<IExternalEngine*>::iterator i = enginesCopy.begin(); i != enginesCopy.end(); ++i)
|
EnginesMap::Accessor accessor(&enginesCopy);
|
||||||
|
for (bool found = accessor.getFirst(); found; found = accessor.getNext())
|
||||||
{
|
{
|
||||||
IExternalEngine* engine = *i;
|
IExternalEngine* engine = accessor.current()->second;
|
||||||
EngineAttachmentInfo* attInfo = getEngineAttachment(tdbb, engine, true);
|
EngineAttachmentInfo* attInfo = getEngineAttachment(tdbb, engine, true);
|
||||||
|
|
||||||
if (attInfo)
|
if (attInfo)
|
||||||
@ -1145,6 +1146,27 @@ void ExtEngineManager::closeAttachment(thread_db* tdbb, Attachment* attachment)
|
|||||||
ContextManager<IExternalFunction> ctxManager(tdbb, attInfo, attInfo->adminCharSet);
|
ContextManager<IExternalFunction> ctxManager(tdbb, attInfo, attInfo->adminCharSet);
|
||||||
FbLocalStatus status;
|
FbLocalStatus status;
|
||||||
engine->closeAttachment(&status, attInfo->context); //// FIXME: log status
|
engine->closeAttachment(&status, attInfo->context); //// FIXME: log status
|
||||||
|
|
||||||
|
// Check whether the engine is used by other attachments.
|
||||||
|
// If no one uses, release it.
|
||||||
|
bool close = true;
|
||||||
|
WriteLockGuard writeGuard(enginesLock, FB_FUNCTION);
|
||||||
|
|
||||||
|
EnginesAttachmentsMap::Accessor ea_accessor(&enginesAttachments);
|
||||||
|
for (bool ea_found = ea_accessor.getFirst(); ea_found; ea_found = ea_accessor.getNext())
|
||||||
|
{
|
||||||
|
if (ea_accessor.current()->first.engine == engine)
|
||||||
|
{
|
||||||
|
close = false; // engine is in use, no need to release
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (close)
|
||||||
|
{
|
||||||
|
if (engines.remove(accessor.current()->first)) // If engine has already been deleted - nothing to do
|
||||||
|
PluginManagerInterfacePtr()->releasePlugin(engine);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
delete attInfo;
|
delete attInfo;
|
||||||
|
@ -70,6 +70,16 @@ namespace Jrd
|
|||||||
virtual bool checkCache(thread_db* tdbb) const;
|
virtual bool checkCache(thread_db* tdbb) const;
|
||||||
virtual void clearCache(thread_db* tdbb);
|
virtual void clearCache(thread_db* tdbb);
|
||||||
|
|
||||||
|
virtual ~Function()
|
||||||
|
{
|
||||||
|
delete fun_external;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void releaseExternal()
|
||||||
|
{
|
||||||
|
delete fun_external;
|
||||||
|
fun_external = NULL;
|
||||||
|
}
|
||||||
public:
|
public:
|
||||||
int (*fun_entrypoint)(); // function entrypoint
|
int (*fun_entrypoint)(); // function entrypoint
|
||||||
USHORT fun_inputs; // input arguments
|
USHORT fun_inputs; // input arguments
|
||||||
|
@ -367,6 +367,7 @@ void Routine::remove(thread_db* tdbb)
|
|||||||
setSecurityName("");
|
setSecurityName("");
|
||||||
setId(0);
|
setId(0);
|
||||||
setDefaultCount(0);
|
setDefaultCount(0);
|
||||||
|
releaseExternal();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -150,6 +150,7 @@ namespace Jrd
|
|||||||
void release(thread_db* tdbb);
|
void release(thread_db* tdbb);
|
||||||
void releaseStatement(thread_db* tdbb);
|
void releaseStatement(thread_db* tdbb);
|
||||||
void remove(thread_db* tdbb);
|
void remove(thread_db* tdbb);
|
||||||
|
virtual void releaseExternal() {};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual int getObjectType() const = 0;
|
virtual int getObjectType() const = 0;
|
||||||
|
@ -8286,8 +8286,6 @@ void TrigVector::release(thread_db* tdbb) const
|
|||||||
JrdStatement* stmt = t->statement;
|
JrdStatement* stmt = t->statement;
|
||||||
if (stmt)
|
if (stmt)
|
||||||
stmt->release(tdbb);
|
stmt->release(tdbb);
|
||||||
|
|
||||||
delete t->extTrigger;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
delete this;
|
delete this;
|
||||||
|
@ -165,6 +165,11 @@ public:
|
|||||||
extBody(p),
|
extBody(p),
|
||||||
extTrigger(NULL)
|
extTrigger(NULL)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
virtual ~Trigger()
|
||||||
|
{
|
||||||
|
delete extTrigger;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -248,9 +253,20 @@ public:
|
|||||||
prc_record_format = NULL;
|
prc_record_format = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual ~jrd_prc()
|
||||||
|
{
|
||||||
|
delete prc_external;
|
||||||
|
}
|
||||||
|
|
||||||
virtual bool checkCache(thread_db* tdbb) const;
|
virtual bool checkCache(thread_db* tdbb) const;
|
||||||
virtual void clearCache(thread_db* tdbb);
|
virtual void clearCache(thread_db* tdbb);
|
||||||
|
|
||||||
|
virtual void releaseExternal()
|
||||||
|
{
|
||||||
|
delete prc_external;
|
||||||
|
prc_external = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool reload(thread_db* tdbb); // impl is in met.epp
|
virtual bool reload(thread_db* tdbb); // impl is in met.epp
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user