Merge pull request #24 from vaci/vaci/portability
Patches to assist porting back to official release
This commit is contained in:
commit
88182b9b30
12 changed files with 48 additions and 41 deletions
|
@ -48,7 +48,7 @@ public final class AnyPointer {
|
||||||
}
|
}
|
||||||
public static final Factory factory = new Factory();
|
public static final Factory factory = new Factory();
|
||||||
|
|
||||||
public final static class Reader extends Capability.ReaderContext {
|
public final static class Reader extends CapTableReader.ReaderContext {
|
||||||
final SegmentReader segment;
|
final SegmentReader segment;
|
||||||
final int pointer; // offset in words
|
final int pointer; // offset in words
|
||||||
final int nestingLimit;
|
final int nestingLimit;
|
||||||
|
@ -67,7 +67,7 @@ public final class AnyPointer {
|
||||||
}
|
}
|
||||||
|
|
||||||
final Reader imbue(CapTableReader capTable) {
|
final Reader imbue(CapTableReader capTable) {
|
||||||
var result = new Reader(segment, pointer, nestingLimit);
|
Reader result = new Reader(segment, pointer, nestingLimit);
|
||||||
result.capTable = capTable;
|
result.capTable = capTable;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -83,9 +83,9 @@ public final class AnyPointer {
|
||||||
public final ClientHook getPipelinedCap(short[] ops) {
|
public final ClientHook getPipelinedCap(short[] ops) {
|
||||||
AnyPointer.Reader any = this;
|
AnyPointer.Reader any = this;
|
||||||
|
|
||||||
for (var pointerIndex: ops) {
|
for (short pointerIndex: ops) {
|
||||||
if (pointerIndex >= 0) {
|
if (pointerIndex >= 0) {
|
||||||
var reader = WireHelpers.readStructPointer(any.segment, any.capTable, any.pointer, null, 0, any.nestingLimit);
|
StructReader reader = WireHelpers.readStructPointer(any.segment, any.capTable, any.pointer, null, 0, any.nestingLimit);
|
||||||
any = reader._getPointerField(AnyPointer.factory, pointerIndex);
|
any = reader._getPointerField(AnyPointer.factory, pointerIndex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -93,7 +93,7 @@ public final class AnyPointer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final class Builder extends Capability.BuilderContext {
|
public static final class Builder extends CapTableBuilder.BuilderContext {
|
||||||
final SegmentBuilder segment;
|
final SegmentBuilder segment;
|
||||||
final int pointer;
|
final int pointer;
|
||||||
|
|
||||||
|
@ -176,7 +176,7 @@ public final class AnyPointer {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Pipeline getPointerField(short pointerIndex) {
|
public Pipeline getPointerField(short pointerIndex) {
|
||||||
var newOps = new short[this.ops.length + 1];
|
short[] newOps = new short[this.ops.length + 1];
|
||||||
System.arraycopy(this.ops, 0, newOps, 0, this.ops.length);
|
System.arraycopy(this.ops, 0, newOps, 0, this.ops.length);
|
||||||
newOps[this.ops.length] = pointerIndex;
|
newOps[this.ops.length] = pointerIndex;
|
||||||
return new Pipeline(this.hook, newOps);
|
return new Pipeline(this.hook, newOps);
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
package org.capnproto;
|
package org.capnproto;
|
||||||
|
|
||||||
public interface CapTableBuilder extends CapTableReader {
|
public interface CapTableBuilder extends CapTableReader {
|
||||||
|
|
||||||
|
class BuilderContext {
|
||||||
|
public CapTableBuilder capTable;
|
||||||
|
}
|
||||||
|
|
||||||
int injectCap(ClientHook cap);
|
int injectCap(ClientHook cap);
|
||||||
|
|
||||||
void dropCap(int index);
|
void dropCap(int index);
|
||||||
|
|
|
@ -1,5 +1,10 @@
|
||||||
package org.capnproto;
|
package org.capnproto;
|
||||||
|
|
||||||
public interface CapTableReader {
|
public interface CapTableReader {
|
||||||
|
|
||||||
|
class ReaderContext {
|
||||||
|
public CapTableReader capTable;
|
||||||
|
}
|
||||||
|
|
||||||
ClientHook extractCap(int index);
|
ClientHook extractCap(int index);
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,19 +5,11 @@ import java.util.*;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.CompletionStage;
|
import java.util.concurrent.CompletionStage;
|
||||||
|
|
||||||
|
import static org.capnproto.ClientHook.BROKEN_CAPABILITY_BRAND;
|
||||||
|
import static org.capnproto.ClientHook.NULL_CAPABILITY_BRAND;
|
||||||
|
|
||||||
public final class Capability {
|
public final class Capability {
|
||||||
|
|
||||||
static final Object NULL_CAPABILITY_BRAND = new Object();
|
|
||||||
static final Object BROKEN_CAPABILITY_BRAND = new Object();
|
|
||||||
|
|
||||||
public static class BuilderContext {
|
|
||||||
public CapTableBuilder capTable;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class ReaderContext {
|
|
||||||
public CapTableReader capTable;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static abstract class Factory<T extends ClientBase>
|
public static abstract class Factory<T extends ClientBase>
|
||||||
implements FromPointerReader<T>,
|
implements FromPointerReader<T>,
|
||||||
FromPointerBuilder<T>,
|
FromPointerBuilder<T>,
|
||||||
|
|
|
@ -5,6 +5,8 @@ import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
public interface ClientHook {
|
public interface ClientHook {
|
||||||
|
|
||||||
|
static final Object NULL_CAPABILITY_BRAND = new Object();
|
||||||
|
static final Object BROKEN_CAPABILITY_BRAND = new Object();
|
||||||
/**
|
/**
|
||||||
* Start a new call, allowing the client to allocate request/response objects as it sees fit.
|
* Start a new call, allowing the client to allocate request/response objects as it sees fit.
|
||||||
* This version is used when calls are made from application code in the local process.
|
* This version is used when calls are made from application code in the local process.
|
||||||
|
@ -59,7 +61,7 @@ public interface ClientHook {
|
||||||
* Repeatedly calls whenMoreResolved() until it returns nullptr.
|
* Repeatedly calls whenMoreResolved() until it returns nullptr.
|
||||||
*/
|
*/
|
||||||
default CompletableFuture<java.lang.Void> whenResolved() {
|
default CompletableFuture<java.lang.Void> whenResolved() {
|
||||||
var promise = whenMoreResolved();
|
CompletableFuture<ClientHook> promise = whenMoreResolved();
|
||||||
return promise != null
|
return promise != null
|
||||||
? promise.thenCompose(ClientHook::whenResolved)
|
? promise.thenCompose(ClientHook::whenResolved)
|
||||||
: CompletableFuture.completedFuture(null);
|
: CompletableFuture.completedFuture(null);
|
||||||
|
@ -70,18 +72,18 @@ public interface ClientHook {
|
||||||
* reading a null pointer out of a Cap'n Proto message.
|
* reading a null pointer out of a Cap'n Proto message.
|
||||||
*/
|
*/
|
||||||
default boolean isNull() {
|
default boolean isNull() {
|
||||||
return getBrand() == Capability.NULL_CAPABILITY_BRAND;
|
return getBrand() == NULL_CAPABILITY_BRAND;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the capability was created by newBrokenCap().
|
* Returns true if the capability was created by newBrokenCap().
|
||||||
*/
|
*/
|
||||||
default boolean isError() {
|
default boolean isError() {
|
||||||
return getBrand() == Capability.BROKEN_CAPABILITY_BRAND;
|
return getBrand() == BROKEN_CAPABILITY_BRAND;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implements {@link Capability.Client.getFd}. If this returns null but whenMoreResolved() returns
|
* Implements Capability.Client.getFd. If this returns null but whenMoreResolved() returns
|
||||||
* non-null, then Capability::Client::getFd() waits for resolution and tries again.
|
* non-null, then Capability::Client::getFd() waits for resolution and tries again.
|
||||||
*/
|
*/
|
||||||
default FileDescriptor getFd() {
|
default FileDescriptor getFd() {
|
||||||
|
|
|
@ -19,7 +19,7 @@ abstract class ExportTable<T> implements Iterable<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
public T erase(int id, T entry) {
|
public T erase(int id, T entry) {
|
||||||
var value = slots.get(id);
|
T value = slots.get(id);
|
||||||
if (value == entry) {
|
if (value == entry) {
|
||||||
freeIds.add(id);
|
freeIds.add(id);
|
||||||
return slots.remove(id);
|
return slots.remove(id);
|
||||||
|
@ -30,8 +30,8 @@ abstract class ExportTable<T> implements Iterable<T> {
|
||||||
|
|
||||||
public T next() {
|
public T next() {
|
||||||
int id = freeIds.isEmpty() ? max++ : freeIds.remove();
|
int id = freeIds.isEmpty() ? max++ : freeIds.remove();
|
||||||
var value = newExportable(id);
|
T value = newExportable(id);
|
||||||
var prev = slots.put(id, value);
|
T prev = slots.put(id, value);
|
||||||
assert prev == null;
|
assert prev == null;
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@ abstract class ImportTable<T> implements Iterable<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
public T erase(int id, T entry) {
|
public T erase(int id, T entry) {
|
||||||
var removed = slots.remove(id, entry);
|
boolean removed = slots.remove(id, entry);
|
||||||
assert removed;
|
assert removed;
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@ package org.capnproto;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class ListBuilder extends Capability.BuilderContext {
|
public class ListBuilder extends CapTableBuilder.BuilderContext {
|
||||||
public interface Factory<T> {
|
public interface Factory<T> {
|
||||||
T constructBuilder(SegmentBuilder segment, int ptr,
|
T constructBuilder(SegmentBuilder segment, int ptr,
|
||||||
int elementCount, int step,
|
int elementCount, int step,
|
||||||
|
@ -31,9 +31,9 @@ public class ListBuilder extends Capability.BuilderContext {
|
||||||
default T constructBuilder(SegmentBuilder segment, CapTableBuilder capTable, int ptr,
|
default T constructBuilder(SegmentBuilder segment, CapTableBuilder capTable, int ptr,
|
||||||
int elementCount, int step,
|
int elementCount, int step,
|
||||||
int structDataSize, short structPointerCount) {
|
int structDataSize, short structPointerCount) {
|
||||||
var result = constructBuilder(segment, ptr, elementCount, step, structDataSize, structPointerCount);
|
T result = constructBuilder(segment, ptr, elementCount, step, structDataSize, structPointerCount);
|
||||||
if (result instanceof Capability.BuilderContext) {
|
if (result instanceof CapTableBuilder.BuilderContext) {
|
||||||
((Capability.BuilderContext) result).capTable = capTable;
|
((CapTableBuilder.BuilderContext) result).capTable = capTable;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
package org.capnproto;
|
package org.capnproto;
|
||||||
|
|
||||||
public class ListReader extends Capability.ReaderContext {
|
public class ListReader extends CapTableReader.ReaderContext {
|
||||||
public interface Factory<T> {
|
public interface Factory<T> {
|
||||||
T constructReader(SegmentReader segment,
|
T constructReader(SegmentReader segment,
|
||||||
int ptr,
|
int ptr,
|
||||||
|
@ -31,9 +31,9 @@ public class ListReader extends Capability.ReaderContext {
|
||||||
default T constructReader(SegmentReader segment, CapTableReader capTable, int ptr,
|
default T constructReader(SegmentReader segment, CapTableReader capTable, int ptr,
|
||||||
int elementCount, int step,
|
int elementCount, int step,
|
||||||
int structDataSize, short structPointerCount, int nestingLimit) {
|
int structDataSize, short structPointerCount, int nestingLimit) {
|
||||||
var result = constructReader(segment, ptr, elementCount, step, structDataSize, structPointerCount, nestingLimit);
|
T result = constructReader(segment, ptr, elementCount, step, structDataSize, structPointerCount, nestingLimit);
|
||||||
if (result instanceof Capability.ReaderContext) {
|
if (result instanceof CapTableReader.ReaderContext) {
|
||||||
((Capability.ReaderContext) result).capTable = capTable;
|
((CapTableReader.ReaderContext) result).capTable = capTable;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,5 +22,8 @@
|
||||||
package org.capnproto;
|
package org.capnproto;
|
||||||
|
|
||||||
public interface SetPointerBuilder<Builder, Reader> {
|
public interface SetPointerBuilder<Builder, Reader> {
|
||||||
|
default void setPointerBuilder(SegmentBuilder segment, int pointer, Reader value) {
|
||||||
|
setPointerBuilder(segment, null, pointer, value);
|
||||||
|
}
|
||||||
void setPointerBuilder(SegmentBuilder segment, CapTableBuilder capTable, int pointer, Reader value);
|
void setPointerBuilder(SegmentBuilder segment, CapTableBuilder capTable, int pointer, Reader value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,15 +21,15 @@
|
||||||
|
|
||||||
package org.capnproto;
|
package org.capnproto;
|
||||||
|
|
||||||
public class StructBuilder extends Capability.BuilderContext {
|
public class StructBuilder extends CapTableBuilder.BuilderContext {
|
||||||
public interface Factory<T> {
|
public interface Factory<T> {
|
||||||
T constructBuilder(SegmentBuilder segment, int data, int pointers, int dataSize,
|
T constructBuilder(SegmentBuilder segment, int data, int pointers, int dataSize,
|
||||||
short pointerCount);
|
short pointerCount);
|
||||||
default T constructBuilder(SegmentBuilder segment, CapTableBuilder capTable, int data, int pointers, int dataSize,
|
default T constructBuilder(SegmentBuilder segment, CapTableBuilder capTable, int data, int pointers, int dataSize,
|
||||||
short pointerCount) {
|
short pointerCount) {
|
||||||
var result = constructBuilder(segment, data, pointers, dataSize, pointerCount);
|
T result = constructBuilder(segment, data, pointers, dataSize, pointerCount);
|
||||||
if (result instanceof Capability.BuilderContext) {
|
if (result instanceof CapTableBuilder.BuilderContext) {
|
||||||
((Capability.BuilderContext) result).capTable = capTable;
|
((CapTableBuilder.BuilderContext) result).capTable = capTable;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
package org.capnproto;
|
package org.capnproto;
|
||||||
|
|
||||||
public class StructReader extends Capability.ReaderContext {
|
public class StructReader extends CapTableReader.ReaderContext {
|
||||||
public interface Factory<T> {
|
public interface Factory<T> {
|
||||||
T constructReader(SegmentReader segment, int data, int pointers,
|
T constructReader(SegmentReader segment, int data, int pointers,
|
||||||
int dataSize, short pointerCount,
|
int dataSize, short pointerCount,
|
||||||
|
@ -29,9 +29,9 @@ public class StructReader extends Capability.ReaderContext {
|
||||||
default T constructReader(SegmentReader segment, CapTableReader capTable, int data, int pointers,
|
default T constructReader(SegmentReader segment, CapTableReader capTable, int data, int pointers,
|
||||||
int dataSize, short pointerCount,
|
int dataSize, short pointerCount,
|
||||||
int nestingLimit) {
|
int nestingLimit) {
|
||||||
var result = constructReader(segment, data, pointers, dataSize, pointerCount, nestingLimit);
|
T result = constructReader(segment, data, pointers, dataSize, pointerCount, nestingLimit);
|
||||||
if (result instanceof Capability.ReaderContext) {
|
if (result instanceof CapTableReader.ReaderContext) {
|
||||||
((Capability.ReaderContext) result).capTable = capTable;
|
((CapTableReader.ReaderContext) result).capTable = capTable;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue