You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2007/05/04 20:59:33 UTC

svn commit: r535352 - in /cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne: CayenneContext.java access/DataContext.java

Author: aadamchik
Date: Fri May  4 11:59:19 2007
New Revision: 535352

URL: http://svn.apache.org/viewvc?view=rev&rev=535352
Log:
CAY-786 - Race condition in DataContext.localObject()
applying fix to trunk... will be testing it in a live app before applying to the stable branches

Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/CayenneContext.java
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/CayenneContext.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/CayenneContext.java?view=diff&rev=535352&r1=535351&r2=535352
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/CayenneContext.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/CayenneContext.java Fri May  4 11:59:19 2007
@@ -403,12 +403,15 @@
             // breaking encapsulation of the DataChannel to detect where in the hierarchy
             // this context is.
 
-            Persistent localObject = (Persistent) descriptor.createObject();
+            Persistent localObject;
+            synchronized (getGraphManager()) {
+                localObject = (Persistent) descriptor.createObject();
 
-            localObject.setObjectContext(this);
-            localObject.setObjectId(id);
+                localObject.setObjectContext(this);
+                localObject.setObjectId(id);
 
-            getGraphManager().registerNode(id, localObject);
+                getGraphManager().registerNode(id, localObject);
+            }
 
             if (prototype != null) {
                 localObject.setPersistenceState(PersistenceState.COMMITTED);

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java?view=diff&rev=535352&r1=535351&r2=535352
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java Fri May  4 11:59:19 2007
@@ -1694,12 +1694,16 @@
         // create and merge into a new object
         else {
 
-            Persistent localObject = (Persistent) descriptor.createObject();
+            Persistent localObject;
 
-            localObject.setObjectContext(this);
-            localObject.setObjectId(id);
+            synchronized (getGraphManager()) {
+                localObject = (Persistent) descriptor.createObject();
 
-            getGraphManager().registerNode(id, localObject);
+                localObject.setObjectContext(this);
+                localObject.setObjectId(id);
+
+                getGraphManager().registerNode(id, localObject);
+            }
 
             if (prototype != null
                     && ((Persistent) prototype).getPersistenceState() != PersistenceState.HOLLOW) {