hotspot/src/share/vm/utilities/resourceHash.hpp
author minqi
Mon, 12 Nov 2012 14:03:53 -0800
changeset 14477 95e66ea71f71
parent 14385 959bbcc16725
child 22827 07d991d45a51
permissions -rw-r--r--
6830717: replay of compilations would help with debugging Summary: When java process crashed in compiler thread, repeat the compilation process will help finding root cause. This is done with using SA dump application class data and replay data from core dump, then use debug version of jvm to recompile the problematic java method. Reviewed-by: kvn, twisti, sspitsyn Contributed-by: yumin.qi@oracle.com
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,
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    47
    typename ResourceHashtableFns<K>::hash_fn   HASH   = primitive_hash<K>,
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    48
    typename ResourceHashtableFns<K>::equals_fn EQUALS = primitive_equals<K>,
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    49
    unsigned SIZE = 256
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    50
    >
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    51
class ResourceHashtable : public ResourceObj {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    52
 private:
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    53
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    54
  class Node : public ResourceObj {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    55
   public:
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    56
    unsigned _hash;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    57
    K _key;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    58
    V _value;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    59
    Node* _next;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    60
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    61
    Node(unsigned hash, K const& key, V const& value) :
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    62
        _hash(hash), _key(key), _value(value), _next(NULL) {}
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    63
  };
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* _table[SIZE];
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    66
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    67
  // Returns a pointer to where the node where the value would reside if
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    68
  // it's in the table.
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    69
  Node** lookup_node(unsigned hash, K const& key) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    70
    unsigned index = hash % SIZE;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    71
    Node** ptr = &_table[index];
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    72
    while (*ptr != NULL) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    73
      Node* node = *ptr;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    74
      if (node->_hash == hash && EQUALS(key, node->_key)) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    75
        break;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    76
      }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    77
      ptr = &(node->_next);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    78
    }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    79
    return ptr;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    80
  }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    81
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    82
  Node const** lookup_node(unsigned hash, K const& key) const {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    83
    return const_cast<Node const**>(
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    84
        const_cast<ResourceHashtable*>(this)->lookup_node(hash, key));
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    85
  }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    86
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    87
 public:
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    88
  ResourceHashtable() { memset(_table, 0, SIZE * sizeof(Node*)); }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    89
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    90
  bool contains(K const& key) const {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    91
    return get(key) != NULL;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    92
  }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    93
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    94
  V* get(K const& key) const {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    95
    unsigned hv = HASH(key);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    96
    Node const** ptr = lookup_node(hv, key);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    97
    if (*ptr != NULL) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    98
      return const_cast<V*>(&(*ptr)->_value);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
    99
    } else {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   100
      return NULL;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   101
    }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   102
  }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   103
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   104
  // Inserts or replaces a value in the table
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   105
  void put(K const& key, V const& value) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   106
    unsigned hv = HASH(key);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   107
    Node** ptr = lookup_node(hv, key);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   108
    if (*ptr != NULL) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   109
      (*ptr)->_value = value;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   110
    } else {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   111
      *ptr = new Node(hv, key, value);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   112
    }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   113
  }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   114
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   115
  // ITER contains bool do_entry(K const&, V const&), which will be
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   116
  // called for each entry in the table.  If do_entry() returns false,
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   117
  // the iteration is cancelled.
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   118
  template<class ITER>
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   119
  void iterate(ITER* iter) const {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   120
    Node* const* bucket = _table;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   121
    while (bucket < &_table[SIZE]) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   122
      Node* node = *bucket;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   123
      while (node != NULL) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   124
        bool cont = iter->do_entry(node->_key, node->_value);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   125
        if (!cont) { return; }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   126
        node = node->_next;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   127
      }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   128
      ++bucket;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   129
    }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   130
  }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   131
};
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   132
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   133
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
   134
#endif // SHARE_VM_UTILITIES_RESOURCEHASH_HPP