flashsim源码阅读(intq队列操作)7-8

推荐源码阅读的的工具是sourceInsight3.5,直接将源码文件导入,就会生成一个各文件关联的工程,这个工具可自行百度,配合Nodepad++修改注释阅读更好,因为SI不知道为什么对中文注释输入的支持不是很好。继续昨天的源码阅读。
昨天研究到disksim.c中的extarq队列的操作函数,extraq队列就像是预先申请的空的内存,今天看的是intq队列操作函数,intq是处理调度event的队列。
开始介绍intq的相关函数:

disksim_dumpintq () 函数

先给出该函数在disksim.c中的的原代码段:

static void disksim_dumpintq ()
{
   event *tmp;
   int i = 0;

   tmp = disksim->intq;
   while (tmp != NULL) {
      i++;
      fprintf (outputfile, "time %f, type %d\n", 
           tmp->time, tmp->type);
      tmp = tmp->next;
   }
}

disksim->inqdisksim->extraq一样都是指向队列的头部元素。这个函数就是遍历intq队列,将intq队列里面每个event的信息(队列中的event的time,Type)输出到outputfile中去,可能是为了之后的调试使用的函数。

INLINE void addtointq (event *newint) 函数

一看这个函数也是一个内联函数,和之前的addtoextraq 很像,先看其函数原代码段:

INLINE void addtointq (event *newint)
{
  /* WARNING -- HORRIBLE HACK BELOW
   * In order to make the Memulator run (which sometimes has events arrive
   * "late") I've (JLG) commented out the following snippet.  A better
   * solution should be arrived at...
   */
#if 0
   if ((temp->time + DISKSIM_TIME_THRESHOLD) < simtime) {
       //如果当前的event的时间比simtime还要早,就是已经错过了调度
      fprintf(stderr, "Attempting to addtointq an event whose time has passed\n");
      fprintf(stderr, "simtime %f, curr->time %f, type = %d\n", simtime, temp->time, temp->type);
      exit(1);
   }
#endif


   switch(disksim->trace_mode) {
   //这边关于disksim->trace_mode指的是负载还是?有待考证
   case DISKSIM_MASTER:
   //这个Master模式下把,新加入的newint写入到tracepipes[1]中
     if(write(disksim->tracepipes[1], (char *)newint, sizeof(event)) <= 0)
       {
     //  printf("addtointq() -- master write fd = %d\n", disksim->tracepipes[1]);
     //  perror("addtointq() -- master write");
       }
     break;
   case DISKSIM_SLAVE:
   //这个SLAVE模式下把tracepipes[0]中的内容传到tmpevt(event类型)中去
     {
       event tmpevt;
       double timediff;

       //       printf("addtointq() -- slave read\n");

       ddbg_assert(read(disksim->tracepipes[0], (char *)&tmpevt, sizeof(event)) > 0);

       timediff = fabs(tmpevt.time - newint->time);//计算tmpevt和newint的时间差

/*         printf("remote event: %d %f, local event: %d %f\n", */
/*            tmpevt.type,  */
/*            newint->type,  */
/*      
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值