Ruby: Correct DataBlock =operator

The =operator for the DataBlock class was incorrectly interpreting the class
member m_alloc. This variable stands for whether the assigned memory for the
data block needs to be freed or not by the class itself. It seems that the
=operator interpreted the variable as whether the memory is assigned to the
data block. This wrong interpretation was causing values not to propagate
to RubySystem::m_mem_vec_ptr. This caused major issues with restoring from
checkpoints when using a protocol which verified that the cache data was
consistent with the backing store (i.e. MOESI-hammer).
This commit is contained in:
Jason Power 2012-08-28 17:57:51 -05:00
parent 0cacf7e817
commit 494f6a858e
2 changed files with 3 additions and 9 deletions

View file

@ -87,14 +87,6 @@ DataBlock::setData(uint8* data, int offset, int len)
DataBlock &
DataBlock::operator=(const DataBlock & obj)
{
if (this == &obj) {
// assert(false);
} else {
if (!m_alloc)
m_data = new uint8[RubySystem::getBlockSizeBytes()];
memcpy(m_data, obj.m_data, RubySystem::getBlockSizeBytes());
m_alloc = true;
}
memcpy(m_data, obj.m_data, RubySystem::getBlockSizeBytes());
return *this;
}

View file

@ -29,6 +29,7 @@
#ifndef __MEM_RUBY_COMMON_DATABLOCK_HH__
#define __MEM_RUBY_COMMON_DATABLOCK_HH__
#include <cassert>
#include <iomanip>
#include <iostream>
@ -72,6 +73,7 @@ class DataBlock
inline void
DataBlock::assign(uint8* data)
{
assert(data != NULL);
if (m_alloc) {
delete [] m_data;
}