[thin_dump (rust)] First pass at thin_dump.
Doesn't include --repair. This includes <def> and <ref> sections for shared regions.
This commit is contained in:
@@ -225,6 +225,10 @@ pub trait SpaceMap {
|
||||
fn get_nr_blocks(&self) -> Result<u64>;
|
||||
fn get_nr_allocated(&self) -> Result<u64>;
|
||||
fn get(&self, b: u64) -> Result<u32>;
|
||||
|
||||
// Returns the old ref count
|
||||
fn set(&mut self, b: u64, v: u32) -> Result<u32>;
|
||||
|
||||
fn inc(&mut self, begin: u64, len: u64) -> Result<()>;
|
||||
}
|
||||
|
||||
@@ -265,6 +269,20 @@ where
|
||||
Ok(self.counts[b as usize].into())
|
||||
}
|
||||
|
||||
fn set(&mut self, b: u64, v: u32) -> Result<u32> {
|
||||
let old = self.counts[b as usize];
|
||||
assert!(v < 0xff); // FIXME: we can't assume this
|
||||
self.counts[b as usize] = V::from(v as u8);
|
||||
|
||||
if old == V::from(0u8) && v != 0 {
|
||||
self.nr_allocated += 1;
|
||||
} else if old != V::from(0u8) && v == 0 {
|
||||
self.nr_allocated -= 1;
|
||||
}
|
||||
|
||||
Ok(old.into())
|
||||
}
|
||||
|
||||
fn inc(&mut self, begin: u64, len: u64) -> Result<()> {
|
||||
for b in begin..(begin + len) {
|
||||
if self.counts[b as usize] == V::from(0u8) {
|
||||
@@ -325,6 +343,24 @@ impl SpaceMap for RestrictedSpaceMap {
|
||||
}
|
||||
}
|
||||
|
||||
fn set(&mut self, b: u64, v: u32) -> Result<u32> {
|
||||
let old = self.counts.contains(b as usize);
|
||||
|
||||
if v > 0 {
|
||||
if !old {
|
||||
self.nr_allocated += 1;
|
||||
}
|
||||
self.counts.insert(b as usize);
|
||||
} else {
|
||||
if old {
|
||||
self.nr_allocated -= 1;
|
||||
}
|
||||
self.counts.set(b as usize, false);
|
||||
}
|
||||
|
||||
Ok(if old {1} else {0})
|
||||
}
|
||||
|
||||
fn inc(&mut self, begin: u64, len: u64) -> Result<()> {
|
||||
for b in begin..(begin + len) {
|
||||
if !self.counts.contains(b as usize) {
|
||||
|
||||
Reference in New Issue
Block a user