예제 #1
0
파일: cache.c 프로젝트: Hexasoft/WebFS
/* fetch data from target, from given offset */
int cache_fetch_data(Cache *cache, unsigned int offset) {
  int i, nb=-1;
  unsigned int min;


  mylog("cache_fetch_data(%p, %u)\n", cache, offset);
  /* search for a free chunk */
  for(i=0; i<cache_chunks; i++) {
    if (cache->chunks[i] == NULL) {
      nb = i;
      break;
    }
  }
  
  mylog("cache_fetch: found empty chunk slot %d\n", nb);
  
  if (nb < 0) {
    /* none free? use the smallest offset (assume seq. read - should use older) */
    min = cache->chunks[0]->off_start;
    nb = 0;
    for(i=1; i<cache_chunks; i++) {
      if (cache->chunks[i]->off_start < min) {
	min = cache->chunks[i]->off_start;
	nb = i;
      }
    }
  } else {
    /* allocate the chunk */
    cache->chunks[nb] = malloc(sizeof(Chunk));
    if (cache->chunks[nb] == NULL) {
      return(0);
    }
    cache->chunks[nb]->off_start = 0;
    cache->chunks[nb]->off_end = 0;
    cache->chunks[nb]->data = malloc(cache_chunksize);
    if (cache->chunks[nb]->data == NULL) {
      free(cache->chunks[nb]);
      cache->chunks[nb] = NULL;
      return(0);
    }
    
  mylog("cache_fetch: chunk %d allocated (size=%d) [%p-%p[\n", nb, cache_chunksize,
          cache->chunks[nb]->data, cache->chunks[nb]->data+cache_chunksize);
  }
  
  /* set new values */
  cache->chunks[nb]->off_start = offset;
  mylog("cache_fetch: put start=%u\n", offset);
  if (offset+cache_chunksize > cache->size) {
    /* after end of file. reduce */
    cache->chunks[nb]->off_end = cache->size - 1;
  } else {
    cache->chunks[nb]->off_end = offset + cache_chunksize - 1;
  }
  mylog("cache_fetch: put end=%u\n", cache->chunks[nb]->off_end);
  
  /* perform read */
  mylog("cache_fetch: performing do_read (%p, %d)\n", cache, nb);
  if (!cache_do_read(cache, nb)) {
    /* argl. this chunk is no more valid. destroy it */
    cache_chunk_free(cache->chunks[nb]);
    cache->chunks[nb] = NULL;
    return(0);
  }
  
  return(1);
}
예제 #2
0
errno_t cache_get( cache_t *c, long blk, void *data )
{
    return cache_do_read( c, blk, data );
}