Merge pull request #24 from vaci/vaci/portability

Patches to assist porting back to official release
This commit is contained in:
Vaci 2022-03-12 10:53:38 +00:00 committed by GitHub
commit 88182b9b30
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 48 additions and 41 deletions

View file

@ -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);

View file

@ -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);

View file

@ -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);
} }

View file

@ -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>,

View file

@ -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() {

View file

@ -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;
} }

View file

@ -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;
} }

View file

@ -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;
} }

View file

@ -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;
} }

View file

@ -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);
} }

View file

@ -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;
} }

View file

@ -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;
} }