diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index d6ba9214c771d..db608d36f9864 100644 Binary files a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm and b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm differ diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm index c423688bf4c60..0d99fd7e32d53 100755 Binary files a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm and b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm differ diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm index 5138a9b48a15c..9b599f5a2f4b1 100644 Binary files a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm and b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm differ diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm index d0c47ee76f231..34f1957f7a0e0 100755 Binary files a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm and b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm differ diff --git a/substrate/executor/src/sandbox.rs b/substrate/executor/src/sandbox.rs index 1c6ce76002477..682014d235ed0 100644 --- a/substrate/executor/src/sandbox.rs +++ b/substrate/executor/src/sandbox.rs @@ -330,7 +330,7 @@ impl SandboxInstance { fn decode_environment_definition( raw_env_def: &[u8], - memories: &[MemoryRef], + memories: &[Option], ) -> Result<(Imports, GuestToSupervisorFunctionMapping), DummyUserError> { let env_def = sandbox_primitives::EnvironmentDefinition::decode(&mut &raw_env_def[..]).ok_or_else(|| DummyUserError)?; @@ -351,8 +351,10 @@ fn decode_environment_definition( sandbox_primitives::ExternEntity::Memory(memory_idx) => { let memory_ref = memories .get(memory_idx as usize) + .cloned() + .ok_or_else(|| DummyUserError)? .ok_or_else(|| DummyUserError)?; - memories_map.insert((module, field), memory_ref.clone()); + memories_map.insert((module, field), memory_ref); } } } @@ -422,8 +424,9 @@ pub fn instantiate( /// This struct keeps track of all sandboxed components. pub struct Store { - instances: Vec>, - memories: Vec, + // Memories and instances are `Some` untill torndown. + instances: Vec>>, + memories: Vec>, } impl Store { @@ -450,7 +453,7 @@ impl Store { let mem = MemoryInstance::alloc(Pages(initial as usize), maximum).map_err(|_| DummyUserError)?; let mem_idx = self.memories.len(); - self.memories.push(mem); + self.memories.push(Some(mem)); Ok(mem_idx as u32) } @@ -458,11 +461,13 @@ impl Store { /// /// # Errors /// - /// Returns `Err` If `instance_idx` isn't a valid index of an instance. + /// Returns `Err` If `instance_idx` isn't a valid index of an instance or + /// instance is already torndown. pub fn instance(&self, instance_idx: u32) -> Result, DummyUserError> { self.instances .get(instance_idx as usize) .cloned() + .ok_or_else(|| DummyUserError)? .ok_or_else(|| DummyUserError) } @@ -470,17 +475,41 @@ impl Store { /// /// # Errors /// - /// Returns `Err` If `memory_idx` isn't a valid index of an instance. + /// Returns `Err` If `memory_idx` isn't a valid index of an memory or + /// memory is already torndown. pub fn memory(&self, memory_idx: u32) -> Result { self.memories .get(memory_idx as usize) .cloned() + .ok_or_else(|| DummyUserError)? .ok_or_else(|| DummyUserError) } + /// Teardown the memory at the specified index. + /// + /// # Errors + /// + /// Returns `Err` if `memory_idx` isn't a valid index of an memory. + pub fn memory_teardown(&mut self, memory_idx: u32) -> Result<(), DummyUserError> { + if memory_idx as usize >= self.memories.len() { + return Err(DummyUserError); + } + self.memories[memory_idx as usize] = None; + Ok(()) + } + + /// Teardown the instance at the specified index. + pub fn instance_teardown(&mut self, instance_idx: u32) -> Result<(), DummyUserError> { + if instance_idx as usize >= self.instances.len() { + return Err(DummyUserError); + } + self.instances[instance_idx as usize] = None; + Ok(()) + } + fn register_sandbox_instance(&mut self, sandbox_instance: Rc) -> u32 { let instance_idx = self.instances.len(); - self.instances.push(sandbox_instance); + self.instances.push(Some(sandbox_instance)); instance_idx as u32 } } diff --git a/substrate/executor/src/wasm_executor.rs b/substrate/executor/src/wasm_executor.rs index 905c9240557d5..3c01d2fde732f 100644 --- a/substrate/executor/src/wasm_executor.rs +++ b/substrate/executor/src/wasm_executor.rs @@ -356,6 +356,10 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, Ok(instance_idx as u32) }, + ext_sandbox_instance_teardown(instance_idx: u32) => { + this.sandbox_store.instance_teardown(instance_idx)?; + Ok(()) + }, ext_sandbox_invoke(instance_idx: u32, export_ptr: *const u8, export_len: usize, state: usize) -> u32 => { trace!(target: "runtime-sandbox", "invoke, instance_idx={}", instance_idx); let export = this.memory.get(export_ptr, export_len as usize) @@ -406,6 +410,10 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, Ok(sandbox_primitives::ERR_OK) }, + ext_sandbox_memory_teardown(memory_idx: u32) => { + this.sandbox_store.memory_teardown(memory_idx)?; + Ok(()) + }, => <'e, E: Externalities + 'e> ); diff --git a/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm b/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm index e0410bea72847..fb91ac4a1b7a8 100644 Binary files a/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm and b/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm differ diff --git a/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm b/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm index 1bca2b9bb5cb8..9c10eb52da394 100755 Binary files a/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm and b/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm differ diff --git a/substrate/runtime-sandbox/without_std.rs b/substrate/runtime-sandbox/without_std.rs index a31b0bdf117db..edcbeb2d1f936 100755 --- a/substrate/runtime-sandbox/without_std.rs +++ b/substrate/runtime-sandbox/without_std.rs @@ -76,9 +76,12 @@ mod ffi { val_ptr: *const u8, val_len: usize, ) -> u32; - - // TODO: ext_instance_teardown - // TODO: ext_memory_teardown + pub fn ext_sandbox_memory_teardown( + memory_idx: u32, + ); + pub fn ext_sandbox_instance_teardown( + instance_idx: u32, + ); } } @@ -122,6 +125,14 @@ impl Memory { } } +impl Drop for Memory { + fn drop(&mut self) { + unsafe { + ffi::ext_sandbox_memory_teardown(self.memory_idx); + } + } +} + pub struct EnvironmentDefinitionBuilder { env_def: sandbox_primitives::EnvironmentDefinition, _marker: marker::PhantomData, @@ -265,3 +276,11 @@ impl Instance { } } } + +impl Drop for Instance { + fn drop(&mut self) { + unsafe { + ffi::ext_sandbox_instance_teardown(self.instance_idx); + } + } +}