This is an automated email from the ASF dual-hosted git repository.

jgrassel pushed a commit to branch 2.2.x
in repository https://gitbox.apache.org/repos/asf/openjpa.git


The following commit(s) were added to refs/heads/2.2.x by this push:
     new fe80c98  OPENJPA_2817: Update PCTransformer to be thread-wise for 
reentrancy.
     new 172c084  Merge pull request #64 from jgrassel/OPENJPA_2817_22X
fe80c98 is described below

commit fe80c984b36a63625a921da6cee5c494bba3dce3
Author: Joe Grassel <jgras...@apache.org>
AuthorDate: Tue Jun 30 09:27:25 2020 -0500

    OPENJPA_2817: Update PCTransformer to be thread-wise for reentrancy.
    
    Signed-off-by: Joe Grassel <jgras...@apache.org>
---
 .../org/apache/openjpa/enhance/PCClassFileTransformer.java | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git 
a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCClassFileTransformer.java
 
b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCClassFileTransformer.java
index b04bc23..567db23 100644
--- 
a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCClassFileTransformer.java
+++ 
b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCClassFileTransformer.java
@@ -49,6 +49,7 @@ public class PCClassFileTransformer
 
     private static final Localizer _loc = Localizer.forPackage
         (PCClassFileTransformer.class);
+    private static final ThreadLocal<Boolean> _isTransformingInLocalThread = 
new ThreadLocal(); // OJ-2817
 
     private final MetaDataRepository _repos;
     private final PCEnhancer.Flags _flags;
@@ -120,12 +121,17 @@ public class PCClassFileTransformer
         // prevent re-entrant calls, which can occur if the enhancing
         // loader is used to also load OpenJPA libraries; this is to prevent 
         // recursive enhancement attempts for internal openjpa libraries
-        if (_transforming)
+        Boolean transforming = _isTransformingInLocalThread.get();
+        if (transforming != null) {
             return null;
-
-        _transforming = true;
+        }
+        _isTransformingInLocalThread.set(Boolean.TRUE);
         
-        return transform0(className, redef, bytes);
+        try {
+            return transform0(className, redef, bytes);
+        } finally {
+            _isTransformingInLocalThread.remove();
+        }
     }
 
     /**

Reply via email to