hotspot/src/share/vm/utilities/resourceHash.hpp
author coleenp
Wed, 22 Jul 2015 00:03:45 -0400
changeset 31963 641ed52732ec
parent 23187 0f438571f278
child 33754 49614940dafc
permissions -rw-r--r--
8026324: hs_err improvement: Add summary section to hs_err file 8026333: hs_err improvement: Print GC Strategy 8026336: hs_err improvement: Print compilation mode, server, client or tiered Summary: Added command line, summary cpu and os information to summary section. Moved time of crash and duration in summary section. Add GC strategy and compiler setting (tiered) to enhanced version string in error report. Moved the stack trace sooner in hs_err file. Reviewed-by: dholmes, ctornqvi, ddmitriev
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
     1
/*
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
     2
 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
     4
 *
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
     7
 * published by the Free Software Foundation.
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
     8
 *
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    13
 * accompanied this code).
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    14
 *
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    18
 *
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    21
 * questions.
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    22
 *
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    23
 */
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    24
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    25
#ifndef SHARE_VM_UTILITIES_RESOURCEHASH_HPP
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    26
#define SHARE_VM_UTILITIES_RESOURCEHASH_HPP
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    27
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    28
#include "memory/allocation.hpp"
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    29
#include "utilities/top.hpp"
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    30
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    31
template<typename K> struct ResourceHashtableFns {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    32
    typedef unsigned (*hash_fn)(K const&);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    33
    typedef bool (*equals_fn)(K const&, K const&);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    34
};
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    35
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    36
template<typename K> unsigned primitive_hash(const K& k) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    37
  unsigned hash = (unsigned)((uintptr_t)k);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    38
  return hash ^ (hash > 3); // just in case we're dealing with aligned ptrs
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    39
}
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    40
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    41
template<typename K> bool primitive_equals(const K& k0, const K& k1) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    42
  return k0 == k1;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    43
}
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    44
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    45
template<
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    46
    typename K, typename V,
22827
07d991d45a51 8023033: PPC64 (part 13): basic changes for AIX
goetz
parents: 14385
diff changeset
    47
    // xlC does not compile this:
07d991d45a51 8023033: PPC64 (part 13): basic changes for AIX
goetz
parents: 14385
diff changeset
    48
    // http://stackoverflow.com/questions/8532961/template-argument-of-type-that-is-defined-by-inner-typedef-from-other-template-c
07d991d45a51 8023033: PPC64 (part 13): basic changes for AIX
goetz
parents: 14385
diff changeset
    49
    //typename ResourceHashtableFns<K>::hash_fn   HASH   = primitive_hash<K>,
07d991d45a51 8023033: PPC64 (part 13): basic changes for AIX
goetz
parents: 14385
diff changeset
    50
    //typename ResourceHashtableFns<K>::equals_fn EQUALS = primitive_equals<K>,
07d991d45a51 8023033: PPC64 (part 13): basic changes for AIX
goetz
parents: 14385
diff changeset
    51
    unsigned (*HASH)  (K const&)           = primitive_hash<K>,
07d991d45a51 8023033: PPC64 (part 13): basic changes for AIX
goetz
parents: 14385
diff changeset
    52
    bool     (*EQUALS)(K const&, K const&) = primitive_equals<K>,
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    53
    unsigned SIZE = 256
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    54
    >
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    55
class ResourceHashtable : public ResourceObj {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    56
 private:
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    57
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    58
  class Node : public ResourceObj {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    59
   public:
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    60
    unsigned _hash;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    61
    K _key;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    62
    V _value;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    63
    Node* _next;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    64
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    65
    Node(unsigned hash, K const& key, V const& value) :
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    66
        _hash(hash), _key(key), _value(value), _next(NULL) {}
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    67
  };
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    68
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    69
  Node* _table[SIZE];
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    70
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    71
  // Returns a pointer to where the node where the value would reside if
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    72
  // it's in the table.
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    73
  Node** lookup_node(unsigned hash, K const& key) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    74
    unsigned index = hash % SIZE;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    75
    Node** ptr = &_table[index];
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    76
    while (*ptr != NULL) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    77
      Node* node = *ptr;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    78
      if (node->_hash == hash && EQUALS(key, node->_key)) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    79
        break;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    80
      }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    81
      ptr = &(node->_next);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    82
    }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    83
    return ptr;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    84
  }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    85
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    86
  Node const** lookup_node(unsigned hash, K const& key) const {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    87
    return const_cast<Node const**>(
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    88
        const_cast<ResourceHashtable*>(this)->lookup_node(hash, key));
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    89
  }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    90
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    91
 public:
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    92
  ResourceHashtable() { memset(_table, 0, SIZE * sizeof(Node*)); }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    93
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    94
  bool contains(K const& key) const {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    95
    return get(key) != NULL;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    96
  }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    97
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    98
  V* get(K const& key) const {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    99
    unsigned hv = HASH(key);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   100
    Node const** ptr = lookup_node(hv, key);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   101
    if (*ptr != NULL) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   102
      return const_cast<V*>(&(*ptr)->_value);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   103
    } else {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   104
      return NULL;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   105
    }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   106
  }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   107
23187
0f438571f278 8035946: Use ResourceHashtable for dependency checking
anoll
parents: 22827
diff changeset
   108
 /**
0f438571f278 8035946: Use ResourceHashtable for dependency checking
anoll
parents: 22827
diff changeset
   109
  * Inserts or replaces a value in the table.
0f438571f278 8035946: Use ResourceHashtable for dependency checking
anoll
parents: 22827
diff changeset
   110
  * @return: true:  if a new item is added
0f438571f278 8035946: Use ResourceHashtable for dependency checking
anoll
parents: 22827
diff changeset
   111
  *          false: if the item already existed and the value is updated
0f438571f278 8035946: Use ResourceHashtable for dependency checking
anoll
parents: 22827
diff changeset
   112
  */
0f438571f278 8035946: Use ResourceHashtable for dependency checking
anoll
parents: 22827
diff changeset
   113
  bool put(K const& key, V const& value) {
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   114
    unsigned hv = HASH(key);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   115
    Node** ptr = lookup_node(hv, key);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   116
    if (*ptr != NULL) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   117
      (*ptr)->_value = value;
23187
0f438571f278 8035946: Use ResourceHashtable for dependency checking
anoll
parents: 22827
diff changeset
   118
      return false;
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   119
    } else {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   120
      *ptr = new Node(hv, key, value);
23187
0f438571f278 8035946: Use ResourceHashtable for dependency checking
anoll
parents: 22827
diff changeset
   121
      return true;
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   122
    }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   123
  }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   124
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   125
  // ITER contains bool do_entry(K const&, V const&), which will be
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   126
  // called for each entry in the table.  If do_entry() returns false,
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   127
  // the iteration is cancelled.
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   128
  template<class ITER>
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   129
  void iterate(ITER* iter) const {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   130
    Node* const* bucket = _table;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   131
    while (bucket < &_table[SIZE]) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   132
      Node* node = *bucket;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   133
      while (node != NULL) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   134
        bool cont = iter->do_entry(node->_key, node->_value);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   135
        if (!cont) { return; }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   136
        node = node->_next;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   137
      }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   138
      ++bucket;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   139
    }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   140
  }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   141
};
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   142
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   143
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   144
#endif // SHARE_VM_UTILITIES_RESOURCEHASH_HPP