/* * Device management cleanup function */ EXPORT void knl_devmgr_cleanup( void ) { OpnCB *opncb; /* Do nothing if it is not used even once */ if ( knl_resource_control_block.openq.next == NULL ) { return; } LockDM(); /* Free suspend disable request */ knl_DisSusCnt -= knl_resource_control_block.dissus; knl_resource_control_block.dissus = 0; /* Close all open devices */ while ( !isQueEmpty(&(knl_resource_control_block.openq)) ) { opncb = RESQ_OPNCB(knl_resource_control_block.openq.next); /* Indicate that it is during close processing */ opncb->resid = 0; UnlockDM(); /* Device close processing */ knl_close_device(opncb, 0); LockDM(); } UnlockDM(); return; }
/* * Device management break function */ EXPORT void devmgr_break( ID tskid ) { ResCB *rescb; OpnCB *opncb; ReqCB *reqcb; QUEUE *q, *r; DEVREQ *devreq = NULL; INT nreq; /* Get resource management block */ rescb = GetResCB(DEVICE_SVC, tskid); if ( rescb == NULL ) { return; } LockDM(); /* Search the request if 'tskid' task is executing and request abort */ nreq = 0; for ( q = rescb->openq.next; q != &rescb->openq; q = q->next ) { opncb = RESQ_OPNCB(q); if ( opncb->nwaireq > 0 ) { /* Multiple requests wait */ reqcb = DEVREQ_REQCB(opncb->waireqlst); if ( reqcb->tskid == tskid ) { devreq = opncb->waireqlst; nreq = opncb->nwaireq; } } else { /* Start request or single request wait */ for ( r = opncb->requestq.next; r != &opncb->requestq; r = r->next ) { reqcb = (ReqCB*)r; if ( reqcb->tskid == tskid ) { devreq = &reqcb->req; devreq->c.abort = TRUE; nreq = 1; break; } } } if ( nreq > 0 ) { LockDAbort(); break; } } UnlockDM(); if ( nreq > 0 ) { /* Abort request: Device driver call */ call_abortfn(opncb->devcb, tskid, devreq, nreq); UnlockDAbort(); } }
/* * Device management cleanup function */ EXPORT void devmgr_cleanup( ID resid, INT info ) { ResCB *rescb; OpnCB *opncb; ER ercd; ercd = tk_get_res(resid, DEVICE_SVC, (void**)&rescb); if ( ercd < E_OK ) { goto err_ret; } /* Do nothing if it is not used even once */ if ( rescb->openq.next == NULL ) { return; } LockDM(); /* Free suspend disable request */ DisSusCnt -= rescb->dissus; rescb->dissus = 0; /* Close all open devices */ while ( !isQueEmpty(&rescb->openq) ) { opncb = RESQ_OPNCB(rescb->openq.next); /* Indicate that it is during close processing */ opncb->resid = -1; /* Device close processing */ UnlockDM(); close_device(opncb, 0); LockDM(); } UnlockDM(); return; err_ret: DEBUG_PRINT(("devmgr_cleanup ercd = %d\n", ercd)); return; }