Fix bug in JIT source purging: do not nullify attached context list after purge
This commit is contained in:
@ -506,19 +506,26 @@ extern void PurgeJitContext(JitContext* jitContext, uint64_t relationId)
|
||||
|
||||
// cleanup keys(s)
|
||||
if ((jitContext->m_table != nullptr) && (jitContext->m_table->GetTableExId() == relationId)) {
|
||||
MOT_LOG_TRACE("Purging JIT context %p primary keys by relation id %" PRIu64, jitContext, relationId);
|
||||
CleanupJitContextPrimary(jitContext);
|
||||
}
|
||||
|
||||
// cleanup JOIN keys(s)
|
||||
if ((jitContext->m_innerTable != nullptr) && (jitContext->m_innerTable->GetTableExId() == relationId)) {
|
||||
MOT_LOG_TRACE("Purging JIT context %p inner keys by relation id %" PRIu64, jitContext, relationId);
|
||||
CleanupJitContextInner(jitContext);
|
||||
}
|
||||
|
||||
// cleanup sub-query keys
|
||||
for (uint32_t i = 0; i < jitContext->m_subQueryCount; ++i) {
|
||||
JitContext::SubQueryData* subQueryData = &jitContext->m_subQueryData[i];
|
||||
MOT_LOG_TRACE("Cleaning up sub-query %u data in JIT context %p", i, jitContext);
|
||||
CleanupJitContextSubQueryData(subQueryData);
|
||||
if ((subQueryData->m_table != nullptr) && (subQueryData->m_table->GetTableExId() == relationId)) {
|
||||
MOT_LOG_TRACE("Purging sub-query %u data in JIT context %p by relation id %" PRIu64,
|
||||
i,
|
||||
jitContext,
|
||||
relationId);
|
||||
CleanupJitContextSubQueryData(subQueryData);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -564,7 +571,9 @@ static void CleanupJitContextInner(JitContext* jitContext)
|
||||
|
||||
static void CleanupJitContextSubQueryDataArray(JitContext* jitContext)
|
||||
{
|
||||
MOT_LOG_TRACE("Cleaning up sub-query data array in JIT context %p", jitContext);
|
||||
if (jitContext->m_subQueryData != nullptr) {
|
||||
MOT_LOG_TRACE("Cleaning up sub-query data array in JIT context %p", jitContext);
|
||||
}
|
||||
for (uint32_t i = 0; i < jitContext->m_subQueryCount; ++i) {
|
||||
JitContext::SubQueryData* subQueryData = &jitContext->m_subQueryData[i];
|
||||
MOT_LOG_TRACE("Cleaning up sub-query %u data in JIT context %p", i, jitContext);
|
||||
|
||||
@ -452,6 +452,7 @@ extern int JitExecQuery(
|
||||
|
||||
extern void PurgeJitSourceCache(uint64_t relationId)
|
||||
{
|
||||
MOT_LOG_TRACE("Purging JIT source map by relation id %" PRIu64, relationId);
|
||||
(void)PurgeJitSourceMap(relationId);
|
||||
}
|
||||
|
||||
|
||||
@ -84,9 +84,18 @@ extern bool InitJitSource(JitSource* jitSource, const char* queryString)
|
||||
extern void DestroyJitSource(JitSource* jitSource)
|
||||
{
|
||||
MOT_LOG_TRACE("Destroying JIT source %p with query string: %s", jitSource, jitSource->_query_string);
|
||||
if (jitSource->m_contextList != nullptr) {
|
||||
MOT_LOG_WARN("JIT source still contains registered JIT context objects, while destroying JIT source");
|
||||
JitContext* jitContext = jitSource->m_contextList;
|
||||
while (jitContext != nullptr) {
|
||||
jitContext->m_jitSource = nullptr; // prevent crash during DestroyJitContext()
|
||||
jitContext = jitContext->m_nextInSource;
|
||||
}
|
||||
}
|
||||
|
||||
if (jitSource->_source_jit_context != nullptr) {
|
||||
// this code is executed during shutdown, so the underlying
|
||||
// GsCodeGen object was already destroyed the top memory context
|
||||
// GsCodeGen object was already destroyed by the top memory context
|
||||
DestroyJitContext(jitSource->_source_jit_context);
|
||||
jitSource->_source_jit_context = NULL;
|
||||
}
|
||||
@ -288,6 +297,7 @@ static void SetJitSourceStatus(JitSource* jitSource, JitContext* readySourceJitC
|
||||
}
|
||||
jitSource->m_contextList = nullptr;
|
||||
} else { // expired context: cleanup all related JIT context objects
|
||||
MOT_LOG_TRACE("Purging all JIT context objects by relation id %" PRIu64, relationId);
|
||||
JitSourcePurgeContextList(jitSource, relationId);
|
||||
}
|
||||
}
|
||||
@ -344,7 +354,6 @@ static void JitSourcePurgeContextList(JitSource* jitSource, uint64_t relationId)
|
||||
PurgeJitContext(itr, relationId);
|
||||
itr = itr->m_nextInSource;
|
||||
}
|
||||
jitSource->m_contextList = nullptr;
|
||||
}
|
||||
|
||||
static void RemoveJitSourceContextImpl(JitSource* jitSource, JitContext* jitContext)
|
||||
|
||||
Reference in New Issue
Block a user