You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by ka...@apache.org on 2007/09/19 11:56:24 UTC

svn commit: r577224 - /db/derby/code/trunk/java/engine/org/apache/derby/impl/services/cache/ConcurrentCache.java

Author: kahatlen
Date: Wed Sep 19 02:56:24 2007
New Revision: 577224

URL: http://svn.apache.org/viewvc?rev=577224&view=rev
Log:
DERBY-2911 (partial) Implement a buffer manager using java.util.concurrent classes

Changed signatures of ConcurrentCache.findFreeCacheable() and ConcurrentCache.removeEntry().

Modified:
    db/derby/code/trunk/java/engine/org/apache/derby/impl/services/cache/ConcurrentCache.java

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/services/cache/ConcurrentCache.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/services/cache/ConcurrentCache.java?rev=577224&r1=577223&r2=577224&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/services/cache/ConcurrentCache.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/services/cache/ConcurrentCache.java Wed Sep 19 02:56:24 2007
@@ -125,15 +125,16 @@
     }
 
     /**
-     * Find a free cacheable. If a free one cannot be found, allocate a new
-     * one.
+     * Find a free cacheable and give the specified entry a pointer to it. If
+     * a free cacheable cannot be found, allocate a new one. The entry must be
+     * locked by the current thread.
      *
-     * @return a cacheable with no identity
+     * @param entry the entry for which a <code>Cacheable</code> is needed
      */
-    private Cacheable findFreeCacheable() {
+    private void findFreeCacheable(CacheEntry entry) {
         // TODO - When the replacement algorithm has been implemented, we
         // should reuse a cacheable if possible.
-        return holderFactory.newCacheable(this);
+        entry.setCacheable(holderFactory.newCacheable(this));
     }
 
     /**
@@ -141,13 +142,12 @@
      * and made available for other entries. This method should only be called
      * if the entry is locked by the current thread.
      *
-     * @param entry the entry to remove from the cache
+     * @param key the identity of the entry to remove
      */
-    private void removeEntry(CacheEntry entry) {
-        Cacheable c = entry.getCacheable();
-        cache.remove(c.getIdentity());
+    private void removeEntry(Object key) {
+        CacheEntry entry = cache.remove(key);
+        entry.getCacheable().clearIdentity();
         entry.setCacheable(null);
-        c.clearIdentity();
         // TODO - When replacement policy is implemented, return the
         // cacheable to the free list
     }
@@ -173,17 +173,12 @@
             Cacheable item = entry.getCacheable();
             if (item == null) {
                 // not currently in the cache
-                Cacheable free = findFreeCacheable();
-                item = free.setIdentity(key);
+                findFreeCacheable(entry);
+                item = entry.getCacheable().setIdentity(key);
                 if (item == null) {
                     // Could not find an object with that identity. Remove its
                     // entry from the cache and return null.
-                    cache.remove(key);
-
-                    // TODO - When the replacement algorithm has been
-                    // implemented, the cacheable (free) should be returned to
-                    // the free list.
-
+                    removeEntry(key);
                     return null;
                 }
                 entry.setCacheable(item);
@@ -258,14 +253,16 @@
                 throw StandardException.newException(
                     SQLState.OBJECT_EXISTS_IN_CACHE, name, key);
             }
-            Cacheable free = findFreeCacheable();
-            Cacheable c = free.createIdentity(key, createParameter);
+            findFreeCacheable(entry);
+            Cacheable c =
+                    entry.getCacheable().createIdentity(key, createParameter);
             if (c != null) {
                 entry.setCacheable(c);
                 entry.keep();
             } else {
-                // TODO - When replacement policy is implemented, return the
-                // cacheable (free) to the free list
+                // Could not create an object with that identity. Remove the
+                // entry from the cache.
+                removeEntry(key);
             }
             return c;
         } finally {
@@ -305,7 +302,8 @@
      */
     public void remove(Cacheable item) throws StandardException {
         // The entry must be present, so we don't need to call getEntry().
-        CacheEntry entry = cache.get(item.getIdentity());
+        Object key = item.getIdentity();
+        CacheEntry entry = cache.get(key);
         entry.lock();
         try {
             if (SanityManager.DEBUG) {
@@ -313,7 +311,7 @@
             }
             entry.unkeepForRemove();
             item.clean(true);
-            removeEntry(entry);
+            removeEntry(key);
         } finally {
             entry.unlock();
         }
@@ -373,7 +371,7 @@
                     // If c is null, it's not in the cache and there's no need
                     // to remove it. If c is dirty, we can't remove it yet.
                     if (c != null && !c.isDirty()) {
-                        removeEntry(entry);
+                        removeEntry(c.getIdentity());
                     }
                 }
             } finally {
@@ -424,7 +422,7 @@
                     allRemoved = false;
                     continue;
                 }
-                removeEntry(entry);
+                removeEntry(c.getIdentity());
             } finally {
                 entry.unlock();
             }