void simpledisk_bus_ownership_grant (int devno, ioreq_event *curr, int busno, double arbdelay) { simpledisk_t *currdisk; ioreq_event *tmp; currdisk = getsimpledisk (devno); #ifdef DEBUG_SIMPLEDISK fprintf (outputfile, "*** %f: simpledisk_bus_ownership_grant - devno %d, type %d, cause %d, blkno %d\n", simtime, curr->devno, curr->type, curr->cause, curr->blkno); #endif tmp = currdisk->buswait; while ((tmp != NULL) && (tmp != curr)) { tmp = tmp->next; } if (tmp == NULL) { fprintf(stderr, "Bus ownership granted to unknown simpledisk request - devno %d, busno %d\n", devno, busno); exit(1); } currdisk->busowned = busno; currdisk->stat.waitingforbus += arbdelay; //ASSERT (arbdelay == (simtime - currdisk->stat.requestedbus)); currdisk->stat.numbuswaits++; bus_delay(busno, DEVICE, devno, tmp->time, tmp); }
/* * ssd_send_event_up_path() * * Acquires the bus (if not already acquired), then uses bus_delay to * send the event up the path. * * If the bus is already owned by this device or can be acquired * immediately (interleaved bus), the event is sent immediately. * Otherwise, ssd_bus_ownership_grant will later send the event. */ static void ssd_send_event_up_path (ioreq_event *curr, double delay) { ssd_t *currdisk; int busno; int slotno; // fprintf (outputfile, "ssd_send_event_up_path - devno %d, type %d, cause %d, blkno %d\n", curr->devno, curr->type, curr->cause, curr->blkno); currdisk = getssd (curr->devno); ssd_assert_current_activity(currdisk, curr); busno = ssd_get_busno(curr); slotno = currdisk->slotno[0]; /* Put new request at head of buswait queue */ curr->next = currdisk->buswait; currdisk->buswait = curr; curr->tempint1 = busno; curr->time = delay; if (currdisk->busowned == -1) { // fprintf (outputfile, "Must get ownership of the bus first\n"); if (curr->next) { //fprintf(stderr,"Multiple bus requestors detected in ssd_send_event_up_path\n"); /* This should be ok -- counting on the bus module to sequence 'em */ } if (bus_ownership_get(busno, slotno, curr) == FALSE) { /* Remember when we started waiting (only place this is written) */ currdisk->stat.requestedbus = simtime; } else { currdisk->busowned = busno; bus_delay(busno, DEVICE, curr->devno, delay, curr); /* Never for SCSI */ } } else if (currdisk->busowned == busno) { //fprintf (outputfile, "Already own bus - so send it on up\n"); bus_delay(busno, DEVICE, curr->devno, delay, curr); } else { fprintf(stderr, "Wrong bus owned for transfer desired\n"); exit(1); } }
void simpledisk_bus_ownership_grant (int devno, ioreq_event *curr, int busno, double arbdelay) { simpledisk_t *currdisk; ioreq_event *tmp; currdisk = getsimpledisk (devno); tmp = currdisk->buswait; while ((tmp != NULL) && (tmp != curr)) { tmp = tmp->next; } if (tmp == NULL) { fprintf(stderr, "Bus ownership granted to unknown simpledisk request - devno %d, busno %d\n", devno, busno); exit(1); } currdisk->busowned = busno; currdisk->stat.waitingforbus += arbdelay; //ASSERT (arbdelay == (simtime - currdisk->stat.requestedbus)); currdisk->stat.numbuswaits++; bus_delay(busno, DEVICE, devno, tmp->time, tmp); }