diff options
author | Tim Ramlot <42113979+inteon@users.noreply.github.com> | 2021-05-11 21:09:09 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-11 21:09:09 +0200 |
commit | 635253bd3a3895f49e6c9606beb852da22fee205 (patch) | |
tree | cec9d75354b4e985a376f888564ecb63c99f2643 /serde_v8/src/magic/buffer.rs | |
parent | 0d319161bc19a520df653bc0c8386f14a68efbdb (diff) |
feat(runtime/worker): Structured cloning worker message passing (#9323)
This commit upgrade "Worker.postMessage()" implementation to use
structured clone algorithm instead of non-spec compliant JSON serialization.
Diffstat (limited to 'serde_v8/src/magic/buffer.rs')
-rw-r--r-- | serde_v8/src/magic/buffer.rs | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/serde_v8/src/magic/buffer.rs b/serde_v8/src/magic/buffer.rs index 893bf35e1..1fcfffc72 100644 --- a/serde_v8/src/magic/buffer.rs +++ b/serde_v8/src/magic/buffer.rs @@ -1,9 +1,9 @@ use rusty_v8 as v8; -use std::cell::Cell; use std::fmt; use std::ops::Deref; use std::ops::DerefMut; +use std::sync::Mutex; use super::zero_copy_buf::ZeroCopyBuf; @@ -11,7 +11,7 @@ use super::zero_copy_buf::ZeroCopyBuf; // allowing us to use a single type for familiarity pub enum MagicBuffer { FromV8(ZeroCopyBuf), - ToV8(Cell<Option<Box<[u8]>>>), + ToV8(Mutex<Option<Box<[u8]>>>), } impl MagicBuffer { @@ -21,6 +21,10 @@ impl MagicBuffer { ) -> Self { Self::FromV8(ZeroCopyBuf::new(scope, view)) } + + pub fn empty() -> Self { + MagicBuffer::ToV8(Mutex::new(Some(vec![0_u8; 0].into_boxed_slice()))) + } } impl Clone for MagicBuffer { @@ -65,7 +69,7 @@ impl DerefMut for MagicBuffer { impl From<Box<[u8]>> for MagicBuffer { fn from(buf: Box<[u8]>) -> Self { - MagicBuffer::ToV8(Cell::new(Some(buf))) + MagicBuffer::ToV8(Mutex::new(Some(buf))) } } @@ -88,8 +92,11 @@ impl serde::Serialize for MagicBuffer { let mut s = serializer.serialize_struct(BUF_NAME, 1)?; let boxed: Box<[u8]> = match self { - Self::FromV8(_) => unreachable!(), - Self::ToV8(x) => x.take().expect("MagicBuffer was empty"), + Self::FromV8(buf) => { + let value: &[u8] = &buf; + value.into() + } + Self::ToV8(x) => x.lock().unwrap().take().expect("MagicBuffer was empty"), }; let hack: [usize; 2] = unsafe { std::mem::transmute(boxed) }; let f1: u64 = hack[0] as u64; |