hotspot/src/share/vm/prims/jvmtiTagMap.hpp
author trims
Thu, 27 May 2010 19:08:38 -0700
changeset 5547 f4b087cbb361
parent 1 489c9b5090e2
child 7397 5b173b4ca846
permissions -rw-r--r--
6941466: Oracle rebranding changes for Hotspot repositories Summary: Change all the Sun copyrights to Oracle copyright Reviewed-by: ohair
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1
diff changeset
     2
 * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
489c9b5090e2 Initial load
duke
parents:
diff changeset
    25
// JvmtiTagMap
489c9b5090e2 Initial load
duke
parents:
diff changeset
    26
489c9b5090e2 Initial load
duke
parents:
diff changeset
    27
#ifndef _JAVA_JVMTI_TAG_MAP_H_
489c9b5090e2 Initial load
duke
parents:
diff changeset
    28
#define _JAVA_JVMTI_TAG_MAP_H_
489c9b5090e2 Initial load
duke
parents:
diff changeset
    29
489c9b5090e2 Initial load
duke
parents:
diff changeset
    30
// forward references
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
class JvmtiTagHashmap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
class JvmtiTagHashmapEntry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
class JvmtiTagHashmapEntryClosure;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
class JvmtiTagMap :  public CHeapObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
  enum{
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
    n_hashmaps = 2,                                 // encapsulates 2 hashmaps
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
    max_free_entries = 4096                         // maximum number of free entries per env
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
  // memory region for young generation
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
  static MemRegion _young_gen;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
  static void get_young_generation();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
  JvmtiEnv*             _env;                       // the jvmti environment
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
  Mutex                 _lock;                      // lock for this tag map
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
  JvmtiTagHashmap*      _hashmap[n_hashmaps];       // the hashmaps
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
  JvmtiTagHashmapEntry* _free_entries;              // free list for this environment
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
  int _free_entries_count;                          // number of entries on the free list
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
  // create a tag map
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
  JvmtiTagMap(JvmtiEnv* env);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
  // accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
  inline Mutex* lock()                      { return &_lock; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
  inline JvmtiEnv* env() const              { return _env; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
  // rehash tags maps for generation start to end
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
  void rehash(int start, int end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
  // indicates if the object is in the young generation
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
  static bool is_in_young(oop o);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  // iterate over all entries in this tag map
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
  void entry_iterate(JvmtiTagHashmapEntryClosure* closure);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  // indicates if this tag map is locked
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
  bool is_locked()                          { return lock()->is_locked(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  // return the appropriate hashmap for a given object
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  JvmtiTagHashmap* hashmap_for(oop o);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  // create/destroy entries
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  JvmtiTagHashmapEntry* create_entry(jweak ref, jlong tag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  void destroy_entry(JvmtiTagHashmapEntry* entry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  // returns true if the hashmaps are empty
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  bool is_empty();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
  // return tag for the given environment
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  static JvmtiTagMap* tag_map_for(JvmtiEnv* env);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  // destroy tag map
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  ~JvmtiTagMap();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  // set/get tag
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  void set_tag(jobject obj, jlong tag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  jlong get_tag(jobject obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  // deprecated heap iteration functions
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  void iterate_over_heap(jvmtiHeapObjectFilter object_filter,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
                         KlassHandle klass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
                         jvmtiHeapObjectCallback heap_object_callback,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
                         const void* user_data);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  void iterate_over_reachable_objects(jvmtiHeapRootCallback heap_root_callback,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
                                      jvmtiStackReferenceCallback stack_ref_callback,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
                                      jvmtiObjectReferenceCallback object_ref_callback,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
                                      const void* user_data);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  void iterate_over_objects_reachable_from_object(jobject object,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
                                                  jvmtiObjectReferenceCallback object_reference_callback,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
                                                  const void* user_data);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  // advanced (JVMTI 1.1) heap iteration functions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  void iterate_through_heap(jint heap_filter,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
                            KlassHandle klass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
                            const jvmtiHeapCallbacks* callbacks,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
                            const void* user_data);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  void follow_references(jint heap_filter,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
                         KlassHandle klass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
                         jobject initial_object,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
                         const jvmtiHeapCallbacks* callbacks,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
                         const void* user_data);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  // get tagged objects
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
  jvmtiError get_objects_with_tags(const jlong* tags, jint count,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
                                   jint* count_ptr, jobject** object_result_ptr,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
                                   jlong** tag_result_ptr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  // call post-GC to rehash the tag maps.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  static void gc_epilogue(bool full);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  // call after referencing processing has completed (CMS)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  static void cms_ref_processing_epilogue();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
#endif   /* _JAVA_JVMTI_TAG_MAP_H_ */