From 355e626643d44568915bf1a8a61e5423ac6bd2cf Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 29 Jun 2021 16:55:47 -0500 Subject: [PATCH] feat(xsnap): isReady() eliminates need for .evaluate('null') this lets us ensure that snapshot loading is finished without affecting the XS engine heap state. --- packages/xsnap/src/xsnap.c | 5 +++-- packages/xsnap/src/xsnap.js | 13 +++++++++++++ packages/xsnap/test/test-snapstore.js | 2 +- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/packages/xsnap/src/xsnap.c b/packages/xsnap/src/xsnap.c index 356abef43b7..42c6fdd9e52 100644 --- a/packages/xsnap/src/xsnap.c +++ b/packages/xsnap/src/xsnap.c @@ -320,8 +320,6 @@ ExitCode main(int argc, char* argv[]) if (snapshot.stream) { machine = fxReadSnapshot(&snapshot, "xsnap", NULL); fclose(snapshot.stream); - // collect after restore from snapshots for consistency - fx_gc(machine); } else snapshot.error = errno; @@ -372,6 +370,9 @@ ExitCode main(int argc, char* argv[]) char command = *nsbuf; // fprintf(stderr, "command: len %d %c arg: %s\n", nslen, command, nsbuf + 1); switch(command) { + case 'R': // isReady + fxWriteNetString(toParent, ".", "", 0); + break; case '?': case 'e': xsBeginCrank(machine, gxCrankMeteringLimit); diff --git a/packages/xsnap/src/xsnap.js b/packages/xsnap/src/xsnap.js index 9fc55f63a5a..814c05990a7 100644 --- a/packages/xsnap/src/xsnap.js +++ b/packages/xsnap/src/xsnap.js @@ -238,6 +238,18 @@ export function xsnap(options) { return Promise.race([vatCancelled, result]); } + /** + * @returns {Promise} + */ + async function isReady() { + const result = baton.then(async () => { + await messagesToXsnap.next(encoder.encode(`R`)); + await runToIdle(); + }); + baton = result.catch(() => {}); + return Promise.race([vatCancelled, result]); + } + /** * @param {Uint8Array} message * @returns {Promise>} @@ -305,6 +317,7 @@ export function xsnap(options) { return freeze({ issueCommand, issueStringCommand, + isReady, close, terminate, evaluate, diff --git a/packages/xsnap/test/test-snapstore.js b/packages/xsnap/test/test-snapstore.js index c2dd8dc0d23..65e826971df 100644 --- a/packages/xsnap/test/test-snapstore.js +++ b/packages/xsnap/test/test-snapstore.js @@ -163,7 +163,7 @@ test('create SES worker, save, restore, resume', async t => { const worker = await store.load(h, async snapshot => { const xs = xsnap({ name: 'ses-resume', snapshot, os: osType(), spawn }); - await xs.evaluate('0'); + await xs.isReady(); return xs; }); t.teardown(() => worker.close());