פרויקט מסכם: מנוע טבעי עם השלמה מנוהלת¶
נבנה DLL שמחשב סכום byte-ים על thread טבעי ומדווח תוצאה ל־C#. הלקוח המנוהל יקבל Task, יוכל לבקש ביטול ויחזיק את context של ה־callback עד שה־thread הטבעי הסתיים. הפרויקט ממשיך את מארח הרכיבים מן הפרק הקודם, אבל מחליף חוזה סינכרוני בחוזה שבו הרישום, התוצאה והחזרת הבעלות מתרחשים ברגעים שונים.
הגדירו C ABI עם start, cancel ו־join. פעולת start תקבל options עם size/version, קלט עם אורך, callback ו־context, ותחזיר operation handle אטום. במימוש הבסיסי הספרייה תעתיק את הקלט בזמן start, ולכן הלקוח יצטרך לקבע אותו רק עד חזרת הקריאה. פעולת cancel תהיה בקשה בלבד, ו־join תהיה הפעולה שמוכיחה שאין עוד callback פעיל ומשחררת את operation handle.
ה־wrapper חייב להחזיק GCHandle עבור מצב ההשלמה, למנוע חריגה מנוהלת מעבר ל־callback, ולהימנע משחרור context מתוך callback. רישום הביטול ינותק וימתין לקריאות cancel פעילות לפני join, כדי שלא תתבצע קריאה על operation handle שכבר נמחק. ה־Task שמוצג לצרכן יושלם רק אחרי cleanup, גם אם התוצאה פורסמה קודם בתוך callback.
שלבו תור bounded שמגביל פעולות חיות לשתיים, ולקוח UI שמשתמש בדפוס הסגירה של השיעור הקודם. הוסיפו אירועים עם מזהה עבודה בנקודות start, callback, join ו־release. ההרחבה העצמאית תוסיף גרסת ABI שנייה עם שדה algorithm ותוכיח שלקוח ישן עדיין נדחה או נתמך בצורה מתוכננת.
הבדיקות יכללו קלט ריק, כל אורכי prefix של קלט קצר, קלט של כמה MiB, ביטול לפני start, ביטול בזמן עבודה וביטול אחרי completion. הפעילו אלף מחזורי start/join עם GC כפוי במעבדה כדי לחשוף rooting חסר, והציגו שמספר handles וזיכרון חי אינם גדלים ללא גבול. בדיקת GC אינה הוכחת בטיחות לבדה; נדרש גם תרשים בעלות שמסביר מדוע שום callback לא יכול להגיע אחרי Free.
מדד ההצלחה הוא תוצאה נכונה, השלמה אחת לכל start מוצלח, join אחד לכל operation ושחרור context רק אחריו. הניקוד הוא תקינות 20%, בעלות ומקביליות 25%, התאוששות 15%, הבנת OS ו־runtime 15%, מדידה 10%, שחזור 10% והרחבה עצמאית 5%. מעבר דורש 80 נקודות, וללא use-after-free, חריגה שחוצה את ה־ABI או ביטול שמוצג כאילו היה אישור להפסיק להחזיק buffer.