From bc2594237b919678941b62038e7d16829e09b67f Mon Sep 17 00:00:00 2001 From: Andreas Sewe Date: Tue, 7 May 2013 11:21:37 +0200 Subject: [PATCH] Made BytecodeClass.computeMethodMap thread-safe --- .../ibm/wala/classLoader/BytecodeClass.java | 48 +++++++++---------- .../com/ibm/wala/classLoader/JVMClass.java | 12 ++--- 2 files changed, 29 insertions(+), 31 deletions(-) diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java index 0f943dc5a..dea566146 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/BytecodeClass.java @@ -78,7 +78,7 @@ public abstract class BytecodeClass implements IClass { * * TODO: get rid of this for classes (though keep it for interfaces) instead ... use a VMT. */ - protected Map methodMap; + protected volatile Map methodMap; /** * A mapping from Selector to IMethod used to cache method lookups from superclasses @@ -385,13 +385,11 @@ public abstract class BytecodeClass implements IClass { * @see com.ibm.wala.classLoader.IClass#getDeclaredMethods() */ public Collection getDeclaredMethods() { - if (methodMap == null) { - try { - computeMethodMap(); - } catch (InvalidClassFileException e) { - e.printStackTrace(); - Assertions.UNREACHABLE(); - } + try { + computeMethodMap(); + } catch (InvalidClassFileException e) { + e.printStackTrace(); + Assertions.UNREACHABLE(); } return Collections.unmodifiableCollection(methodMap.values()); } @@ -400,13 +398,11 @@ public abstract class BytecodeClass implements IClass { * @see com.ibm.wala.classLoader.IClass#getMethod(com.ibm.wala.types.Selector) */ public IMethod getMethod(Selector selector) { - if (methodMap == null) { - try { - computeMethodMap(); - } catch (InvalidClassFileException e1) { - e1.printStackTrace(); - Assertions.UNREACHABLE(); - } + try { + computeMethodMap(); + } catch (InvalidClassFileException e1) { + e1.printStackTrace(); + Assertions.UNREACHABLE(); } // my methods + cached parent stuff @@ -555,15 +551,19 @@ public abstract class BytecodeClass implements IClass { */ protected void computeMethodMap() throws InvalidClassFileException { if (methodMap == null) { - IMethod[] methods = computeDeclaredMethods(); - if (methods.length > 5) { - methodMap = HashMapFactory.make(methods.length); - } else { - methodMap = new SmallMap(); - } - for (int i = 0; i < methods.length; i++) { - IMethod m = methods[i]; - methodMap.put(m.getReference().getSelector(), m); + synchronized (this) { + if (methodMap == null) { + IMethod[] methods = computeDeclaredMethods(); + if (methods.length > 5) { + methodMap = HashMapFactory.make(methods.length); + } else { + methodMap = new SmallMap(); + } + for (int i = 0; i < methods.length; i++) { + IMethod m = methods[i]; + methodMap.put(m.getReference().getSelector(), m); + } + } } } } diff --git a/com.ibm.wala.core/src/com/ibm/wala/classLoader/JVMClass.java b/com.ibm.wala.core/src/com/ibm/wala/classLoader/JVMClass.java index 35ed44c38..f21516710 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/classLoader/JVMClass.java +++ b/com.ibm.wala.core/src/com/ibm/wala/classLoader/JVMClass.java @@ -64,13 +64,11 @@ public abstract class JVMClass extends BytecodeClass * @see com.ibm.wala.classLoader.IClass#getClassInitializer() */ public IMethod getClassInitializer() { - if (methodMap == null) { - try { - computeMethodMap(); - } catch (InvalidClassFileException e) { - e.printStackTrace(); - Assertions.UNREACHABLE(); - } + try { + computeMethodMap(); + } catch (InvalidClassFileException e) { + e.printStackTrace(); + Assertions.UNREACHABLE(); } return methodMap.get(MethodReference.clinitSelector); }