1
1
use std:: {
2
+ cell:: UnsafeCell ,
2
3
fmt,
3
- ops:: Deref ,
4
+ ops:: { Deref , DerefMut } ,
4
5
sync:: {
5
6
atomic:: { AtomicBool , AtomicU8 , Ordering } ,
6
7
Arc ,
@@ -75,12 +76,14 @@ pub struct Slot<B: Buffer>(Arc<InternalSlot<B>>);
75
76
76
77
#[ derive( Debug ) ]
77
78
struct InternalSlot < B : Buffer > {
78
- buffer : Option < B > ,
79
+ buffer : Option < UnsafeCell < B > > ,
79
80
acquired : AtomicBool ,
80
81
age : AtomicU8 ,
81
82
userdata : UserDataMap ,
82
83
}
83
84
85
+ unsafe impl < B : Buffer > Sync for InternalSlot < B > where B : Sync { }
86
+
84
87
impl < B : Buffer > Slot < B > {
85
88
/// Retrieve userdata for this slot.
86
89
pub fn userdata ( & self ) -> & UserDataMap {
@@ -107,7 +110,13 @@ impl<B: Buffer> Default for InternalSlot<B> {
107
110
impl < B : Buffer > Deref for Slot < B > {
108
111
type Target = B ;
109
112
fn deref ( & self ) -> & B {
110
- Option :: as_ref ( & self . 0 . buffer ) . unwrap ( )
113
+ unsafe { & * Option :: as_ref ( & self . 0 . buffer ) . unwrap ( ) . get ( ) }
114
+ }
115
+ }
116
+
117
+ impl < B : Buffer > DerefMut for Slot < B > {
118
+ fn deref_mut ( & mut self ) -> & mut Self :: Target {
119
+ unsafe { & mut * Option :: as_ref ( & self . 0 . buffer ) . unwrap ( ) . get ( ) }
111
120
}
112
121
}
113
122
@@ -171,7 +180,7 @@ where
171
180
. allocator
172
181
. create_buffer ( self . width , self . height , self . fourcc , & self . modifiers )
173
182
{
174
- Ok ( buffer) => free_slot. buffer = Some ( buffer) ,
183
+ Ok ( buffer) => free_slot. buffer = Some ( UnsafeCell :: new ( buffer) ) ,
175
184
Err ( err) => {
176
185
free_slot. acquired . store ( false , Ordering :: SeqCst ) ;
177
186
return Err ( err) ;
0 commit comments