event_counter m_nDisposedNode; ///< Count of disposed node
event_counter m_nDisposedValue; ///< Count of disposed value
event_counter m_nExtractedValue; ///< Count of extracted value
+ event_counter m_nRemoveSuccess; ///< Count of successfully \p erase() call
+ event_counter m_nRemoveFailed; ///< Count of failed \p erase() call
event_counter m_nRemoveRetry; ///< Count o erase/extract retries
+ event_counter m_nExtractSuccess; ///< Count of successfully \p extract() call
+ event_counter m_nExtractFailed; ///< Count of failed \p extract() call
event_counter m_nRemoveWaitShrinking; ///< ount of waiting until shrinking completed during \p erase() or \p extract() call
event_counter m_nRemoveRootWaitShrinking; ///< Count of waiting until root shrinking completed duting \p erase() or \p extract() call
+ event_counter m_nMakeRoutingNode; ///< How many nodes were converted to routing (valueless) nodes
event_counter m_nRightRotation; ///< Count of single right rotation
event_counter m_nLeftRotation; ///< Count of single left rotation
void onDisposeNode() { ++m_nDisposedNode; }
void onDisposeValue() { ++m_nDisposedValue; }
void onExtractValue() { ++m_nExtractedValue; }
+ void onRemove(bool bSuccess)
+ {
+ if ( bSuccess )
+ ++m_nRemoveSuccess;
+ else
+ ++m_nRemoveFailed;
+ }
+ void onExtract( bool bSuccess )
+ {
+ if ( bSuccess )
+ ++m_nExtractSuccess;
+ else
+ ++m_nExtractFailed;
+ }
void onRemoveRetry() { ++m_nRemoveRetry; }
void onRemoveWaitShrinking() { ++m_nRemoveWaitShrinking; }
void onRemoveRootWaitShrinking() { ++m_nRemoveRootWaitShrinking; }
+ void onMakeRoutingNode() { ++m_nMakeRoutingNode; }
void onRotateRight() { ++m_nRightRotation; }
void onRotateLeft() { ++m_nLeftRotation; }
void onDisposeNode() const {}
void onDisposeValue() const {}
void onExtractValue() const {}
+ void onRemove(bool /*bSuccess*/) const {}
+ void onExtract(bool /*bSuccess*/) const {}
void onRemoveRetry() const {}
void onRemoveWaitShrinking() const {}
void onRemoveRootWaitShrinking() const {}
+ void onMakeRoutingNode() const {}
void onRotateRight() const {}
void onRotateLeft() const {}
if ( result == update_flags::retry )
m_stat.onRemoveRetry();
- else
+ else {
+ m_stat.onExtract( result == update_flags::result_removed );
return;
+ }
}
}
}
key_comparator(),
[&pExtracted]( key_type const&, mapped_type pVal, rcu_disposer& ) -> bool { pExtracted = pVal; return false; }
);
+ m_stat.onExtract( pExtracted != nullptr );
return pExtracted;
}
cds::opt::details::make_comparator_from_less<Less>(),
[&pExtracted]( key_type const&, mapped_type pVal, rcu_disposer& ) -> bool { pExtracted = pVal; return false; }
);
+ m_stat.onExtract( pExtracted != nullptr );
return pExtracted;
}
//@endcond
if ( result == update_flags::retry )
m_stat.onRemoveRetry();
- else
+ else {
+ m_stat.onRemove( result == update_flags::result_removed );
return result == update_flags::result_removed;
+ }
}
}
return update_flags::failed;
pNode->m_pValue.store( nullptr, memory_model::memory_order_relaxed );
+ m_stat.onMakeRoutingNode();
}
--m_ItemCounter;
<< "\t\t m_nUpdateRootWaitShrinking: " << s.m_nUpdateRootWaitShrinking.get() << "\n"
<< "\t\t m_nUpdateSuccess: " << s.m_nUpdateSuccess.get() << "\n"
<< "\t\t m_nUpdateUnlinked: " << s.m_nUpdateUnlinked.get() << "\n"
+ << "\t\t m_nRemoveSuccess: " << s.m_nRemoveSuccess.get() << "\n"
+ << "\t\t m_nRemoveFailed: " << s.m_nRemoveFailed.get() << "\n"
<< "\t\t m_nRemoveRetry: " << s.m_nRemoveRetry.get() << "\n"
+ << "\t\t m_nExtractSuccess: " << s.m_nExtractSuccess.get() << "\n"
+ << "\t\t m_nExtractFailed: " << s.m_nExtractFailed.get() << "\n"
<< "\t\t m_nRemoveWaitShrinking: " << s.m_nRemoveWaitShrinking.get() << "\n"
<< "\t\t m_nRemoveRootWaitShrinking: " << s.m_nRemoveRootWaitShrinking.get() << "\n"
+ << "\t\t m_nMakeRoutingNode: " << s.m_nMakeRoutingNode.get() << "\n"
<< "\t\t m_nDisposedValue: " << s.m_nDisposedValue.get() << "\n"
<< "\t\t m_nDisposedNode: " << s.m_nDisposedNode.get() << "\n"
<< "\t\t m_nExtractedValue: " << s.m_nExtractedValue.get() << "\n"