From ce9e1689cb35ce19d9ec73de6e6cb4a66c552e33 Mon Sep 17 00:00:00 2001 From: Vaci Koblizek Date: Thu, 12 Nov 2020 20:34:48 +0000 Subject: [PATCH] dont aggressively clean up answer pipelines --- .../src/main/java/org/capnproto/RpcState.java | 32 +++++-------------- 1 file changed, 8 insertions(+), 24 deletions(-) diff --git a/runtime-rpc/src/main/java/org/capnproto/RpcState.java b/runtime-rpc/src/main/java/org/capnproto/RpcState.java index b7c5e96..cf754b1 100644 --- a/runtime-rpc/src/main/java/org/capnproto/RpcState.java +++ b/runtime-rpc/src/main/java/org/capnproto/RpcState.java @@ -307,11 +307,6 @@ final class RpcState { List> resolveOpsToRelease = new ArrayList<>(); for (var answer : answers) { - if (answer.pipeline != null) { - pipelinesToRelease.add(answer.pipeline); - answer.pipeline = null; - } - if (answer.redirectedResults != null) { tailCallsToRelease.add(answer.redirectedResults); answer.redirectedResults = null; @@ -548,6 +543,7 @@ final class RpcState { response.setFds(List.of()); answer.resultExports = writeDescriptors(caps, payload, fds); + assert answer.pipeline == null; answer.pipeline = ops -> ops.length == 0 ? capHook : Capability.newBrokenCap("Invalid pipeline transform."); @@ -603,6 +599,7 @@ final class RpcState { { var answer = answers.find(answerId); assert answer != null; + assert answer.pipeline == null; answer.pipeline = pap.pipeline; if (redirectResults) { @@ -728,7 +725,6 @@ final class RpcState { : null; answer.resultExports = null; - answer.pipeline = null; // If the call isn't actually done yet, cancel it. Otherwise, we can go ahead and erase the // question from the table. @@ -1373,7 +1369,7 @@ final class RpcState { message.send(); } - cleanupAnswerTable(null, false); + cleanupAnswerTable(null); } return new ClientHook.VoidPromiseAndPipeline(tailInfo.promise, tailInfo.pipeline); } @@ -1412,7 +1408,7 @@ final class RpcState { this.returnMessage.setAnswerId(this.answerId); this.returnMessage.setReleaseParamCaps(false); - var exports = new int[0]; + int[] exports = null; try { exports = ((RpcServerResponseImpl) response).send(); } catch (Throwable exc) { @@ -1420,9 +1416,7 @@ final class RpcState { sendErrorReturn(exc); } - // If no caps in the results, the pipeline is irrelevant. - boolean shouldFreePipeline = exports.length == 0; - cleanupAnswerTable(exports, shouldFreePipeline); + cleanupAnswerTable(exports); } private void sendErrorReturn(Throwable exc) { @@ -1441,7 +1435,7 @@ final class RpcState { message.send(); } - cleanupAnswerTable(null, false); + cleanupAnswerTable(null); } private boolean isFirstResponder() { @@ -1452,25 +1446,15 @@ final class RpcState { return true; } - private void cleanupAnswerTable(int[] resultExports, boolean shouldFreePipeline) { - if (resultExports == null) { - resultExports = new int[0]; - } - + private void cleanupAnswerTable(int[] resultExports) { if (this.cancelRequested) { - assert resultExports.length == 0; + assert resultExports == null || resultExports.length == 0; answers.erase(this.answerId); - return; } else { var answer = answers.find(answerId); answer.callContext = null; answer.resultExports = resultExports; - - if (shouldFreePipeline) { - assert resultExports.length == 0; - answer.pipeline = null; - } } }