@@ -39,6 +39,9 @@ function makeError(s) {
39
39
return harden ( { body : JSON . stringify ( s ) , slots : [ ] } ) ;
40
40
}
41
41
42
+ const VAT_TERMINATION_ERROR = makeError ( 'vat terminated' ) ;
43
+ const UNKNOWN_VAT_ERROR = makeError ( 'unknown vat' ) ;
44
+
42
45
export default function buildKernel ( kernelEndowments , kernelOptions = { } ) {
43
46
const {
44
47
waitUntilQuiescent,
@@ -173,7 +176,7 @@ export default function buildKernel(kernelEndowments, kernelOptions = {}) {
173
176
insistVatID ( forVatID ) ;
174
177
const kernelSlot = `${ what } ` ;
175
178
parseKernelSlot ( what ) ;
176
- const vatKeeper = kernelKeeper . allocateVatKeeperIfNeeded ( forVatID ) ;
179
+ const vatKeeper = kernelKeeper . getVatKeeper ( forVatID ) ;
177
180
return vatKeeper . mapKernelSlotToVatSlot ( kernelSlot ) ;
178
181
}
179
182
@@ -184,7 +187,7 @@ export default function buildKernel(kernelEndowments, kernelOptions = {}) {
184
187
}
185
188
insistVatID ( fromVatID ) ;
186
189
assert ( parseVatSlot ( vatSlot ) . allocatedByVat ) ;
187
- const vatKeeper = kernelKeeper . allocateVatKeeperIfNeeded ( fromVatID ) ;
190
+ const vatKeeper = kernelKeeper . getVatKeeper ( fromVatID ) ;
188
191
return vatKeeper . mapVatSlotToKernelSlot ( vatSlot ) ;
189
192
}
190
193
@@ -309,8 +312,8 @@ export default function buildKernel(kernelEndowments, kernelOptions = {}) {
309
312
const vat = ephemeral . vats . get ( vatID ) ;
310
313
kernelKeeper . incStat ( 'dispatches' ) ;
311
314
kernelKeeper . incStat ( 'dispatchDeliver' ) ;
312
- if ( ! vat || vat . dead ) {
313
- resolveToError ( msg . result , makeError ( 'unknown vat' ) ) ;
315
+ if ( ! vat || vat . dead || vatID === 'none' ) {
316
+ resolveToError ( msg . result , UNKNOWN_VAT_ERROR ) ;
314
317
} else {
315
318
const kd = harden ( [ 'message' , target , msg ] ) ;
316
319
const vd = vat . translators . kernelDeliveryToVatDelivery ( kd ) ;
@@ -323,7 +326,7 @@ export default function buildKernel(kernelEndowments, kernelOptions = {}) {
323
326
const { type } = parseKernelSlot ( target ) ;
324
327
if ( type === 'object' ) {
325
328
const vatID = kernelKeeper . ownerOfKernelObject ( target ) ;
326
- insistVatID ( vatID ) ;
329
+ vatID === 'none' || insistVatID ( vatID ) ;
327
330
await deliverToVat ( vatID , target , msg ) ;
328
331
} else if ( type === 'promise' ) {
329
332
const kp = kernelKeeper . getKernelPromise ( target ) ;
@@ -553,7 +556,7 @@ export default function buildKernel(kernelEndowments, kernelOptions = {}) {
553
556
} ,
554
557
} ) ; // marker
555
558
vatObj0s [ name ] = vref ;
556
- const vatKeeper = kernelKeeper . allocateVatKeeperIfNeeded ( vatID ) ;
559
+ const vatKeeper = kernelKeeper . getVatKeeper ( vatID ) ;
557
560
const kernelSlot = vatKeeper . mapVatSlotToKernelSlot ( vatSlot ) ;
558
561
vrefs . set ( vref , kernelSlot ) ;
559
562
logStartup ( `adding vref ${ name } [${ vatID } ]` ) ;
@@ -690,9 +693,7 @@ export default function buildKernel(kernelEndowments, kernelOptions = {}) {
690
693
enablePipelining = false ,
691
694
notifyTermination = ( ) => { } ,
692
695
} = managerOptions ;
693
- // This should create the vatKeeper. Other users get it from the
694
- // kernelKeeper, so we don't need a reference ourselves.
695
- kernelKeeper . allocateVatKeeperIfNeeded ( vatID ) ;
696
+ kernelKeeper . getVatKeeper ( vatID ) ;
696
697
const translators = makeVatTranslators ( vatID , kernelKeeper ) ;
697
698
698
699
ephemeral . vats . set (
@@ -788,7 +789,7 @@ export default function buildKernel(kernelEndowments, kernelOptions = {}) {
788
789
789
790
function collectVatStats ( vatID ) {
790
791
insistVatID ( vatID ) ;
791
- const vatKeeper = kernelKeeper . allocateVatKeeperIfNeeded ( vatID ) ;
792
+ const vatKeeper = kernelKeeper . getVatKeeper ( vatID ) ;
792
793
return vatKeeper . vatStats ( ) ;
793
794
}
794
795
@@ -810,6 +811,7 @@ export default function buildKernel(kernelEndowments, kernelOptions = {}) {
810
811
const vatID = kernelKeeper . allocateVatIDForNameIfNeeded ( name ) ;
811
812
logStartup ( `Assigned VatID ${ vatID } for genesis vat ${ name } ` ) ;
812
813
kernelSlog . addVat ( vatID , false , name ) ;
814
+ kernelKeeper . allocateVatKeeper ( vatID ) ;
813
815
const managerOptions = harden ( {
814
816
...genesisVats . get ( name ) ,
815
817
vatConsole : makeVatConsole ( vatID ) ,
@@ -824,33 +826,26 @@ export default function buildKernel(kernelEndowments, kernelOptions = {}) {
824
826
// instantiate all dynamic vats
825
827
for ( const vatID of kernelKeeper . getAllDynamicVatIDs ( ) ) {
826
828
logStartup ( `Loading dynamic vat ${ vatID } ` ) ;
827
- const vatKeeper = kernelKeeper . allocateVatKeeperIfNeeded ( vatID ) ;
828
- if ( vatKeeper . isDead ( ) ) {
829
- kernelKeeper . forgetVat ( vatID ) ;
830
- } else {
831
- const {
832
- source,
833
- options : dynamicOptions ,
834
- } = vatKeeper . getSourceAndOptions ( ) ;
835
- // eslint-disable-next-line no-await-in-loop
836
- await recreateVatDynamically ( vatID , source , dynamicOptions ) ;
837
- // now the vatManager is attached and ready for transcript replay
838
- }
829
+ const vatKeeper = kernelKeeper . allocateVatKeeper ( vatID ) ;
830
+ const {
831
+ source,
832
+ options : dynamicOptions ,
833
+ } = vatKeeper . getSourceAndOptions ( ) ;
834
+ // eslint-disable-next-line no-await-in-loop
835
+ await recreateVatDynamically ( vatID , source , dynamicOptions ) ;
836
+ // now the vatManager is attached and ready for transcript replay
839
837
}
840
838
841
839
function terminateVat ( vatID ) {
842
- const vatKeeper = kernelKeeper . allocateVatKeeperIfNeeded ( vatID ) ;
843
- if ( ! vatKeeper . isDead ( ) ) {
844
- vatKeeper . markAsDead ( ) ;
845
- const err = makeError ( 'vat terminated' ) ;
846
- for ( const kpid of kernelKeeper . findPromisesDecidedByVat ( vatID ) ) {
847
- resolveToError ( kpid , err , vatID ) ;
840
+ if ( kernelKeeper . getVatKeeper ( vatID ) ) {
841
+ const promisesToReject = kernelKeeper . cleanupAfterTerminatedVat ( vatID ) ;
842
+ for ( const kpid of promisesToReject ) {
843
+ resolveToError ( kpid , VAT_TERMINATION_ERROR , vatID ) ;
848
844
}
849
845
removeVatManager ( vatID ) . then (
850
846
( ) => kdebug ( `terminated vat ${ vatID } ` ) ,
851
847
e => console . error ( `problem terminating vat ${ vatID } ` , e ) ,
852
848
) ;
853
- kernelKeeper . forgetVat ( vatID ) ;
854
849
}
855
850
}
856
851
0 commit comments