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