לדלג לתוכן

פתרון תקציב עבודה

אפשר לייצג ticket מורכב שמחזיק שני tickets פנימיים. אם שמירת הבייטים הצליחה אבל שמירת מקום העבודה נכשלה, המשתנה המקומי של הבייטים מושמד בחזרה המוקדמת.

struct Admission { _bytes: Ticket, _jobs: Ticket }
fn admit(bytes: &Budget, jobs: &Budget, length: usize) -> Option<Admission> {
    let byte_ticket = bytes.reserve(length)?;
    let job_ticket = jobs.reserve(1)?;
    Some(Admission { _bytes: byte_ticket, _jobs: job_ticket })
}

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

בדיקה של כשל מדומה יכולה לקרוא לפונקציה ששומרת ticket ואז מחזירה Err לפני יצירת הבאפר. המונה צריך לחזור לערכו הקודם. בדיקה של השמדת תור תבנה כמה עבודות, תשמיד את ה־Vec שמחזיק אותן ותבדוק ששני התקציבים חזרו לאפס.