⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 disksim_ctlrsmart.c

📁 disksim是一个非常优秀的磁盘仿真工具
💻 C
📖 第 1 页 / 共 2 页
字号:
      if (currctlr->hostwaiters) {         curr->next = currctlr->hostwaiters->next;         currctlr->hostwaiters->next = curr;      } else {         curr->next = curr;      }      currctlr->hostwaiters = curr;      return;   }                                       /* Time for DMA */   curr->time = simtime + ((double) curr->bcount * currctlr->blktranstime);   currctlr->hosttransfer = TRUE;   addtointq((event *) curr);}static void controller_smart_request_arrive (controller *currctlr, ioreq_event *curr){/*fprintf (outputfile, "Request arrived at smart controller: devno %d, blkno %d, flags %x\n", curr->devno, curr->blkno, curr->flags);*/   /* Cache will call "done" function if cache access doesn't block */   currctlr->cache->cache_get_block(currctlr->cache, curr, &disksim->donefunc_ctlrsmart_read, currctlr);}static void controller_smart_access_complete (controller *currctlr, ioreq_event *curr){   struct ioq *queue = currctlr->devices[curr->devno].queue;   ioreq_event *done = ioreq_copy(curr);   int devno = curr->devno;   int numout;   /* Responds to completion interrupt */   done->type = IO_INTERRUPT_COMPLETE;   currctlr->outbusowned = controller_get_downward_busno(currctlr, done, NULL);   controller_send_event_down_path(currctlr, done, currctlr->ovrhd_disk_complete);   currctlr->outbusowned = -1;   /* Handles request completion, including call-backs into cache */   curr = ioqueue_physical_access_done(queue, curr);   while ((done = curr)) {      curr = curr->next;      /* call back into cache with completion -- let it do request_complete */      controller_smart_wakeup(currctlr, currctlr->cache->cache_disk_access_complete(currctlr->cache, done));   }   /* Initiate another request, if any pending */   numout = ioqueue_get_reqoutstanding(queue);   if ((numout < currctlr->devices[devno].maxoutstanding) && (curr = ioqueue_get_next_request(queue))) {      controller_send_event_down_path(currctlr, curr, currctlr->ovrhd_disk_request);   }}static void controller_smart_ready_to_transfer (controller *currctlr, ioreq_event *curr){   curr->type = IO_INTERRUPT_COMPLETE;   curr->cause = RECONNECT;   currctlr->outbusowned = controller_get_downward_busno(currctlr, curr, NULL);   controller_send_event_down_path(currctlr, curr, currctlr->ovrhd_disk_ready);   currctlr->outbusowned = -1;}static void controller_smart_disconnect (controller *currctlr, ioreq_event *curr){   curr->type = IO_INTERRUPT_COMPLETE;   currctlr->outbusowned = controller_get_downward_busno(currctlr, curr, NULL);   controller_send_event_down_path(currctlr, curr, currctlr->ovrhd_disk_disconnect);   currctlr->outbusowned = -1;}static void controller_smart_reconnect_to_transfer (controller *currctlr, ioreq_event *curr){   curr->type = IO_INTERRUPT_COMPLETE;   currctlr->outbusowned = controller_get_downward_busno(currctlr, curr, NULL);   controller_send_event_down_path(currctlr, curr, currctlr->ovrhd_disk_reconnect);   currctlr->outbusowned = -1;}static void controller_smart_interrupt_arrive (controller *currctlr, ioreq_event *curr){   switch (curr->cause) {      case COMPLETION:         controller_smart_access_complete(currctlr, curr);         break;      case RECONNECT:         controller_smart_reconnect_to_transfer(currctlr, curr);         break;      case DISCONNECT:         controller_smart_disconnect(currctlr, curr);         break;      case READY_TO_TRANSFER:         controller_smart_ready_to_transfer(currctlr, curr);         break;      default:         fprintf(stderr, "Unknown interrupt cause in smart_interrupt_arrive: %d\n", curr->cause);         exit(1);   }}static void controller_smart_interrupt_complete (controller *currctlr, ioreq_event *curr){   switch (curr->cause) {       case COMPLETION:          addtoextraq((event *) curr);          break;      default:         fprintf(stderr, "Unknown interrupt cause in smart_interrupt_complete: %d\n", curr->cause);         exit(1);   }}void controller_smart_event_arrive (controller *currctlr, ioreq_event *curr){   switch (curr->type) {      case IO_ACCESS_ARRIVE:         controller_smart_request_arrive(currctlr, curr);         break;      case IO_INTERRUPT_ARRIVE:         controller_smart_interrupt_arrive(currctlr, curr);         break;      case IO_INTERRUPT_COMPLETE:         controller_smart_interrupt_complete(currctlr, curr);         break;      case DEVICE_DATA_TRANSFER_COMPLETE:         controller_smart_disk_data_transfer(currctlr, curr);         break;      case CONTROLLER_DATA_TRANSFER_COMPLETE:         if (curr->tempptr1) {            controller_smart_disk_data_transfer_complete(currctlr, curr);         } else {            controller_smart_host_data_transfer_complete(currctlr, curr);         }         break;      case IO_QLEN_MAXCHECK:         curr->tempint1 = currctlr->ctlno;         curr->tempint2 = currctlr->maxoutstanding;         curr->bcount = currctlr->cache->cache_get_maxreqsize(currctlr->cache);         break;      default:         fprintf(stderr, "Unknown event type arriving at 53c700 controller: %d\n", curr->type);         exit(1);   }}void controller_smart_setcallbacks (){   disksim->issuefunc_ctlrsmart = controller_smart_issue_access;   disksim->queuefind_ctlrsmart = controller_smart_queuefind;   disksim->wakeupfunc_ctlrsmart = controller_smart_wakeup;   disksim->donefunc_ctlrsmart_read = controller_smart_host_data_transfer;   disksim->donefunc_ctlrsmart_write = controller_smart_request_complete;   ioqueue_setcallbacks ();   cache_setcallbacks ();}void controller_smart_initialize (controller *currctlr){   int numdevs = device_get_numdevices();   device *currdev;   int i;   controller_smart_setcallbacks ();   currctlr->numdevices = numdevs;   currctlr->devices = (device *) DISKSIM_malloc(numdevs * sizeof(device));   ASSERT(currctlr->devices != NULL);   for (i=0; i<numdevs; i++) {      currdev = &currctlr->devices[i];      currdev->devno = i;      currdev->busy = FALSE;      currdev->flag = 0;      currdev->queue = ioqueue_copy(currctlr->queue);      ioqueue_initialize(currdev->queue, i);      iosim_get_path_to_device (0, i, &currdev->buspath, &currdev->slotpath);      currdev->maxoutstanding = currctlr->maxdiskqsize;   }   currctlr->cache->cache_initialize(currctlr->cache, &disksim->issuefunc_ctlrsmart, currctlr, &disksim->queuefind_ctlrsmart, currctlr, &disksim->wakeupfunc_ctlrsmart, currctlr, numdevs);}void controller_smart_resetstats (controller *currctlr){   int numdevs = device_get_numdevices();   int i;   for (i=0; i<numdevs; i++) {      ioqueue_resetstats(currctlr->devices[i].queue);   }   currctlr->cache->cache_resetstats(currctlr->cache);}void controller_smart_printstats (controller *currctlr, char *prefix){   ctlrinfo_t *ctlrinfo = disksim->ctlrinfo;   int devno;   char devprefix[181];   struct ioq **queueset = DISKSIM_malloc (currctlr->numdevices * sizeof(void *));   if (ctlrinfo->ctl_printcachestats) {      currctlr->cache->cache_printstats(currctlr->cache, prefix);   }   for (devno=0; devno<currctlr->numdevices; devno++) {      queueset[devno] = currctlr->devices[devno].queue;   }   sprintf (devprefix, "%sdevices ", prefix);   ioqueue_printstats (queueset, currctlr->numdevices, devprefix);   if ((ctlrinfo->ctl_printperdiskstats) && (currctlr->numdevices > 1)) {      for (devno=0; devno<currctlr->numdevices; devno++) {         struct ioq *queue = currctlr->devices[devno].queue;         if (ioqueue_get_number_of_requests(queue)) {            sprintf(devprefix, "%sdevice #%d ", prefix, devno);            ioqueue_printstats(&queue, 1, devprefix);         }      }   }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -