src/hotspot/share/utilities/concurrentHashTable.inline.hpp
changeset 51405 8b23aa7cef47
parent 51334 cc2c79d22508
child 52332 d2a3503c72f7
equal deleted inserted replaced
51404:c5461fe16efb 51405:8b23aa7cef47
   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