void tets(void) 
{
	StatisticsInfo *info = statistics_create(NULL);
	CU_ASSERT_NOT_EQUAL(info, NULL);
	CU_ASSERT_EQUAL(info->clock_counter, 0);
	CU_ASSERT_EQUAL(info->write_counter, 0);
	statistics_add_counter(info, 5);
	CU_ASSERT_EQUAL(info->clock_counter, 5);
	statistics_add_counter(info, 6);
	CU_ASSERT_EQUAL(info->clock_counter, 11);
	statistics_add_write(info);
	CU_ASSERT_EQUAL(info->write_counter, 1);
	CU_ASSERT_EQUAL(statistics_free(info), NULL);
}
Example #2
0
/*!
 Функция записи в кеш в случае отложенной записи
 */
static void direct_cache_wb_write(AbstractMemory *m, memaddr_t addr, int size,
        const MemoryCell *src)
{
    DirectCache *c = (DirectCache*) m;
    memaddr_t aligned_addr = addr & -c->block_size;
    statistics_add_counter(c->b.info, c->cache_write_time);
    DirectCacheBlock *b = direct_cache_find(c, aligned_addr);
    if (!b) {
        b = direct_cache_place(c, aligned_addr);
        b->addr = aligned_addr;
        c->mem->ops->read(c->mem, aligned_addr, c->block_size, b->mem);
    }
    memcpy(b->mem + (addr - aligned_addr), src, size * sizeof(b->mem[0]));
    b->dirty = 1;
}
Example #3
0
/*!
  Функция записи в кеш в случае сквозной записи
  \param m Указатель на структуру описания модели полноассоциативного кеша (в виде указателя на базовую структуру)
  \param addr Адрес в полноассоциативном кеше
  \param size Количество записываемых ячеек
  \param src Указатель, откуда копировать ячейки в полноассоциативного кеша
*/
static void
full_cache_wt_write(
    AbstractMemory *m,
    memaddr_t addr,
    int size,
    const MemoryCell *src)
{
    FullCache *c = (FullCache*) m;
    memaddr_t aligned_addr = addr & -c->block_size;
    FullCacheBlock *b = full_cache_find(c, aligned_addr);
    statistics_add_counter(c->b.info, c->cache_write_time);
    if (b) {
        memcpy(b->mem + (addr - aligned_addr), src, size * sizeof(b->mem[0]));
    }
    c->mem->ops->write(c->mem, addr, size, src);
}
Example #4
0
/*!
  Функция записи в кеш в случае отложенной записи
  \param m Указатель на структуру описания модели полноассоциативного кеша (в виде указателя на базовую структуру)
  \param addr Адрес в полноассоциативном кеше
  \param size Количество записываемых ячеек
  \param src Указатель, откуда копировать ячейки в полноассоциативного кеша
*/
static void
full_cache_wb_write(
    AbstractMemory *m,
    memaddr_t addr,
    int size,
    const MemoryCell *src)
{
    FullCache *c = (FullCache*) m;
    memaddr_t aligned_addr = addr & -c->block_size;
    statistics_add_counter(c->b.info, c->cache_write_time);
    FullCacheBlock *b = full_cache_find(c, aligned_addr);
    if (!b) {
        b = c->full_ops.cache_place(c, aligned_addr);
    }
    memcpy(b->mem + (addr - aligned_addr), src, size * sizeof(b->mem[0]));
    b->dirty = 1;
}
Example #5
0
/*!
  Прочитать ячейки из полноассоциативного кеша
  \param m Указатель на структуру описания модели полноассоциативного кеша (в виде указателя на базовую структуру)
  \param addr Адрес в полноассоциативном кеше
  \param size Количество считываемых ячеек
  \param dst Указатель, куда копировать ячейки из полноассоциативного кеша
 */
static void
full_cache_read(
    AbstractMemory *m,
    memaddr_t addr,
    int size,
    MemoryCell *dst)
{
    FullCache *c = (FullCache*) m;
    memaddr_t aligned_addr = addr & -c->block_size;
    statistics_add_counter(c->b.info, c->cache_read_time);
    FullCacheBlock *b = full_cache_find(c, aligned_addr);
    if (b) {
        statistics_add_hit_counter(c->b.info);
    } else {
        b = c->full_ops.cache_place(c, aligned_addr);
    }
    if (dst) {
		// выполняем копирование данных:
		memcpy(dst, b->mem + (addr - aligned_addr), size * sizeof(b->mem[0]));
	}
}