|
9 | 9 | //! information.
|
10 | 10 |
|
11 | 11 | use std::{
|
| 12 | + cell::RefCell, |
12 | 13 | sync::{
|
13 |
| - atomic::{AtomicPtr, AtomicU64, Ordering}, |
| 14 | + atomic::{AtomicU64, Ordering}, |
14 | 15 | Arc,
|
15 | 16 | },
|
16 | 17 | time::{Duration, Instant},
|
@@ -156,32 +157,25 @@ impl<T: TaskCell + Send + 'static> QueueCore<T> {
|
156 | 157 | }
|
157 | 158 | }
|
158 | 159 |
|
159 |
| -/// A holder to store task. We wrap the value in an atomic ptr because the return value of pop() |
160 |
| -/// only provide readonly reference to this value, though in our can it's safe to just take it. |
| 160 | +/// A holder to store task. Wrap the task in a RefCell becuase crossbeam-skip only provide |
| 161 | +/// readonly acess to a popped Entry. |
161 | 162 | struct Slot<T> {
|
162 |
| - ptr: AtomicPtr<T>, |
| 163 | + //ptr: AtomicPtr<T>, |
| 164 | + value: RefCell<Option<T>>, |
163 | 165 | }
|
164 | 166 |
|
| 167 | +// It is safe here because the value is only visited by the thread which calls `pop()`. |
| 168 | +unsafe impl<T: Send> Sync for Slot<T> {} |
| 169 | + |
165 | 170 | impl<T> Slot<T> {
|
166 | 171 | fn new(value: T) -> Self {
|
167 | 172 | Self {
|
168 |
| - ptr: AtomicPtr::new(Box::into_raw(Box::new(value))), |
| 173 | + value: RefCell::new(Some(value)), |
169 | 174 | }
|
170 | 175 | }
|
171 | 176 |
|
172 | 177 | fn take(&self) -> Option<T> {
|
173 |
| - let raw_ptr = self.ptr.swap(std::ptr::null_mut(), Ordering::SeqCst); |
174 |
| - if !raw_ptr.is_null() { |
175 |
| - unsafe { Some(*Box::from_raw(raw_ptr)) } |
176 |
| - } else { |
177 |
| - None |
178 |
| - } |
179 |
| - } |
180 |
| -} |
181 |
| - |
182 |
| -impl<T> Drop for Slot<T> { |
183 |
| - fn drop(&mut self) { |
184 |
| - self.take(); |
| 178 | + self.value.take() |
185 | 179 | }
|
186 | 180 | }
|
187 | 181 |
|
@@ -350,7 +344,7 @@ impl Builder {
|
350 | 344 | .collect();
|
351 | 345 |
|
352 | 346 | let injector = TaskInjector {
|
353 |
| - queue: queue, |
| 347 | + queue, |
354 | 348 | task_manager: self.manager,
|
355 | 349 | };
|
356 | 350 |
|
|
0 commit comments