65,66c65,66
< m_servicing_atomic = 200;
< m_atomics_counter = 0;
---
> m_atomic_reads = 0;
> m_atomic_writes = 0;
267a268
>
283c284
< m_controller->clear_atomic();
---
> m_controller->clear_atomic(address);
349,358c350
< if (type == RubyRequestType_RMW_Write) {
< if (m_servicing_atomic != ruby_request.proc_id) {
< assert(0);
< }
< assert(m_atomics_counter > 0);
< m_atomics_counter--;
< if (m_atomics_counter == 0) {
< m_servicing_atomic = 200;
< }
< }
---
>
379,397d370
< if (request.type == RubyRequestType_RMW_Read) {
< if (m_servicing_atomic == 200) {
< assert(m_atomics_counter == 0);
< m_servicing_atomic = request.proc_id;
< }
< else {
< assert(m_servicing_atomic == request.proc_id);
< }
< m_atomics_counter++;
< }
< else {
< if (m_servicing_atomic == request.proc_id) {
< if (request.type != RubyRequestType_RMW_Write) {
< m_servicing_atomic = 200;
< m_atomics_counter = 0;
< }
< }
< }
<
425,427d397
< if (request.type == RubyRequestType_RMW_Write) {
< m_controller->started_writes();
< }
447a418,425
> if (m_atomic_reads > 0 && m_atomic_writes == 0) {
> m_controller->reset_atomics();
> }
> else if (m_atomic_writes > 0) {
> assert(m_atomic_reads > m_atomic_writes);
> cerr << "WARNING: Expected: " << m_atomic_reads << " RMW_Writes, but only received: " << m_atomic_writes << endl;
> assert(false);
> }
450a429,436
> if (m_atomic_reads > 0 && m_atomic_writes == 0) {
> m_controller->reset_atomics();
> }
> else if (m_atomic_writes > 0) {
> assert(m_atomic_reads > m_atomic_writes);
> cerr << "WARNING: Expected: " << m_atomic_reads << " RMW_Writes, but only received: " << m_atomic_writes << endl;
> assert(false);
> }
453a440,447
> if (m_atomic_reads > 0 && m_atomic_writes == 0) {
> m_controller->reset_atomics();
> }
> else if (m_atomic_writes > 0) {
> assert(m_atomic_reads > m_atomic_writes);
> cerr << "WARNING: Expected: " << m_atomic_reads << " RMW_Writes, but only received: " << m_atomic_writes << endl;
> assert(false);
> }
457a452,453
> ctype = CacheRequestType_ATOMIC;
> break;
458a455,458
> assert(m_atomic_writes == 0);
> m_atomic_reads++;
> ctype = CacheRequestType_ATOMIC;
> break;
459a460,466
> assert(m_atomic_reads > 0);
> assert(m_atomic_writes < m_atomic_reads);
> m_atomic_writes++;
> if (m_atomic_reads == m_atomic_writes) {
> m_atomic_reads = 0;
> m_atomic_writes = 0;
> }