more efficient synchronized methods
authorjprocter <Jim Procter>
Fri, 19 Jun 2009 10:09:19 +0000 (10:09 +0000)
committerjprocter <Jim Procter>
Fri, 19 Jun 2009 10:09:19 +0000 (10:09 +0000)
src/jalview/io/vamsas/DatastoreRegistry.java

index 21083dd..b58c90b 100644 (file)
@@ -51,55 +51,54 @@ public class DatastoreRegistry
     if (obj instanceof DatastoreItem)
     {
       log.debug("Returning DatastoreItem self reference.");// TODO: we could
-                                                           // store the update
-                                                           // hierarchy - so
-                                                           // retrieve parent
-                                                           // for obj.
+      // store the update
+      // hierarchy - so
+      // retrieve parent
+      // for obj.
       return (DatastoreItem) obj;
     }
     return (DatastoreItem) dsObjReg.get(obj);
   }
 
-  public void registerDsObj(DatastoreItem dsitem)
+  synchronized void registerDsObj(DatastoreItem dsitem)
   {
-    synchronized (dsItemReg)
+    Object[] dsregitem = (Object[]) dsItemReg.get(dsitem);
+    if (dsregitem == null)
     {
-      Object[] dsregitem = (Object[]) dsItemReg.get(dsitem);
-      if (dsregitem == null)
+      // create a new item entry
+      dsregitem = new Object[]
+      { dsitem.jvobj, dsitem.vobj };
+      dsItemReg.put(dsitem, dsregitem);
+      dsObjReg.put(dsitem.jvobj, dsitem);
+      dsObjReg.put(dsitem.vobj, dsitem);
+    }
+    else
+    {
+      // update registry for any changed references
+      // for the jvobject
+      if (dsitem.jvobj != dsregitem[0])
       {
-        // create a new item entry
-        dsregitem = new Object[]
-        { dsitem.jvobj, dsitem.vobj };
-        dsItemReg.put(dsitem, dsregitem);
+        // overwrite existing involved entries.
+        if (dsregitem[0] != null)
+        {
+          dsObjReg.remove(dsregitem[0]);
+        }
+        if ((dsregitem[0] = dsitem.jvobj) != null)
+        {
+          dsObjReg.put(dsregitem[0], dsitem);
+        }
       }
-      // atomic update of the jv and vobject references in the dsObjReg
-      synchronized (dsObjReg)
+      // and for the vobject
+      if (dsitem.vobj != dsregitem[1])
       {
-        // for the jvobject
-        if (dsitem.jvobj != dsregitem[0])
+        // overwrite existing involved entries.
+        if (dsregitem[1] != null)
         {
-          // overwrite existing involved entries.
-          if (dsregitem[0] != null)
-          {
-            dsObjReg.remove(dsregitem[0]);
-          }
-          if ((dsregitem[0] = dsitem.jvobj) != null)
-          {
-            dsObjReg.put(dsregitem[0], dsitem);
-          }
+          dsObjReg.remove(dsregitem[1]);
         }
-        // and for the vobject
-        if (dsitem.vobj != dsregitem[1])
+        if ((dsregitem[1] = dsitem.vobj) != null)
         {
-          // overwrite existing involved entries.
-          if (dsregitem[1] != null)
-          {
-            dsObjReg.remove(dsregitem[1]);
-          }
-          if ((dsregitem[1] = dsitem.vobj) != null)
-          {
-            dsObjReg.put(dsregitem[1], dsitem);
-          }
+          dsObjReg.put(dsregitem[1], dsitem);
         }
       }
     }
@@ -112,12 +111,12 @@ public class DatastoreRegistry
    * @return null or last known Object[] { jvobject, vobject } references for
    *         this dsitem
    */
-  public Object[] removeDsObj(DatastoreItem dsitem)
+  public synchronized Object[] removeDsObj(DatastoreItem dsitem)
   {
     Object[] dsregitem = null;
-    synchronized (dsItemReg)
+    // synchronized (dsItemReg)
     {
-      synchronized (dsObjReg)
+      // synchronized (dsObjReg)
       {
         dsregitem = (Object[]) dsItemReg.remove(dsitem);
         if (dsregitem != null)
@@ -152,7 +151,7 @@ public class DatastoreRegistry
       items = null;
       dsObjReg.clear();
     }
-    if (dsItemReg!=null)
+    if (dsItemReg != null)
     {
       dsItemReg.clear();
     }