פתרון חיי התקן וניהול כוח¶
ה־device context חי בדרך כלל כל עוד אובייקט ה־device חי, אבל שדה שמצביע למשאב חומרה תקף רק בתוך חלון החיים של אותו משאב. מיפוי רגיסטרים יכול להיווצר ב־PrepareHardware ולהשתחרר ב־ReleaseHardware, בעוד הזכות לגשת להתקן תלויה גם במצב הכוח ובהסרה.
ה־timer הוא ילד של device, אך עצירה יזומה שלו נדרשת לפני שהקוד משנה את זמינות העבודה. הורות מסייעת בניקוי הסופי, ואינה מחליפה את פרוטוקול D0Exit. בקשת I/O נשארת חיה עד completion גם אם ההתקן כבר אינו מקבל עבודה חדשה.
מעגל ההמתנה¶
ה־thread של D0Exit מחזיק את נעילת ה־device וממתין לסיום timer. ה־timer כבר התחיל וממתין לנעילה לפני כניסה ל־callback. אף צד אינו יכול להתקדם. התיקון הוא לשנות Online תחת הנעילה, לשחרר אותה ורק אז לבצע המתנה סינכרונית.
הבדיקה צריכה להתייחס גם ל־purge שמפעיל callbacks של ביטול. אם הם צריכים את אותה נעילה, החזקתה בזמן המתנה להם יוצרת בעיה דומה. לכן פעולות שמתנקזות מחוץ לנעילה הן חלק מהוכחת החיים.
תוצאת בקשה בזמן מעבר כוח¶
בקשה שנמצאת עדיין בתור יכולה להתבטל או להישמר לפי מדיניות התור. בקשה שה־timer כבר הוציא ועיבד יכולה להסתיים בהצלחה לפני שה־Online השתנה. המרוץ אינו פגם כל עוד כל בקשה מסתיימת פעם אחת ואין גישה למשאב שכבר אינו זמין.
בדוח מסמנים את נקודת ההכרעה ואת ה־callback שזכה בבעלות. אין לדרוש שכל בקשה בזמן restart תפיק אותה תוצאה בלי להגדיר קודם נקודת חיתוך לוגית.
הסרה ללא חומרה זמינה¶
ב־surprise removal מתייחסים לחומרה כלא זמינה. ממשיכים רק בפעולות תוכנה שמותרות לפי החוזה, כמו סימון מצב וניקוי בקשות. ניסיון לקרוא רגיסטר כדי "לבדוק" את המצב עלול להיות בדיוק הגישה שאסור לבצע.
התקן התוכנה של המעבדה מאפשר לבדוק את סדרי הבעלות, אך אינו מאמת התנהגות bus או התקן פיזי. הרחבה לחומרה דורשת מודל משאבים ו־power המתאים לאותו התקן.