亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cache.c

?? ATMEL單片機可用的文件系統源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:

  /*-------------------------------------------------------------------*/
  /* Set the LRU head to first and LRU tail to last entry in pool.     */
  /*-------------------------------------------------------------------*/
  C->lru_head = &C->pool[0];
  C->lru_tail = &C->pool[C->pool_size - 1];
}

/***********************************************************************/
/* DestroyCache: Deallocate all the memory taken by cache C            */
/*                                                                     */
/*       Input: C = cache to be deleted                                */
/*                                                                     */
/***********************************************************************/
void DestroyCache(Cache *C)
{
  /*-------------------------------------------------------------------*/
  /* Write back all the dirty sectors.                                 */
  /*-------------------------------------------------------------------*/
  FlushSectors(C);

  /*-------------------------------------------------------------------*/
  /* Deallocate the memory for the pool and the hash table.            */
  /*-------------------------------------------------------------------*/
  free(C->pool[0].sector);
  free(C->pool);
  free(C->hash_tbl);

  /*-------------------------------------------------------------------*/
  /* Null out the LRU head and tail.                                   */
  /*-------------------------------------------------------------------*/
  C->lru_head = C->lru_tail = NULL;
}

/***********************************************************************/
/*   GetSector: Return pointer to cache entry containing the specified */
/*              sector number, bringing the sector into the cache if   */
/*              not already there.                                     */
/*                                                                     */
/*      Inputs: C = cache pointer                                      */
/*              sector_number = sector to return pointer to            */
/*              skip_read = if TRUE, don't read new sector from media  */
/*              file_ptr = pointer to file control information         */
/*              entry_ptr = cache entry with new sector                */
/*                                                                     */
/*     Returns: GET_OK on success, GET_WRITE_ERROR on write error,     */
/*              GET_READ_ERROR on read error                           */
/*                                                                     */
/***********************************************************************/
int GetSector(Cache *C, int sector_number, int skip_read, void *file_ptr,
              CacheEntry **entry_ptr)
{
  int index, r_val = GET_OK;
  CacheEntry *entry;

  /*-------------------------------------------------------------------*/
  /* Remember the current sector being chached and get the head of the */
  /* list in which the corresponding entry would be in the cache.      */
  /*-------------------------------------------------------------------*/
  C->sector_number = sector_number;
  entry = C->hash_tbl[hash(C->sector_number, C->pool_size)];

  /*-------------------------------------------------------------------*/
  /* Look first if sector is already in the cache.                     */
  /*-------------------------------------------------------------------*/
  for (; entry; entry = entry->next_hash)
    if (entry->sect_num == C->sector_number)
    {
      /*---------------------------------------------------------------*/
      /* If entry is on replacer list, take it out.                    */
      /*---------------------------------------------------------------*/
      if (entry->pin_cnt++ == 0)
        remove_from_replacer(entry, C);

      *entry_ptr = entry;
      return r_val;
    }

  /*-------------------------------------------------------------------*/
  /* The sector is not in the cache. Choose one to replace with LRU    */
  /* replacement policy.                                               */
  /*-------------------------------------------------------------------*/
  entry = C->lru_head;
  remove_from_replacer(C->lru_head, C);

  /*-------------------------------------------------------------------*/
  /* There should always be an available sector.                       */
  /*-------------------------------------------------------------------*/
  PfAssert(entry);

  /*-------------------------------------------------------------------*/
  /* If dirty sector, write it back to its medium.                     */
  /*-------------------------------------------------------------------*/
  if (entry->dirty != CLEAN && C->write(entry, FALSE))
  {
    entry->dirty = CLEAN;
    put_into_tail(entry, C);
    *entry_ptr = NULL;
    return GET_WRITE_ERROR;
  }

  /*-------------------------------------------------------------------*/
  /* If the entry is in the hash table, remove it from there.          */
  /*-------------------------------------------------------------------*/
  if (entry->hash_loc)
  {
    /*-----------------------------------------------------------------*/
    /* If entry is not first, update previous one, else update head.   */
    /*-----------------------------------------------------------------*/
    if (entry->prev_hash)
      entry->prev_hash->next_hash = entry->next_hash;
    else
      *(entry->hash_loc) = entry->next_hash;

    /*-----------------------------------------------------------------*/
    /* If next entry needs to be updated, update it.                   */
    /*-----------------------------------------------------------------*/
    if (entry->next_hash)
      entry->next_hash->prev_hash = entry->prev_hash;
  }

  /*-------------------------------------------------------------------*/
  /* Read new sector into the cache if skip_read is not set.           */
  /*-------------------------------------------------------------------*/
  if (skip_read == FALSE &&
      C->read(entry->sector, (ui32)C->sector_number))
  {
    set_errno(EIO);
    r_val = GET_READ_ERROR;
  }

  /*-------------------------------------------------------------------*/
  /* Set entry for new sector.                                         */
  /*-------------------------------------------------------------------*/
  entry->sect_num = C->sector_number;
  entry->dirty = CLEAN;
  entry->pin_cnt = 1;
  entry->file_ptr = file_ptr;

  /*-------------------------------------------------------------------*/
  /* Add new entry into the hash table.                                */
  /*-------------------------------------------------------------------*/
  index = hash(C->sector_number, C->pool_size);
  entry->prev_hash = NULL;

  if (C->hash_tbl[index])
  {
    entry->next_hash = C->hash_tbl[index];
    C->hash_tbl[index]->prev_hash = entry;
  }
  else
    entry->next_hash = NULL;

  C->hash_tbl[index] = entry;
  entry->hash_loc = &C->hash_tbl[index];

  /*-------------------------------------------------------------------*/
  /* No need to remember the sector being cached any longer.           */
  /*-------------------------------------------------------------------*/
  C->sector_number = -1;

  *entry_ptr = entry;
  return r_val;
}

/***********************************************************************/
/* FlushFileSectors: Flush all sectors belonging to a file             */
/*                                                                     */
/*      Inputs: C = cache for which flush is to be performed           */
/*              file_ptr = pointer to file                             */
/*                                                                     */
/*     Returns: NULL on success, (void)-1 on failure                   */
/*                                                                     */
/***********************************************************************/
void *FlushFileSectors(Cache *C, const void *file_ptr)
{
  int i;
  void *r_val = NULL;

  /*-------------------------------------------------------------------*/
  /* If no dirty sectors, return success.                              */
  /*-------------------------------------------------------------------*/
  if (!C->dirty_old && !C->dirty_new)
    return NULL;

  /*-------------------------------------------------------------------*/
  /* Loop over cache entries, flushing each one.                       */
  /*-------------------------------------------------------------------*/
  C->dirty_old = C->dirty_new = FALSE;
  for (i = 0; i < C->pool_size; ++i)
  {
    /*-----------------------------------------------------------------*/
    /* If sector is not clean, either it belongs to the file or have   */
    /* to set the dirty flag.                                          */
    /*-----------------------------------------------------------------*/
    if (C->pool[i].dirty != CLEAN)
    {
      /*---------------------------------------------------------------*/
      /* If it belongs to the file, write it and mark it clear.        */
      /*---------------------------------------------------------------*/
      if (C->pool[i].file_ptr == file_ptr)
      {
        if (C->write(&C->pool[i], TRUE))
          r_val = (void *)-1;
        C->pool[i].dirty = CLEAN;
      }

      /*---------------------------------------------------------------*/
      /* Else, mark the appropriate flag.                              */
      /*---------------------------------------------------------------*/
      else if (C->pool[i].dirty == DIRTY_NEW)
        C->dirty_new = TRUE;
      else
        C->dirty_old = TRUE;
    }
  }
  return r_val;
}

/***********************************************************************/
/* FlushSectors: Go through cache and flush all dirty sectors          */
/*                                                                     */
/*       Input: C = cache for which flush is to be performed           */
/*                                                                     */
/*     Returns: -1 on failure, 0 if no sectors written, 1 otherwise    */
/*                                                                     */
/***********************************************************************/
int FlushSectors(Cache *C)
{
  int i, r_val = 0, written;

  /*-------------------------------------------------------------------*/
  /* If no dirty sectors, return.                                      */
  /*-------------------------------------------------------------------*/
  if (!C->dirty_old && !C->dirty_new)
    return 0;

  /*-------------------------------------------------------------------*/
  /* Loop over cache entries, flushing each one.                       */
  /*-------------------------------------------------------------------*/
  for (i = 0, written = FALSE; i < C->pool_size; ++i)
  {
    /*-----------------------------------------------------------------*/
    /* If sector is not clean, write it and then mark it clean.        */
    /*-----------------------------------------------------------------*/
    if (C->pool[i].dirty != CLEAN)
    {
      written = TRUE;
      if (C->write(&C->pool[i], TRUE))

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色94色欧美sute亚洲线路二| 91成人网在线| 亚洲chinese男男1069| 在线免费亚洲电影| 男女视频一区二区| 在线精品视频小说1| 午夜精品一区二区三区电影天堂| 欧美在线观看视频一区二区| 五月激情综合婷婷| 亚洲精品成人少妇| 久久疯狂做爰流白浆xx| 成人免费视频免费观看| 精品国产一区二区三区不卡| 亚洲午夜av在线| 99精品视频在线观看免费| 久久精品人人做人人爽人人| 亚洲aaa精品| 欧美日韩国产一级二级| 一卡二卡欧美日韩| 99久久精品免费| 中文字幕中文字幕在线一区| 国产一区91精品张津瑜| 日韩一区二区三区免费看| 亚洲成人激情社区| 欧美在线观看一区| 亚洲午夜精品在线| 欧美色男人天堂| 亚洲午夜久久久久久久久电影院 | 国产精品一区二区在线看| 亚洲视频一区在线观看| www.性欧美| 国产精品福利电影一区二区三区四区| 国产在线国偷精品免费看| 欧美电影免费观看高清完整版在 | 一片黄亚洲嫩模| 91激情在线视频| 一区二区三区在线免费观看| 在线观看欧美黄色| 亚洲aⅴ怡春院| 日韩小视频在线观看专区| 久久精品久久精品| 国产亚洲欧洲一区高清在线观看| 国产精品亚洲人在线观看| 欧美激情一区二区三区| av一二三不卡影片| 亚洲精选免费视频| 欧美精品电影在线播放| 免费成人在线网站| 国产日韩精品一区二区三区| av中文一区二区三区| 亚洲与欧洲av电影| 欧美一二三四区在线| 国产一区二区三区黄视频| 国产精品久久久久久久久动漫 | 国产一区二区三区美女| 欧美精品电影在线播放| 精品福利av导航| 18欧美亚洲精品| 亚洲成人综合在线| 99久久伊人久久99| 在线观看成人免费视频| 91精品麻豆日日躁夜夜躁| 国产欧美一二三区| 久久99深爱久久99精品| 91精品国产一区二区三区蜜臀| 亚洲 欧美综合在线网络| 日韩免费福利电影在线观看| 国产精品乡下勾搭老头1| 樱桃视频在线观看一区| 精品剧情v国产在线观看在线| 成人黄色av网站在线| 亚洲一卡二卡三卡四卡| 久久丝袜美腿综合| 在线区一区二视频| 国产成人夜色高潮福利影视| 亚洲18影院在线观看| 日本一区二区动态图| 91精品国产综合久久蜜臀| 国产成人h网站| 日本成人超碰在线观看| 中文字幕永久在线不卡| 欧美va亚洲va国产综合| 欧美在线|欧美| 不卡视频在线观看| 国内久久婷婷综合| 视频一区二区三区中文字幕| 国产精品免费av| www欧美成人18+| 欧美日韩在线三级| 91尤物视频在线观看| 国产乱码一区二区三区| 婷婷综合另类小说色区| 亚洲欧洲制服丝袜| 国产欧美日韩不卡| 久久免费视频色| 欧美一区二区人人喊爽| 欧美视频你懂的| 色呦呦网站一区| 成人美女视频在线看| 国内精品第一页| 久久er99精品| 毛片av一区二区| 日韩电影免费在线看| 亚洲成人精品一区二区| 亚洲综合自拍偷拍| 亚洲精品中文字幕在线观看| 国产精品久久久久四虎| 欧美激情一区二区三区四区| 久久亚洲私人国产精品va媚药| 国产精品99久久久久| 中文字幕永久在线不卡| 一区二区三区四区激情| 久久久国际精品| 欧美四级电影在线观看| 国产激情一区二区三区四区 | 激情成人综合网| 国产日产欧美一区| 精品成人在线观看| 青青草精品视频| 日韩一级成人av| 7777女厕盗摄久久久| 538在线一区二区精品国产| 欧美一区二区三区色| 69p69国产精品| 久久综合九色综合欧美就去吻| 精品免费国产二区三区| 久久这里只有精品6| 久久久久国产一区二区三区四区| 久久精品人人爽人人爽| 久久免费的精品国产v∧| 国产日韩精品久久久| 国产亚洲欧美日韩在线一区| 久久蜜桃av一区二区天堂| 久久精品视频一区二区三区| 国产视频在线观看一区二区三区| 中文久久乱码一区二区| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 国产精品久久久久久久久晋中| 一片黄亚洲嫩模| 久久精品国产澳门| 成人禁用看黄a在线| 在线观看日韩电影| 欧美精品一区二区精品网| 欧美国产乱子伦| 亚洲国产精品麻豆| 美女一区二区三区在线观看| 国产成人精品1024| 欧美美女一区二区| 欧美国产精品中文字幕| 天堂精品中文字幕在线| 国产91对白在线观看九色| 欧美三级电影一区| 国产日韩欧美精品一区| 日韩中文字幕不卡| 成人av在线影院| 日韩一区二区三区电影 | 日本一区二区久久| 亚洲福利电影网| 成人福利在线看| 日韩欧美中文字幕精品| 亚洲欧美精品午睡沙发| 精品亚洲aⅴ乱码一区二区三区| 99re在线精品| 久久久精品2019中文字幕之3| 亚洲国产精品综合小说图片区| 国产电影精品久久禁18| 91精品国产综合久久精品图片| 国产亚洲一区二区三区| 91小视频在线免费看| 午夜在线电影亚洲一区| 99久久精品99国产精品| 精品国产欧美一区二区| 偷拍日韩校园综合在线| 欧美不卡一区二区三区四区| 国产精品丝袜91| 国产一区在线视频| 精品久久久久久久久久久院品网 | 国产欧美精品日韩区二区麻豆天美| 国产精品久久久久久妇女6080 | 午夜国产不卡在线观看视频| 福利电影一区二区| 精品免费99久久| 婷婷国产在线综合| 一本大道av一区二区在线播放| 国产香蕉久久精品综合网| 久久国产精品第一页| 91精选在线观看| 午夜欧美在线一二页| 欧美亚洲动漫精品| 一级精品视频在线观看宜春院 | 日韩视频永久免费| 亚洲超丰满肉感bbw| 欧美日韩一区国产| 亚洲一区二区美女| 欧美午夜精品久久久| 一区二区三区 在线观看视频| 色婷婷综合在线| 亚洲综合免费观看高清完整版在线 | eeuss鲁片一区二区三区| 欧美高清一级片在线观看|