diff --git a/components/style/shared_lock.rs b/components/style/shared_lock.rs index f708ec58a23..f5019326ee0 100644 --- a/components/style/shared_lock.rs +++ b/components/style/shared_lock.rs @@ -16,7 +16,10 @@ use std::fmt; #[cfg(feature = "servo")] use std::mem; #[cfg(feature = "gecko")] +use std::mem::ManuallyDrop; +#[cfg(feature = "gecko")] use std::ptr; +use to_shmem::{SharedMemoryBuilder, ToShmem}; /// A shared read/write lock that can protect multiple objects. /// @@ -238,6 +241,26 @@ impl Locked { } } +#[cfg(feature = "gecko")] +impl ToShmem for Locked { + fn to_shmem(&self, builder: &mut SharedMemoryBuilder) -> ManuallyDrop { + let guard = self.shared_lock.read(); + ManuallyDrop::new(Locked { + shared_lock: SharedRwLock::read_only(), + data: UnsafeCell::new(ManuallyDrop::into_inner( + self.read_with(&guard).to_shmem(builder), + )), + }) + } +} + +#[cfg(feature = "servo")] +impl ToShmem for Locked { + fn to_shmem(&self, _builder: &mut SharedMemoryBuilder) -> ManuallyDrop { + panic!("ToShmem not supported in Servo currently") + } +} + #[allow(dead_code)] mod compile_time_assert { use super::{SharedRwLockReadGuard, SharedRwLockWriteGuard};