1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use std::sync::atomic::Ordering::Relaxed;
use mem::epoch::participant::Participant;
use mem::epoch::global;
#[derive(Debug)]
struct LocalEpoch {
participant: *const Participant,
}
impl LocalEpoch {
fn new() -> LocalEpoch {
LocalEpoch { participant: global::get().participants.enroll() }
}
fn get(&self) -> &Participant {
unsafe { &*self.participant }
}
}
impl Drop for LocalEpoch {
fn drop(&mut self) {
let p = self.get();
p.enter();
p.migrate_garbage();
p.exit();
p.active.store(false, Relaxed);
}
}
thread_local!(static LOCAL_EPOCH: LocalEpoch = LocalEpoch::new() );
pub fn with_participant<F, T>(f: F) -> T where F: FnOnce(&Participant) -> T {
LOCAL_EPOCH.with(|e| f(e.get()))
}