/** * We use the version number to reset in O(1) time in the common case */ void reset() { lsize = 0; version += 1; // check overflow if (version != 0) return; reset_internal(); }
TM_INLINE void writeback() { #else TM_INLINE void writeback(void** upper_stack_bound) { #endif for (iterator i = begin(), e = end(); i != e; ++i) { #ifdef STM_PROTECT_STACK // See if this falls into the protected stack region, and avoid // the writeback if that is the case. The filter call will update // a byte-log's mask if there is an awkward intersection. // void* top_of_stack; if (i->filter(&top_of_stack, upper_stack_bound)) continue; #endif i->writeback(); } } #if !defined(STM_PROTECT_STACK) TM_INLINE void writebackatomic() { #else TM_INLINE void writebackatomic(void** upper_stack_bound) { #endif for (iterator i = begin(), e = end(); i != e; ++i) { #ifdef STM_PROTECT_STACK // See if this falls into the protected stack region, and avoid // the writeback if that is the case. The filter call will update // a byte-log's mask if there is an awkward intersection. // void* top_of_stack; if (i->filter(&top_of_stack, upper_stack_bound)) continue; #endif i->writebackatomic(); } } /*** size() lets us know if the transaction is read-only */ size_t size() const { return lsize; } /** * We use the version number to reset in O(1) time in the common case */ void reset() { lsize = 0; version += 1; // check overflow if (version != 0) return; reset_internal(); }