hotspot/src/share/vm/runtime/vmThread.hpp
author ccheung
Thu, 07 Apr 2016 22:03:04 -0700
changeset 37439 e8970711113b
parent 24331 c0bc7e5653fb
child 37456 bf26e0f4235f
permissions -rw-r--r--
8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive Summary: This optimization reduces the size of the RW region of the CDS archive. It also reduces the amount of pages in the RW region that are actually written into during runtime. Reviewed-by: dlong, iklam, jiangli Contributed-by: ioi.lam@oracle.com, calvin.cheung@oracle.com, goetz.lindenmaier@sap.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
13963
e5b53c306fb5 7197424: update copyright year to match last edit in jdk8 hotspot repository
mikael
parents: 13195
diff changeset
     2
 * Copyright (c) 1998, 2012, 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: 4489
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4489
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: 4489
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
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    25
#ifndef SHARE_VM_RUNTIME_VMTHREAD_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    26
#define SHARE_VM_RUNTIME_VMTHREAD_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    28
#include "runtime/perfData.hpp"
14583
d70ee55535f4 8003935: Simplify the needed includes for using Thread::current()
stefank
parents: 14582
diff changeset
    29
#include "runtime/thread.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    30
#include "runtime/vm_operations.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    31
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
// Prioritized queue of VM operations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
// Encapsulates both queue management and
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
// and priority policy
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
//
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 10565
diff changeset
    38
class VMOperationQueue : public CHeapObj<mtInternal> {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
  enum Priorities {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
     SafepointPriority, // Highest priority (operation executed at a safepoint)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
     MediumPriority,    // Medium priority
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
     nof_priorities
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
  // We maintain a doubled linked list, with explicit count.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
  int           _queue_length[nof_priorities];
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
  int           _queue_counter;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
  VM_Operation* _queue       [nof_priorities];
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
  // we also allow the vmThread to register the ops it has drained so we
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
  // can scan them from oops_do
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
  VM_Operation* _drain_list;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
  // Double-linked non-empty list insert.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
  void insert(VM_Operation* q,VM_Operation* n);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
  void unlink(VM_Operation* q);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
  // Basic queue manipulation
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
  bool queue_empty                (int prio);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
  void queue_add_front            (int prio, VM_Operation *op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
  void queue_add_back             (int prio, VM_Operation *op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
  VM_Operation* queue_remove_front(int prio);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
  void queue_oops_do(int queue, OopClosure* f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
  void drain_list_oops_do(OopClosure* f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
  VM_Operation* queue_drain(int prio);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  // lock-free query: may return the wrong answer but must not break
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  bool queue_peek(int prio) { return _queue_length[prio] > 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  VMOperationQueue();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  // Highlevel operations. Encapsulates policy
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
  bool add(VM_Operation *op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  VM_Operation* remove_next();                        // Returns next or null
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  VM_Operation* remove_next_at_safepoint_priority()   { return queue_remove_front(SafepointPriority); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  VM_Operation* drain_at_safepoint_priority() { return queue_drain(SafepointPriority); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  void set_drain_list(VM_Operation* list) { _drain_list = list; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  bool peek_at_safepoint_priority() { return queue_peek(SafepointPriority); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  // GC support
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  void oops_do(OopClosure* f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  void verify_queue(int prio) PRODUCT_RETURN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
// A single VMThread (the primordial thread) spawns all other threads
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
// and is itself used by other threads to offload heavy vm operations
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
// like scavenge, garbage_collect etc.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
4489
514173c9a0c2 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 3908
diff changeset
    93
class VMThread: public NamedThread {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  static ThreadPriority _current_priority;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  static bool _should_terminate;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  static bool _terminated;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  static Monitor * _terminate_lock;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  static PerfCounter* _perf_accumulated_vm_operation_time;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  void evaluate_operation(VM_Operation* op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  // Constructor
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  VMThread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  // Tester
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  bool is_VM_thread() const                      { return true; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  bool is_GC_thread() const                      { return true; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  // The ever running loop for the VMThread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  void loop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  // Called to stop the VM thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  static void wait_for_vm_thread_exit();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  static bool should_terminate()                  { return _should_terminate; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  static bool is_terminated()                     { return _terminated == true; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  // Execution of vm operation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
  static void execute(VM_Operation* op);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  // Returns the current vm operation if any.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  static VM_Operation* vm_operation()             { return _cur_vm_operation;   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
  // Returns the single instance of VMThread.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  static VMThread* vm_thread()                    { return _vm_thread; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  // GC support
22899
e2a6bf7f343a 8035393: Use CLDClosure instead of CLDToOopClosure in frame::oops_interpreted_do
stefank
parents: 14583
diff changeset
   129
  void oops_do(OopClosure* f, CLDClosure* cld_f, CodeBlobClosure* cf);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  void verify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  // Performance measurement
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
  static PerfCounter* perf_accumulated_vm_operation_time()               { return _perf_accumulated_vm_operation_time; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
  // Entry for starting vm thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  virtual void run();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  // Creations/Destructions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  static void create();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  static void destroy();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  // VM_Operation support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
  static VM_Operation*     _cur_vm_operation;   // Current VM operation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  static VMOperationQueue* _vm_queue;           // Queue (w/ policy) of VM operations
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  // Pointer to single-instance of VM thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  static VMThread*     _vm_thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   151
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   152
#endif // SHARE_VM_RUNTIME_VMTHREAD_HPP