פתרון בעלות על מיפוי¶
הטיפוס החדש יכול להכיל את הבעלים הקיים כשדה פרטי, כדי להשתמש באותה השמדה. הקטע הבא מצטרף לדוגמת ההרצאה.
struct ReadOnly { inner: Mapping }
impl Mapping {
fn read_only(self) -> Result<ReadOnly, (Self, io::Error)> {
let result = unsafe { libc::mprotect(self.pointer.as_ptr().cast(),
self.len, libc::PROT_READ) };
if result == -1 {
let error = io::Error::last_os_error();
Err((self, error))
} else { Ok(ReadOnly { inner: self }) }
}
}
impl ReadOnly {
fn bytes(&self) -> &[u8] { self.inner.bytes() }
}
השדה inner נשאר פרטי ולא נחשפת דרך להחזיר אותו כ־Mapping בעל כתיבה. בכשל הבעלים מוחזר למשתמש יחד עם השגיאה, ולכן האחריות על ההשמדה אינה נעלמת. בטווח שמורכב מכמה אזורים או עם שינויי הרשאה מורכבים צריך לקרוא גם את סמנטיקת הכשל של הפעולה ולא להניח rollback כללי.
מיפוי קובץ חיצוני יכול להשתנות או להתקצר בזמן שהפרוסה קיימת. במקרה כזה תוכן הזיכרון והאפשרות לגשת אליו אינם בשליטת הבעלים המקומי בלבד, ולכן ההוכחה שעליה נשענה bytes אינה מועתקת אוטומטית למקרה החדש.