From bdfad23dd012d0c3226b466544e86109da18d09c Mon Sep 17 00:00:00 2001 From: Luca Casonato Date: Tue, 6 Jul 2021 19:42:52 +0200 Subject: feat: support SharedArrayBuffer sharing between workers (#11040) This commit adds support for sharing SABs between workers. --- core/bindings.rs | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'core/bindings.rs') diff --git a/core/bindings.rs b/core/bindings.rs index 143ccda9b..d8337322d 100644 --- a/core/bindings.rs +++ b/core/bindings.rs @@ -22,7 +22,10 @@ use std::convert::TryInto; use std::option::Option; use std::rc::Rc; use url::Url; +use v8::HandleScope; +use v8::Local; use v8::MapFnTo; +use v8::SharedArrayBuffer; lazy_static::lazy_static! { pub static ref EXTERNAL_REFERENCES: v8::ExternalReferences = @@ -713,6 +716,22 @@ impl<'a> v8::ValueSerializerImpl for SerializeDeserialize<'a> { scope.throw_exception(error); } + fn get_shared_array_buffer_id<'s>( + &mut self, + scope: &mut HandleScope<'s>, + shared_array_buffer: Local<'s, SharedArrayBuffer>, + ) -> Option { + let state_rc = JsRuntime::state(scope); + let state = state_rc.borrow_mut(); + if let Some(shared_array_buffer_store) = &state.shared_array_buffer_store { + let backing_store = shared_array_buffer.get_backing_store(); + let id = shared_array_buffer_store.insert(backing_store); + Some(id) + } else { + None + } + } + fn write_host_object<'s>( &mut self, scope: &mut v8::HandleScope<'s>, @@ -735,6 +754,23 @@ impl<'a> v8::ValueSerializerImpl for SerializeDeserialize<'a> { } impl<'a> v8::ValueDeserializerImpl for SerializeDeserialize<'a> { + fn get_shared_array_buffer_from_id<'s>( + &mut self, + scope: &mut HandleScope<'s>, + transfer_id: u32, + ) -> Option> { + let state_rc = JsRuntime::state(scope); + let state = state_rc.borrow_mut(); + if let Some(shared_array_buffer_store) = &state.shared_array_buffer_store { + let backing_store = shared_array_buffer_store.take(transfer_id)?; + let shared_array_buffer = + v8::SharedArrayBuffer::with_backing_store(scope, &backing_store); + Some(shared_array_buffer) + } else { + None + } + } + fn read_host_object<'s>( &mut self, scope: &mut v8::HandleScope<'s>, -- cgit v1.2.3