mmtk/util/heap/
accounting.rs1use std::sync::atomic::AtomicUsize;
2use std::sync::atomic::Ordering;
3
4pub struct PageAccounting {
7 reserved: AtomicUsize,
11 committed: AtomicUsize,
13}
14
15impl PageAccounting {
16 pub fn new() -> Self {
17 Self {
18 reserved: AtomicUsize::new(0),
19 committed: AtomicUsize::new(0),
20 }
21 }
22
23 pub fn reserve_and_commit(&self, pages: usize) {
25 self.reserved.fetch_add(pages, Ordering::Relaxed);
26 self.committed.fetch_add(pages, Ordering::Relaxed);
27 }
28
29 pub fn reserve(&self, pages: usize) {
32 self.reserved.fetch_add(pages, Ordering::Relaxed);
33 }
34
35 pub fn clear_reserved(&self, pages: usize) {
39 let _prev = self.reserved.fetch_sub(pages, Ordering::Relaxed);
40 debug_assert!(_prev >= pages);
41 }
42
43 pub fn commit(&self, pages: usize) {
46 self.committed.fetch_add(pages, Ordering::Relaxed);
47 }
48
49 pub fn release(&self, pages: usize) {
52 let _prev_reserved = self.reserved.fetch_sub(pages, Ordering::Relaxed);
53 debug_assert!(_prev_reserved >= pages);
54
55 let _prev_committed = self.committed.fetch_sub(pages, Ordering::Relaxed);
56 debug_assert!(_prev_committed >= pages);
57 }
58
59 pub fn reset(&self) {
61 self.reserved.store(0, Ordering::Relaxed);
62 self.committed.store(0, Ordering::Relaxed);
63 }
64
65 pub fn get_reserved_pages(&self) -> usize {
66 self.reserved.load(Ordering::Relaxed)
67 }
68
69 pub fn get_committed_pages(&self) -> usize {
70 self.committed.load(Ordering::Relaxed)
71 }
72}
73
74impl Default for PageAccounting {
75 fn default() -> Self {
76 Self::new()
77 }
78}