diff --git a/packages/SwingSet/src/initializeSwingset.js b/packages/SwingSet/src/initializeSwingset.js index f26d54e2385..27986eca753 100644 --- a/packages/SwingSet/src/initializeSwingset.js +++ b/packages/SwingSet/src/initializeSwingset.js @@ -256,6 +256,7 @@ export async function initializeSwingset( case 'nodeWorker': case 'node-subprocess': case 'xs-worker': + case 'xs-worker-no-gc': config.defaultManagerType = defaultManagerType; break; case undefined: diff --git a/packages/SwingSet/src/kernel/vatManager/factory.js b/packages/SwingSet/src/kernel/vatManager/factory.js index ced44e8d328..9922d5fdc72 100644 --- a/packages/SwingSet/src/kernel/vatManager/factory.js +++ b/packages/SwingSet/src/kernel/vatManager/factory.js @@ -54,6 +54,7 @@ export function makeVatManagerFactory({ assertKnownOptions(managerOptions, [ 'enablePipelining', 'managerType', + 'gcEveryCrank', 'setup', 'bundle', 'metered', @@ -89,15 +90,16 @@ export function makeVatManagerFactory({ enableSetup, } = managerOptions; - if (metered && managerType !== 'local' && managerType !== 'xs-worker') { - console.warn( - `TODO: support metered with ${managerType}; using local as work-around`, - ); + if ( + metered && + managerType !== 'local' && + managerType !== 'xs-worker' && + managerType !== 'xs-worker-no-gc' + ) { + console.warn(`TODO: support metered with ${managerType}`); } if (setup && managerType !== 'local') { - console.warn( - `TODO: stop using setup() with ${managerType}; using local as work-around`, - ); + console.warn(`TODO: stop using setup() with ${managerType}`); } if (managerType === 'local' || enableSetup) { if (setup) { @@ -134,11 +136,19 @@ export function makeVatManagerFactory({ ); } - if (managerType === 'xs-worker') { + if (managerType === 'xs-worker' || managerType === 'xs-worker-no-gc') { + const transformedOptions = { + ...managerOptions, + managerType: 'xs-worker', + }; + if (managerOptions.gcEveryCrank === undefined) { + // Explicitly enable/disable gcEveryCrank. + transformedOptions.gcEveryCrank = managerType !== 'xs-worker-no-gc'; + } return xsWorkerFactory.createFromBundle( vatID, bundle, - managerOptions, + transformedOptions, vatSyscallHandler, ); } diff --git a/packages/SwingSet/src/kernel/vatManager/manager-subprocess-xsnap.js b/packages/SwingSet/src/kernel/vatManager/manager-subprocess-xsnap.js index e2908e0138b..8099cd1413c 100644 --- a/packages/SwingSet/src/kernel/vatManager/manager-subprocess-xsnap.js +++ b/packages/SwingSet/src/kernel/vatManager/manager-subprocess-xsnap.js @@ -55,6 +55,7 @@ export function makeXsSubprocessFactory({ virtualObjectCacheSize, enableDisavow, enableVatstore, + gcEveryCrank = true, name, metered, compareSyscalls, @@ -130,6 +131,7 @@ export function makeXsSubprocessFactory({ virtualObjectCacheSize, enableDisavow, enableVatstore, + gcEveryCrank, ]); if (bundleReply[0] === 'dispatchReady') { parentLog(vatID, `bundle loaded. dispatch ready.`); diff --git a/packages/SwingSet/src/kernel/vatManager/supervisor-subprocess-xsnap.js b/packages/SwingSet/src/kernel/vatManager/supervisor-subprocess-xsnap.js index 55db8c6101b..36784cb2858 100644 --- a/packages/SwingSet/src/kernel/vatManager/supervisor-subprocess-xsnap.js +++ b/packages/SwingSet/src/kernel/vatManager/supervisor-subprocess-xsnap.js @@ -147,6 +147,7 @@ function makeWorker(port) { * @param {unknown} virtualObjectCacheSize * @param {boolean} enableDisavow * @param {boolean} enableVatstore + * @param {boolean} [gcEveryCrank] * @returns { Promise } */ async function setBundle( @@ -156,6 +157,7 @@ function makeWorker(port) { virtualObjectCacheSize, enableDisavow, enableVatstore, + gcEveryCrank, ) { /** @type { (vso: VatSyscallObject) => VatSyscallResult } */ function syscallToManager(vatSyscallObject) { @@ -192,7 +194,7 @@ function makeWorker(port) { waitUntilQuiescent, // FIXME(mfig): Here is where GC-per-crank is silently disabled. // We need to do a better analysis of the tradeoffs. - gcAndFinalize: makeGcAndFinalize(false && globalThis.gc), + gcAndFinalize: makeGcAndFinalize(gcEveryCrank && globalThis.gc), }); const ls = makeLiveSlots( @@ -236,6 +238,7 @@ function makeWorker(port) { assert(!dispatch, 'cannot setBundle again'); const enableDisavow = !!args[4]; const enableVatstore = !!args[5]; + const gcEveryCrank = args[6] === undefined ? true : !!args[6]; return setBundle( args[0], args[1], @@ -243,6 +246,7 @@ function makeWorker(port) { args[3], enableDisavow, enableVatstore, + gcEveryCrank, ); } case 'deliver': { diff --git a/packages/SwingSet/src/types.js b/packages/SwingSet/src/types.js index 823bfa531c6..1c7f7c67b1c 100644 --- a/packages/SwingSet/src/types.js +++ b/packages/SwingSet/src/types.js @@ -21,10 +21,11 @@ * TODO: liveSlotsConsole... * See validateManagerOptions() in factory.js * - * @typedef { 'local' | 'nodeWorker' | 'node-subprocess' | 'xs-worker' } ManagerType + * @typedef { 'local' | 'nodeWorker' | 'node-subprocess' | 'xs-worker' | 'xs-worker-no-gc' } ManagerType * @typedef {{ * enablePipelining?: boolean, * managerType: ManagerType, + * gcEveryCrank?: boolean, * metered?: boolean, * enableDisavow?: boolean, * useTranscript?: boolean, diff --git a/packages/solo/solo-config.json b/packages/solo/solo-config.json index 1f9dc10fafc..5669faeb52b 100644 --- a/packages/solo/solo-config.json +++ b/packages/solo/solo-config.json @@ -1,6 +1,6 @@ { "bootstrap": "bootstrap", - "defaultManagerType": "xs-worker", + "defaultManagerType": "xs-worker-no-gc", "vats": { "spawner": { "sourceSpec": "./src/vat-spawner.js" diff --git a/packages/vats/decentral-config.json b/packages/vats/decentral-config.json index f0582b2db85..76f4b9843fc 100644 --- a/packages/vats/decentral-config.json +++ b/packages/vats/decentral-config.json @@ -5,7 +5,7 @@ "sourceSpec": "@agoric/zoe/contractFacet" } }, - "defaultManagerType": "xs-worker", + "defaultManagerType": "xs-worker-no-gc", "vats": { "bank": { "sourceSpec": "./src/vat-bank.js"