לדלג לתוכן

פתרון נעילות וסריקה מתקנת

הקוד הבא מדגים חיבור למתאר inotify בתוך אותו פרויקט עם libc. הוא ממתין לאירוע אחד לפחות, קורא batch ומעביר אותו ל־inspect_events מההרצאה.

use std::os::fd::{FromRawFd, OwnedFd};
fn watch_once() -> io::Result<()> {
    let raw = unsafe { libc::inotify_init1(libc::IN_CLOEXEC) };
    if raw == -1 { return Err(io::Error::last_os_error()); }
    let fd = unsafe { OwnedFd::from_raw_fd(raw) };
    let mask = libc::IN_CREATE | libc::IN_DELETE | libc::IN_MOVED_FROM | libc::IN_MOVED_TO;
    if unsafe { libc::inotify_add_watch(fd.as_raw_fd(), c"watch-lab".as_ptr(), mask) } == -1 {
        return Err(io::Error::last_os_error());
    }
    let mut buffer = [0u8; 65536];
    loop {
        let count = unsafe { libc::read(fd.as_raw_fd(), buffer.as_mut_ptr().cast(), buffer.len()) };
        if count >= 0 { return inspect_events(&buffer[..count as usize]); }
        let error = io::Error::last_os_error();
        if error.kind() != io::ErrorKind::Interrupted { return Err(error); }
    }
}

במערכת מתמשכת נשמור מצב סריקה ונאסוף גם אירועים חדשים, ואז נוודא שלא התרחש overflow נוסף בזמן התיקון. אם התנאים אינם מאפשרים תמונה יציבה, נפרסם מצב חלקי או ננסה שוב לפי מדיניות חסומה. אין להכריז שה־cache מלא רק משום שהלולאה הראשונה הסתיימה.