Add local cap table to message builder.

This commit is contained in:
Vaci Koblizek 2020-10-13 17:13:30 +01:00
parent 606dd26d48
commit c2f64ba317
2 changed files with 42 additions and 2 deletions

View file

@ -24,6 +24,7 @@ package org.capnproto;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.List;
public final class BuilderArena implements Arena {
public enum AllocationStrategy {
@ -38,6 +39,35 @@ public final class BuilderArena implements Arena {
public final ArrayList<SegmentBuilder> segments;
private Allocator allocator;
private CapTableBuilder localCapTable = new CapTableBuilder() {
List<ClientHook> capTable = new ArrayList<>();
@Override
public int injectCap(ClientHook cap) {
int result = this.capTable.size();
capTable.add(cap);
return result;
}
@Override
public void dropCap(int index) {
if (index < this.capTable.size()) {
assert false : "Invalid capability descriptor in message.";
return;
}
this.capTable.set(index, null);
}
@Override
public ClientHook extractCap(int index) {
return index < this.capTable.size()
? this.capTable.get(index)
: null;
}
};
public BuilderArena(int firstSegmentSizeWords, AllocationStrategy allocationStrategy) {
this.segments = new ArrayList<SegmentBuilder>();
{
@ -64,6 +94,16 @@ public final class BuilderArena implements Arena {
this.allocator = allocator;
}
CapTableBuilder getLocalCapTable() {
return this.localCapTable;
}
CapTableBuilder releaseLocalCapTable() {
var tmp = this.localCapTable;
this.localCapTable = null;
return tmp;
}
@Override
public final SegmentReader tryGetSegment(int id) {
return this.segments.get(id);

View file

@ -85,9 +85,9 @@ public final class MessageBuilder {
if (location != 0) {
throw new RuntimeException("First allocated word of new segment was not at offset 0");
}
return new AnyPointer.Builder(rootSegment, location);
return new AnyPointer.Builder(rootSegment, this.arena.getLocalCapTable(), location);
} else {
return new AnyPointer.Builder(rootSegment, 0);
return new AnyPointer.Builder(rootSegment, this.arena.getLocalCapTable(), 0);
}
}