equal
deleted
inserted
replaced
538 template <typename VALUE, typename CONFIG, MEMFLAGS F> |
538 template <typename VALUE, typename CONFIG, MEMFLAGS F> |
539 template <typename LOOKUP_FUNC> |
539 template <typename LOOKUP_FUNC> |
540 inline void ConcurrentHashTable<VALUE, CONFIG, F>:: |
540 inline void ConcurrentHashTable<VALUE, CONFIG, F>:: |
541 delete_in_bucket(Thread* thread, Bucket* bucket, LOOKUP_FUNC& lookup_f) |
541 delete_in_bucket(Thread* thread, Bucket* bucket, LOOKUP_FUNC& lookup_f) |
542 { |
542 { |
|
543 assert(bucket->is_locked(), "Must be locked."); |
|
544 |
543 size_t dels = 0; |
545 size_t dels = 0; |
544 Node* ndel[BULK_DELETE_LIMIT]; |
546 Node* ndel[BULK_DELETE_LIMIT]; |
545 Node* const volatile * rem_n_prev = bucket->first_ptr(); |
547 Node* const volatile * rem_n_prev = bucket->first_ptr(); |
546 Node* rem_n = bucket->first(); |
548 Node* rem_n = bucket->first(); |
547 while (rem_n != NULL) { |
549 while (rem_n != NULL) { |
872 |
874 |
873 template <typename VALUE, typename CONFIG, MEMFLAGS F> |
875 template <typename VALUE, typename CONFIG, MEMFLAGS F> |
874 template <typename LOOKUP_FUNC, typename VALUE_FUNC, typename CALLBACK_FUNC> |
876 template <typename LOOKUP_FUNC, typename VALUE_FUNC, typename CALLBACK_FUNC> |
875 inline bool ConcurrentHashTable<VALUE, CONFIG, F>:: |
877 inline bool ConcurrentHashTable<VALUE, CONFIG, F>:: |
876 internal_insert(Thread* thread, LOOKUP_FUNC& lookup_f, VALUE_FUNC& value_f, |
878 internal_insert(Thread* thread, LOOKUP_FUNC& lookup_f, VALUE_FUNC& value_f, |
877 CALLBACK_FUNC& callback, bool* grow_hint) |
879 CALLBACK_FUNC& callback, bool* grow_hint, bool* clean_hint) |
878 { |
880 { |
879 bool ret = false; |
881 bool ret = false; |
880 bool clean = false; |
882 bool clean = false; |
881 bool locked; |
883 bool locked; |
882 size_t loops = 0; |
884 size_t loops = 0; |
923 // CAS failed and a duplicate was inserted, we must free this node. |
925 // CAS failed and a duplicate was inserted, we must free this node. |
924 Node::destroy_node(new_node); |
926 Node::destroy_node(new_node); |
925 } else if (i == 0 && clean) { |
927 } else if (i == 0 && clean) { |
926 // We only do cleaning on fast inserts. |
928 // We only do cleaning on fast inserts. |
927 Bucket* bucket = get_bucket_locked(thread, lookup_f.get_hash()); |
929 Bucket* bucket = get_bucket_locked(thread, lookup_f.get_hash()); |
928 assert(bucket->is_locked(), "Must be locked."); |
|
929 delete_in_bucket(thread, bucket, lookup_f); |
930 delete_in_bucket(thread, bucket, lookup_f); |
930 bucket->unlock(); |
931 bucket->unlock(); |
|
932 |
|
933 clean = false; |
931 } |
934 } |
932 |
935 |
933 if (grow_hint != NULL) { |
936 if (grow_hint != NULL) { |
934 *grow_hint = loops > _grow_hint; |
937 *grow_hint = loops > _grow_hint; |
|
938 } |
|
939 |
|
940 if (clean_hint != NULL) { |
|
941 *clean_hint = clean; |
935 } |
942 } |
936 |
943 |
937 return ret; |
944 return ret; |
938 } |
945 } |
939 |
946 |