pull allocation/deallocation up to the arena managers
add methods to print the tables
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ArenaManager.java.txt b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ArenaManager.java.txt
index 77bb3d5..cf14280 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ArenaManager.java.txt
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ArenaManager.java.txt
@@ -4,13 +4,15 @@
 
 public class @E@ArenaManager {
     
+    private final int noArenas;
     private ArrayList<@E@MemoryManager> arenas;
     private volatile int nextArena; 
     private ThreadLocal<LocalManager> local;    
     
     public @E@ArenaManager() {
-        int noArenas = Runtime.getRuntime().availableProcessors() * 2;
+        noArenas = Runtime.getRuntime().availableProcessors() * 2;
         arenas = new ArrayList<@E@MemoryManager>(noArenas);
+        nextArena = 0;
         local = new ThreadLocal<LocalManager>() {
             @Override
             protected LocalManager initialValue() {
@@ -27,6 +29,18 @@
         return i & 0xffffff;
     }
 
+    public int allocate() {
+        final LocalManager localManager = local.get();
+        int result = localManager.arenaId << 24;
+        result |= localManager.mgr.allocate();
+        return result;
+    }
+    
+    public void deallocate(int slotNum) {
+        final int arenaId = arenaId(slotNum);
+        get(arenaId).deallocate(localId(slotNum));
+    }
+    
     public synchronized LocalManager getNext() {
         if (nextArena >= arenas.size()) { 
             arenas.add(new @E@MemoryManager());
@@ -35,7 +49,7 @@
         LocalManager res = new LocalManager();
         res.mgr = mgr;
         res.arenaId = nextArena;
-        nextArena = (nextArena + 1) % arenas.size();
+        nextArena = (nextArena + 1) % noArenas;
         return res;
     }
     
@@ -53,4 +67,16 @@
         int arenaId;
         @E@MemoryManager mgr;
     }
+    
+    StringBuffer append(StringBuffer sb) {
+        for (int i = 0; i < arenas.size(); ++i) {
+            sb.append("++++ arena ").append(i).append(" ++++\n");
+            arenas.get(i).append(sb);
+        }
+        return sb;
+    }
+    
+    public String toString() {
+        return append(new StringBuffer()).toString();
+    }
 }
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ConcurrentLockManager.java b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ConcurrentLockManager.java
index 6e9ee9b..dbb56c5 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ConcurrentLockManager.java
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ConcurrentLockManager.java
@@ -105,10 +105,9 @@
         
         if (resSlot == -1) {
             // we don't know about this resource, let's alloc a slot
-            ResourceMemoryManager resMgr = resArenaMgr.local();
-            resSlot = resMgr.allocate();
-            resMgr.setDatasetId(resSlot, datasetId.getId());
-            resMgr.setPkHashVal(resSlot, entityHashValue);
+            resSlot = resArenaMgr.allocate();
+            resArenaMgr.setDatasetId(resSlot, datasetId.getId());
+            resArenaMgr.setPkHashVal(resSlot, entityHashValue);
 
             if (group.firstResourceIndex.get() == -1) {
                 group.firstResourceIndex.set(resSlot);
@@ -118,7 +117,7 @@
         // 2) create a request entry
 
         int jobId = txnContext.getJobId().getId();
-        int reqSlot = reqArenaMgr.local().allocate();
+        int reqSlot = reqArenaMgr.allocate();
         reqArenaMgr.setResourceId(reqSlot, resSlot);
         reqArenaMgr.setLockMode(reqSlot, lockMode); // lock mode is a byte!!
         reqArenaMgr.setJobId(reqSlot, jobId);
@@ -237,7 +236,7 @@
         }
         
         // deallocate request
-        reqArenaMgr.local().deallocate(holder);
+        reqArenaMgr.deallocate(holder);
         // deallocate resource or fix max lock mode
         if (resourceNotUsed(resource)) {
             int prev = group.firstResourceIndex.get();
@@ -249,7 +248,7 @@
                 }
                 resArenaMgr.setNext(prev, resArenaMgr.getNext(resource));
             }
-            resArenaMgr.local().deallocate(resource);
+            resArenaMgr.deallocate(resource);
         } else {
             final int oldMaxMode = resArenaMgr.getMaxMode(resource);
             final int newMaxMode = getNewMaxMode(resource, oldMaxMode);
@@ -297,16 +296,14 @@
     
     private int findResourceInGroup(ResourceGroup group, int dsId, int entityHashValue) {
         int resSlot = group.firstResourceIndex.get();
-        // we're looking in the local one as that should be set correctly // TODO make sure! 
-        ResourceMemoryManager resMgr = resArenaMgr.local();
         while (resSlot != -1) {
             // either we already have a lock on this resource or we have a 
             // hash collision
-            if (resMgr.getDatasetId(resSlot) == dsId && 
-                    resMgr.getPkHashVal(resSlot) == entityHashValue) {
+            if (resArenaMgr.getDatasetId(resSlot) == dsId && 
+                    resArenaMgr.getPkHashVal(resSlot) == entityHashValue) {
                 return resSlot;
             } else {
-                resSlot = resMgr.getNext(resSlot);
+                resSlot = resArenaMgr.getNext(resSlot);
             }
         }
         return -1;        
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/Generator.java b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/Generator.java
index 83bac42..a87d321 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/Generator.java
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/Generator.java
@@ -30,9 +30,9 @@
         
         StringBuilder sb = new StringBuilder();
 
-        //generateMemoryManagerSource(request, sb);
+        generateMemoryManagerSource(request, sb);
         //generateMemoryManagerSource(resource, sb);
-        generateArenaManagerSource(request, sb);
+        //generateArenaManagerSource(request, sb);
         //generateArenaManagerSource(resource, sb);
 
         System.out.println(sb.toString());
@@ -70,6 +70,9 @@
                         final Field field = resource.fields.get(i);
                         field.appendInitializers(sb, indent, 3);
                     }
+                } else if (line.contains("@PRINT_BUFFER@")) {
+                    resource.appendBufferPrinter(sb, indent, 3);
+                    sb.append('\n');
                 } else {
                   sb.append(line).append('\n');
                 }
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/RecordType.java b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/RecordType.java
index 1d0b41e..0b6c255 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/RecordType.java
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/RecordType.java
@@ -216,6 +216,14 @@
         }
     }
     
+    static String padRight(String s, int n) {
+        return String.format("%1$-" + n + "s", s);  
+    }
+
+    static String padLeft(String s, int n) {
+        return String.format("%1$" + n + "s", s);  
+    }
+    
     StringBuilder appendConstants(StringBuilder sb, String indent, int level) {
         sb = indent(sb, indent, level);
         sb.append("public static int ITEM_SIZE = ")
@@ -231,4 +239,47 @@
         }
         return sb;
     }
+    
+    StringBuilder appendBufferPrinter(StringBuilder sb, String indent, int level) {
+        int maxNameWidth = 0;
+        for (int i = 0; i < fields.size(); ++i) {
+            int width = fields.get(i).name.length();
+            if (width > maxNameWidth) {
+                maxNameWidth = width;
+            }
+        }
+        for (int i = 0; i < fields.size(); ++i) {
+            final Field field = fields.get(i);
+            sb = indent(sb, indent, level);
+            sb.append("sb.append(\"")
+              .append(padRight(field.name, maxNameWidth))
+              .append(" | \");\n");
+            sb = indent(sb, indent, level);
+            sb.append("for (int i = 0; i < occupiedSlots; ++i) {\n");
+            sb = indent(sb, indent, level + 1);
+            sb.append(name(field.type))
+              .append(" value = bb.")
+              .append(bbGetter(field.type))
+              .append("(i * ITEM_SIZE + ")
+              .append(field.offsetName())
+              .append(");\n");
+            sb = indent(sb, indent, level + 1);
+            sb.append("sb.append(String.format(\"%1$2x\", ")
+              .append(name)
+              .append("ArenaManager.arenaId(value)));\n");
+            sb = indent(sb, indent, level + 1);
+            sb.append("sb.append(\" \");\n");
+            sb = indent(sb, indent, level + 1);
+            sb.append("sb.append(String.format(\"%1$6x\", ")
+              .append(name)
+              .append("ArenaManager.localId(value)));\n");
+            sb = indent(sb, indent, level + 1);
+            sb.append("sb.append(\" | \");\n");
+            sb = indent(sb, indent, level);
+            sb.append("}\n");
+            sb = indent(sb, indent, level);
+            sb.append("sb.append(\"\\n\");\n");
+        }
+        return sb;
+    }
 }
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/RequestArenaManager.java b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/RequestArenaManager.java
index 23260ba..0247dc7 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/RequestArenaManager.java
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/RequestArenaManager.java
@@ -4,13 +4,15 @@
 
 public class RequestArenaManager {
     
+    private final int noArenas;
     private ArrayList<RequestMemoryManager> arenas;
     private volatile int nextArena; 
     private ThreadLocal<LocalManager> local;    
     
     public RequestArenaManager() {
-        int noArenas = Runtime.getRuntime().availableProcessors() * 2;
+        noArenas = Runtime.getRuntime().availableProcessors() * 2;
         arenas = new ArrayList<RequestMemoryManager>(noArenas);
+        nextArena = 0;
         local = new ThreadLocal<LocalManager>() {
             @Override
             protected LocalManager initialValue() {
@@ -27,6 +29,18 @@
         return i & 0xffffff;
     }
 
+    public int allocate() {
+        final LocalManager localManager = local.get();
+        int result = localManager.arenaId << 24;
+        result |= localManager.mgr.allocate();
+        return result;
+    }
+    
+    public void deallocate(int slotNum) {
+        final int arenaId = arenaId(slotNum);
+        get(arenaId).deallocate(localId(slotNum));
+    }
+    
     public synchronized LocalManager getNext() {
         if (nextArena >= arenas.size()) { 
             arenas.add(new RequestMemoryManager());
@@ -35,7 +49,7 @@
         LocalManager res = new LocalManager();
         res.mgr = mgr;
         res.arenaId = nextArena;
-        nextArena = (nextArena + 1) % arenas.size();
+        nextArena = (nextArena + 1) % noArenas;
         return res;
     }
     
@@ -160,5 +174,17 @@
         int arenaId;
         RequestMemoryManager mgr;
     }
+    
+    StringBuffer append(StringBuffer sb) {
+        for (int i = 0; i < arenas.size(); ++i) {
+            sb.append("++++ arena ").append(i).append(" ++++\n");
+            arenas.get(i).append(sb);
+        }
+        return sb;
+    }
+    
+    public String toString() {
+        return append(new StringBuffer()).toString();
+    }
 }
 
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/RequestMemoryManager.java b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/RequestMemoryManager.java
index 36ca35a..e0bee72 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/RequestMemoryManager.java
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/RequestMemoryManager.java
@@ -209,6 +209,24 @@
     }
 
     
+    StringBuffer append(StringBuffer sb) {
+        sb.append("+++ current: ")
+          .append(current)
+          .append(" no occupied slots: ")
+          .append(occupiedSlots)
+          .append(" +++\n");
+        for (int i = 0; i < buffers.size(); ++i) {
+            buffers.get(i).append(sb);
+            sb.append("\n");
+        }
+        return sb;
+    }
+    
+    public String toString() {
+        StringBuffer sb = new StringBuffer();
+        append(sb);
+        return sb.toString();
+    }
 
     static class Buffer {
         private ByteBuffer bb;
@@ -275,6 +293,76 @@
         public void setNextFreeSlot(int slotNum, int nextFreeSlot) {
             bb.putInt(slotNum * ITEM_SIZE + NEXT_FREE_SLOT_OFFSET, nextFreeSlot);
         }
+
+        StringBuffer append(StringBuffer sb) {
+            sb.append("++ free slot: ")
+              .append(freeSlotNum)
+              .append(" no occupied slots: ")
+              .append(occupiedSlots)
+              .append(" ++\n");
+            sb.append("resource id      | ");
+            for (int i = 0; i < occupiedSlots; ++i) {
+                int value = bb.getInt(i * ITEM_SIZE + RESOURCE_ID_OFF);
+                sb.append(String.format("%1$2x", RequestArenaManager.arenaId(value)));
+                sb.append(" ");
+                sb.append(String.format("%1$6x", RequestArenaManager.localId(value)));
+                sb.append(" | ");
+            }
+            sb.append("\n");
+            sb.append("lock mode        | ");
+            for (int i = 0; i < occupiedSlots; ++i) {
+                int value = bb.getInt(i * ITEM_SIZE + LOCK_MODE_OFF);
+                sb.append(String.format("%1$2x", RequestArenaManager.arenaId(value)));
+                sb.append(" ");
+                sb.append(String.format("%1$6x", RequestArenaManager.localId(value)));
+                sb.append(" | ");
+            }
+            sb.append("\n");
+            sb.append("job id           | ");
+            for (int i = 0; i < occupiedSlots; ++i) {
+                int value = bb.getInt(i * ITEM_SIZE + JOB_ID_OFF);
+                sb.append(String.format("%1$2x", RequestArenaManager.arenaId(value)));
+                sb.append(" ");
+                sb.append(String.format("%1$6x", RequestArenaManager.localId(value)));
+                sb.append(" | ");
+            }
+            sb.append("\n");
+            sb.append("prev job request | ");
+            for (int i = 0; i < occupiedSlots; ++i) {
+                int value = bb.getInt(i * ITEM_SIZE + PREV_JOB_REQUEST_OFF);
+                sb.append(String.format("%1$2x", RequestArenaManager.arenaId(value)));
+                sb.append(" ");
+                sb.append(String.format("%1$6x", RequestArenaManager.localId(value)));
+                sb.append(" | ");
+            }
+            sb.append("\n");
+            sb.append("next job request | ");
+            for (int i = 0; i < occupiedSlots; ++i) {
+                int value = bb.getInt(i * ITEM_SIZE + NEXT_JOB_REQUEST_OFF);
+                sb.append(String.format("%1$2x", RequestArenaManager.arenaId(value)));
+                sb.append(" ");
+                sb.append(String.format("%1$6x", RequestArenaManager.localId(value)));
+                sb.append(" | ");
+            }
+            sb.append("\n");
+            sb.append("next request     | ");
+            for (int i = 0; i < occupiedSlots; ++i) {
+                int value = bb.getInt(i * ITEM_SIZE + NEXT_REQUEST_OFF);
+                sb.append(String.format("%1$2x", RequestArenaManager.arenaId(value)));
+                sb.append(" ");
+                sb.append(String.format("%1$6x", RequestArenaManager.localId(value)));
+                sb.append(" | ");
+            }
+            sb.append("\n");
+
+            return sb;
+        }
+        
+        public String toString() {
+            StringBuffer sb = new StringBuffer();
+            append(sb);
+            return sb.toString();
+        }
     }
     
 }
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ResourceArenaManager.java b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ResourceArenaManager.java
index 2212b50..f38b6ce 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ResourceArenaManager.java
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ResourceArenaManager.java
@@ -4,13 +4,15 @@
 
 public class ResourceArenaManager {
     
+    private final int noArenas;
     private ArrayList<ResourceMemoryManager> arenas;
     private volatile int nextArena; 
     private ThreadLocal<LocalManager> local;    
     
     public ResourceArenaManager() {
-        int noArenas = Runtime.getRuntime().availableProcessors() * 2;
+        noArenas = Runtime.getRuntime().availableProcessors() * 2;
         arenas = new ArrayList<ResourceMemoryManager>(noArenas);
+        nextArena = 0;
         local = new ThreadLocal<LocalManager>() {
             @Override
             protected LocalManager initialValue() {
@@ -27,6 +29,18 @@
         return i & 0xffffff;
     }
 
+    public int allocate() {
+        final LocalManager localManager = local.get();
+        int result = localManager.arenaId << 24;
+        result |= localManager.mgr.allocate();
+        return result;
+    }
+    
+    public void deallocate(int slotNum) {
+        final int arenaId = arenaId(slotNum);
+        get(arenaId).deallocate(localId(slotNum));
+    }
+    
     public synchronized LocalManager getNext() {
         if (nextArena >= arenas.size()) { 
             arenas.add(new ResourceMemoryManager());
@@ -35,7 +49,7 @@
         LocalManager res = new LocalManager();
         res.mgr = mgr;
         res.arenaId = nextArena;
-        nextArena = (nextArena + 1) % arenas.size();
+        nextArena = (nextArena + 1) % noArenas;
         return res;
     }
     
@@ -178,5 +192,17 @@
         int arenaId;
         ResourceMemoryManager mgr;
     }
+    
+    StringBuffer append(StringBuffer sb) {
+        for (int i = 0; i < arenas.size(); ++i) {
+            sb.append("++++ arena ").append(i).append(" ++++\n");
+            arenas.get(i).append(sb);
+        }
+        return sb;
+    }
+    
+    public String toString() {
+        return append(new StringBuffer()).toString();
+    }
 }
 
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ResourceMemoryManager.java b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ResourceMemoryManager.java
index ffe973f..a61c221 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ResourceMemoryManager.java
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ResourceMemoryManager.java
@@ -220,6 +220,24 @@
     }
 
     
+    StringBuffer append(StringBuffer sb) {
+        sb.append("+++ current: ")
+          .append(current)
+          .append(" no occupied slots: ")
+          .append(occupiedSlots)
+          .append(" +++\n");
+        for (int i = 0; i < buffers.size(); ++i) {
+            buffers.get(i).append(sb);
+            sb.append("\n");
+        }
+        return sb;
+    }
+    
+    public String toString() {
+        StringBuffer sb = new StringBuffer();
+        append(sb);
+        return sb.toString();
+    }
 
     static class Buffer {
         private ByteBuffer bb;
@@ -290,6 +308,85 @@
         public void setNextFreeSlot(int slotNum, int nextFreeSlot) {
             bb.putInt(slotNum * ITEM_SIZE + NEXT_FREE_SLOT_OFFSET, nextFreeSlot);
         }
+
+        StringBuffer append(StringBuffer sb) {
+            sb.append("++ free slot: ")
+              .append(freeSlotNum)
+              .append(" no occupied slots: ")
+              .append(occupiedSlots)
+              .append(" ++\n");
+            sb.append("last holder    | ");
+            for (int i = 0; i < occupiedSlots; ++i) {
+                int value = bb.getInt(i * ITEM_SIZE + LAST_HOLDER_OFF);
+                sb.append(String.format("%1$2x", ResourceArenaManager.arenaId(value)));
+                sb.append(" ");
+                sb.append(String.format("%1$6x", ResourceArenaManager.localId(value)));
+                sb.append(" | ");
+            }
+            sb.append("\n");
+            sb.append("first waiter   | ");
+            for (int i = 0; i < occupiedSlots; ++i) {
+                int value = bb.getInt(i * ITEM_SIZE + FIRST_WAITER_OFF);
+                sb.append(String.format("%1$2x", ResourceArenaManager.arenaId(value)));
+                sb.append(" ");
+                sb.append(String.format("%1$6x", ResourceArenaManager.localId(value)));
+                sb.append(" | ");
+            }
+            sb.append("\n");
+            sb.append("first upgrader | ");
+            for (int i = 0; i < occupiedSlots; ++i) {
+                int value = bb.getInt(i * ITEM_SIZE + FIRST_UPGRADER_OFF);
+                sb.append(String.format("%1$2x", ResourceArenaManager.arenaId(value)));
+                sb.append(" ");
+                sb.append(String.format("%1$6x", ResourceArenaManager.localId(value)));
+                sb.append(" | ");
+            }
+            sb.append("\n");
+            sb.append("max mode       | ");
+            for (int i = 0; i < occupiedSlots; ++i) {
+                int value = bb.getInt(i * ITEM_SIZE + MAX_MODE_OFF);
+                sb.append(String.format("%1$2x", ResourceArenaManager.arenaId(value)));
+                sb.append(" ");
+                sb.append(String.format("%1$6x", ResourceArenaManager.localId(value)));
+                sb.append(" | ");
+            }
+            sb.append("\n");
+            sb.append("dataset id     | ");
+            for (int i = 0; i < occupiedSlots; ++i) {
+                int value = bb.getInt(i * ITEM_SIZE + DATASET_ID_OFF);
+                sb.append(String.format("%1$2x", ResourceArenaManager.arenaId(value)));
+                sb.append(" ");
+                sb.append(String.format("%1$6x", ResourceArenaManager.localId(value)));
+                sb.append(" | ");
+            }
+            sb.append("\n");
+            sb.append("pk hash val    | ");
+            for (int i = 0; i < occupiedSlots; ++i) {
+                int value = bb.getInt(i * ITEM_SIZE + PK_HASH_VAL_OFF);
+                sb.append(String.format("%1$2x", ResourceArenaManager.arenaId(value)));
+                sb.append(" ");
+                sb.append(String.format("%1$6x", ResourceArenaManager.localId(value)));
+                sb.append(" | ");
+            }
+            sb.append("\n");
+            sb.append("next           | ");
+            for (int i = 0; i < occupiedSlots; ++i) {
+                int value = bb.getInt(i * ITEM_SIZE + NEXT_OFF);
+                sb.append(String.format("%1$2x", ResourceArenaManager.arenaId(value)));
+                sb.append(" ");
+                sb.append(String.format("%1$6x", ResourceArenaManager.localId(value)));
+                sb.append(" | ");
+            }
+            sb.append("\n");
+
+            return sb;
+        }
+        
+        public String toString() {
+            StringBuffer sb = new StringBuffer();
+            append(sb);
+            return sb.toString();
+        }
     }
     
 }
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/StructuredMemoryManager.java.txt b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/StructuredMemoryManager.java.txt
index a0e4516..e79093b 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/StructuredMemoryManager.java.txt
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/StructuredMemoryManager.java.txt
@@ -143,6 +143,24 @@
 
     @METHODS@
     
+    StringBuffer append(StringBuffer sb) {
+        sb.append("+++ current: ")
+          .append(current)
+          .append(" no occupied slots: ")
+          .append(occupiedSlots)
+          .append(" +++\n");
+        for (int i = 0; i < buffers.size(); ++i) {
+            buffers.get(i).append(sb);
+            sb.append("\n");
+        }
+        return sb;
+    }
+    
+    public String toString() {
+        StringBuffer sb = new StringBuffer();
+        append(sb);
+        return sb.toString();
+    }
 
     static class Buffer {
         private ByteBuffer bb;
@@ -210,6 +228,22 @@
         public void setNextFreeSlot(int slotNum, int nextFreeSlot) {
             bb.putInt(slotNum * ITEM_SIZE + NEXT_FREE_SLOT_OFFSET, nextFreeSlot);
         }
+
+        StringBuffer append(StringBuffer sb) {
+            sb.append("++ free slot: ")
+              .append(freeSlotNum)
+              .append(" no occupied slots: ")
+              .append(occupiedSlots)
+              .append(" ++\n");
+            @PRINT_BUFFER@
+            return sb;
+        }
+        
+        public String toString() {
+            StringBuffer sb = new StringBuffer();
+            append(sb);
+            return sb.toString();
+        }
     }
     
 }
\ No newline at end of file