From e7661ada575fa14120282db49255d1c51490b4f0 Mon Sep 17 00:00:00 2001 From: ghidra1 Date: Mon, 19 Oct 2020 15:46:38 -0400 Subject: [PATCH] GP-281 Corrected unrelease lock error due caused by exception --- .../database/data/DataTypeManagerDB.java | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeManagerDB.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeManagerDB.java index 329ccb1f4f..ec17e24dbc 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeManagerDB.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeManagerDB.java @@ -805,14 +805,18 @@ abstract public class DataTypeManagerDB implements DataTypeManager { return resolvedDataType; } finally { - if (isResolveCacheOwner) { - flushResolveQueue(true); + try { + if (isResolveCacheOwner) { + flushResolveQueue(true); // may throw exception - incomplete resolve + } } - if (isEquivalenceCacheOwner) { - clearEquivalenceCache(); + finally { + if (isEquivalenceCacheOwner) { + clearEquivalenceCache(); + } + currentHandler = originalHandler; + lock.release(); } - currentHandler = originalHandler; - lock.release(); } } @@ -3815,28 +3819,28 @@ abstract public class DataTypeManagerDB implements DataTypeManager { } void flushResolveQueue(boolean deactivateCache) { - if (resolveQueue == null) { + try { + if (resolveQueue != null) { + DataTypeConflictHandler handler = getDependencyConflictHandler(); + while (!resolveQueue.isEmpty()) { + ResolvePair resolvePair = resolveQueue.pollFirst(); + DataTypeDB resolvedDt = resolvePair.resolvedDt; + try { + resolvedDt.postPointerResolve(resolvePair.definitionDt, handler); + } + // TODO: catch exceptions if needed + finally { + resolvedDt.resolving = false; + resolvedDt.pointerPostResolveRequired = false; + } + } + } + } + finally { + resolveQueue = null; if (deactivateCache) { resolveCache = null; } - return; - } - DataTypeConflictHandler handler = getDependencyConflictHandler(); - while (!resolveQueue.isEmpty()) { - ResolvePair resolvePair = resolveQueue.pollFirst(); - DataTypeDB resolvedDt = resolvePair.resolvedDt; - try { - resolvedDt.postPointerResolve(resolvePair.definitionDt, handler); - } - // TODO: catch exceptions if needed - finally { - resolvedDt.resolving = false; - resolvedDt.pointerPostResolveRequired = false; - } - } - resolveQueue = null; - if (deactivateCache) { - resolveCache = null; } }