|
@@ -183,7 +183,7 @@ impl MMListInner<'_> {
|
|
|
|
|
|
|
|
let mut left_area = None;
|
|
let mut left_area = None;
|
|
|
let mut right_area = None;
|
|
let mut right_area = None;
|
|
|
- let mut mid_area = None;
|
|
|
|
|
|
|
+ let mut mid_area = Vec::new();
|
|
|
|
|
|
|
|
self.areas.retain(|area| {
|
|
self.areas.retain(|area| {
|
|
|
let Some((left, mid, right)) = area.range().mask_with_checked(&range_to_protect) else {
|
|
let Some((left, mid, right)) = area.range().mask_with_checked(&range_to_protect) else {
|
|
@@ -194,14 +194,20 @@ impl MMListInner<'_> {
|
|
|
let mut page_attr = pte.get_attr().as_page_attr().expect("Not a page attribute");
|
|
let mut page_attr = pte.get_attr().as_page_attr().expect("Not a page attribute");
|
|
|
|
|
|
|
|
page_attr.set(PageAttribute::READ, permission.read);
|
|
page_attr.set(PageAttribute::READ, permission.read);
|
|
|
- page_attr.set(PageAttribute::WRITE, permission.write);
|
|
|
|
|
|
|
+
|
|
|
|
|
+ if !page_attr.contains(PageAttribute::COPY_ON_WRITE) {
|
|
|
|
|
+ page_attr.set(PageAttribute::WRITE, permission.write);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
page_attr.set(PageAttribute::EXECUTE, permission.execute);
|
|
page_attr.set(PageAttribute::EXECUTE, permission.execute);
|
|
|
|
|
|
|
|
pte.set_attr(page_attr.into());
|
|
pte.set_attr(page_attr.into());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
match (left, right) {
|
|
match (left, right) {
|
|
|
- (None, None) => {}
|
|
|
|
|
|
|
+ (None, None) => {
|
|
|
|
|
+ mid_area.push(area.clone());
|
|
|
|
|
+ }
|
|
|
(Some(left), None) => {
|
|
(Some(left), None) => {
|
|
|
assert!(left_area.is_none());
|
|
assert!(left_area.is_none());
|
|
|
let (Some(left), Some(right)) = area.clone().split(left.end()) else {
|
|
let (Some(left), Some(right)) = area.clone().split(left.end()) else {
|
|
@@ -209,7 +215,7 @@ impl MMListInner<'_> {
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
left_area = Some(left);
|
|
left_area = Some(left);
|
|
|
- mid_area = Some(right);
|
|
|
|
|
|
|
+ mid_area.push(right);
|
|
|
}
|
|
}
|
|
|
(None, Some(right)) => {
|
|
(None, Some(right)) => {
|
|
|
assert!(right_area.is_none());
|
|
assert!(right_area.is_none());
|
|
@@ -217,7 +223,7 @@ impl MMListInner<'_> {
|
|
|
unreachable!("`right.start()` is within the area");
|
|
unreachable!("`right.start()` is within the area");
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
- mid_area = Some(left);
|
|
|
|
|
|
|
+ mid_area.push(left);
|
|
|
right_area = Some(right);
|
|
right_area = Some(right);
|
|
|
}
|
|
}
|
|
|
(Some(left), Some(right)) => {
|
|
(Some(left), Some(right)) => {
|
|
@@ -233,18 +239,18 @@ impl MMListInner<'_> {
|
|
|
|
|
|
|
|
left_area = Some(left);
|
|
left_area = Some(left);
|
|
|
right_area = Some(right);
|
|
right_area = Some(right);
|
|
|
- mid_area = Some(mid);
|
|
|
|
|
|
|
+ mid_area.push(mid);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
false
|
|
false
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
- assert!(mid_area.is_some());
|
|
|
|
|
|
|
+ assert!(mid_area.len() >= 1);
|
|
|
|
|
|
|
|
- if let Some(mut mid) = mid_area {
|
|
|
|
|
- mid.permission = permission;
|
|
|
|
|
- self.areas.insert(mid);
|
|
|
|
|
|
|
+ for mut area in mid_area {
|
|
|
|
|
+ area.permission = permission;
|
|
|
|
|
+ self.areas.insert(area);
|
|
|
}
|
|
}
|
|
|
if let Some(front) = left_area {
|
|
if let Some(front) = left_area {
|
|
|
self.areas.insert(front);
|
|
self.areas.insert(front);
|
|
@@ -355,6 +361,10 @@ impl MMList {
|
|
|
list
|
|
list
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ pub async fn new_shared(&self) -> Self {
|
|
|
|
|
+ todo!()
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
pub fn activate(&self) {
|
|
pub fn activate(&self) {
|
|
|
self.user_count.fetch_add(1, Ordering::Acquire);
|
|
self.user_count.fetch_add(1, Ordering::Acquire);
|
|
|
|
|
|