< prev index next >
src/hotspot/share/utilities/concurrentHashTable.inline.hpp
Print this page
*** 538,547 ****
--- 538,549 ----
template <typename VALUE, typename CONFIG, MEMFLAGS F>
template <typename LOOKUP_FUNC>
inline void ConcurrentHashTable<VALUE, CONFIG, F>::
delete_in_bucket(Thread* thread, Bucket* bucket, LOOKUP_FUNC& lookup_f)
{
+ assert(bucket->is_locked(), "Must be locked.");
+
size_t dels = 0;
Node* ndel[BULK_DELETE_LIMIT];
Node* const volatile * rem_n_prev = bucket->first_ptr();
Node* rem_n = bucket->first();
while (rem_n != NULL) {
*** 872,882 ****
template <typename VALUE, typename CONFIG, MEMFLAGS F>
template <typename LOOKUP_FUNC, typename VALUE_FUNC, typename CALLBACK_FUNC>
inline bool ConcurrentHashTable<VALUE, CONFIG, F>::
internal_insert(Thread* thread, LOOKUP_FUNC& lookup_f, VALUE_FUNC& value_f,
! CALLBACK_FUNC& callback, bool* grow_hint)
{
bool ret = false;
bool clean = false;
bool locked;
size_t loops = 0;
--- 874,884 ----
template <typename VALUE, typename CONFIG, MEMFLAGS F>
template <typename LOOKUP_FUNC, typename VALUE_FUNC, typename CALLBACK_FUNC>
inline bool ConcurrentHashTable<VALUE, CONFIG, F>::
internal_insert(Thread* thread, LOOKUP_FUNC& lookup_f, VALUE_FUNC& value_f,
! CALLBACK_FUNC& callback, bool* grow_hint, bool* clean_hint)
{
bool ret = false;
bool clean = false;
bool locked;
size_t loops = 0;
*** 923,941 ****
// CAS failed and a duplicate was inserted, we must free this node.
Node::destroy_node(new_node);
} else if (i == 0 && clean) {
// We only do cleaning on fast inserts.
Bucket* bucket = get_bucket_locked(thread, lookup_f.get_hash());
- assert(bucket->is_locked(), "Must be locked.");
delete_in_bucket(thread, bucket, lookup_f);
bucket->unlock();
}
if (grow_hint != NULL) {
*grow_hint = loops > _grow_hint;
}
return ret;
}
template <typename VALUE, typename CONFIG, MEMFLAGS F>
template <typename FUNC>
--- 925,948 ----
// CAS failed and a duplicate was inserted, we must free this node.
Node::destroy_node(new_node);
} else if (i == 0 && clean) {
// We only do cleaning on fast inserts.
Bucket* bucket = get_bucket_locked(thread, lookup_f.get_hash());
delete_in_bucket(thread, bucket, lookup_f);
bucket->unlock();
+
+ clean = false;
}
if (grow_hint != NULL) {
*grow_hint = loops > _grow_hint;
}
+ if (clean_hint != NULL) {
+ *clean_hint = clean;
+ }
+
return ret;
}
template <typename VALUE, typename CONFIG, MEMFLAGS F>
template <typename FUNC>
< prev index next >