Ruby: Correct DataBlock =operator
authorJason Power <power.jg@gmail.com>
Tue, 28 Aug 2012 22:57:51 +0000 (17:57 -0500)
committerJason Power <power.jg@gmail.com>
Tue, 28 Aug 2012 22:57:51 +0000 (17:57 -0500)
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).

src/mem/ruby/common/DataBlock.cc
src/mem/ruby/common/DataBlock.hh

index 5aba4332a186907e2b9401f639493bbe0a34c643..59a0f692ae7ca86a1557bf2cd57036c0cba636eb 100644 (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;
 }
index 7bd92710ddea5c2c2aca782f97edaf3871c569dc..0ab4cfc0185bc706d7fd82a374dbf5f0d3b65f4d 100644 (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;
     }