< prev index next >

src/hotspot/share/runtime/synchronizer.hpp

Print this page
rev 54109 : Add logging to ObjectSynchronizer::omFlush(), add global count logging at Info level to ObjectSynchronizer::finish_deflate_idle_monitors(); for monitorinflation logging, switch from cumulative "deflating per-thread idle monitors" mesgs to per-thread "deflating per-thread idle monitors" mesgs; fix timer bug in deflate_thread_local_monitors() where time to acquire gListLock wasn't counted; fix misc typos.
rev 54110 : Checkpoint latest preliminary review patches for full OpenJDK review.


  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #ifndef SHARE_RUNTIME_SYNCHRONIZER_HPP
  26 #define SHARE_RUNTIME_SYNCHRONIZER_HPP
  27 
  28 #include "memory/padded.hpp"
  29 #include "oops/markOop.hpp"
  30 #include "runtime/basicLock.hpp"
  31 #include "runtime/handles.hpp"
  32 #include "runtime/perfData.hpp"
  33 
  34 class ObjectMonitor;

  35 class ThreadsList;
  36 
  37 struct DeflateMonitorCounters {
  38   int nInuse;              // currently associated with objects
  39   int nInCirculation;      // extant
  40   int nScavenged;          // reclaimed (global and per-thread)
  41   int perThreadScavenged;  // per-thread scavenge total
  42   double perThreadTimes;   // per-thread scavenge times
  43 };
  44 
  45 class ObjectSynchronizer : AllStatic {
  46   friend class VMStructs;
  47  public:
  48   typedef enum {
  49     owner_self,
  50     owner_none,
  51     owner_other
  52   } LockOwnership;
  53 
  54   typedef enum {


  90   // Handle all interpreter, compiler and jni cases
  91   static int  wait(Handle obj, jlong millis, TRAPS);
  92   static void notify(Handle obj, TRAPS);
  93   static void notifyall(Handle obj, TRAPS);
  94 
  95   static bool quick_notify(oopDesc* obj, Thread* Self, bool All);
  96   static bool quick_enter(oop obj, Thread* Self, BasicLock* Lock);
  97 
  98   // Special internal-use-only method for use by JVM infrastructure
  99   // that needs to wait() on a java-level object but that can't risk
 100   // throwing unexpected InterruptedExecutionExceptions.
 101   static void waitUninterruptibly(Handle obj, jlong Millis, Thread * THREAD);
 102 
 103   // used by classloading to free classloader object lock,
 104   // wait on an internal lock, and reclaim original lock
 105   // with original recursion count
 106   static intptr_t complete_exit(Handle obj, TRAPS);
 107   static void reenter (Handle obj, intptr_t recursion, TRAPS);
 108 
 109   // thread-specific and global objectMonitor free list accessors
 110   static ObjectMonitor * omAlloc(Thread * Self);
 111   static void omRelease(Thread * Self, ObjectMonitor * m,
 112                         bool FromPerThreadAlloc);
 113   static void omFlush(Thread * Self);
 114 
 115   // Inflate light weight monitor to heavy weight monitor
 116   static ObjectMonitor* inflate(Thread * Self, oop obj, const InflateCause cause);

 117   // This version is only for internal use
 118   static void inflate_helper(oop obj);
 119   static const char* inflate_cause_name(const InflateCause cause);
 120 
 121   // Returns the identity hash value for an oop
 122   // NOTE: It may cause monitor inflation
 123   static intptr_t identity_hash_value_for(Handle obj);
 124   static intptr_t FastHashCode(Thread * Self, oop obj);
 125 
 126   // java.lang.Thread support
 127   static bool current_thread_holds_lock(JavaThread* thread, Handle h_obj);
 128   static LockOwnership query_lock_ownership(JavaThread * self, Handle h_obj);
 129 
 130   static JavaThread* get_lock_owner(ThreadsList * t_list, Handle h_obj);
 131 
 132   // JNI detach support
 133   static void release_monitors_owned_by_thread(TRAPS);
 134   static void monitors_iterate(MonitorClosure* m);
 135 
 136   // GC: we current use aggressive monitor deflation policy
 137   // Basically we deflate all monitors that are not busy.
 138   // An adaptive profile-based deflation policy could be used if needed
 139   static void deflate_idle_monitors(DeflateMonitorCounters* counters);


 140   static void deflate_thread_local_monitors(Thread* thread, DeflateMonitorCounters* counters);
 141   static void prepare_deflate_idle_monitors(DeflateMonitorCounters* counters);
 142   static void finish_deflate_idle_monitors(DeflateMonitorCounters* counters);
 143 
 144   // For a given monitor list: global or per-thread, deflate idle monitors
 145   static int deflate_monitor_list(ObjectMonitor** listheadp,
 146                                   ObjectMonitor** freeHeadp,
 147                                   ObjectMonitor** freeTailp);






 148   static bool deflate_monitor(ObjectMonitor* mid, oop obj,
 149                               ObjectMonitor** freeHeadp,
 150                               ObjectMonitor** freeTailp);



 151   static bool is_cleanup_needed();


 152   static void oops_do(OopClosure* f);
 153   // Process oops in thread local used monitors
 154   static void thread_local_used_oops_do(Thread* thread, OopClosure* f);
 155 
 156   // debugging
 157   static void audit_and_print_stats(bool on_exit);
 158   static void chk_free_entry(JavaThread * jt, ObjectMonitor * n,
 159                              outputStream * out, int *error_cnt_p);
 160   static void chk_global_free_list_and_count(outputStream * out,
 161                                              int *error_cnt_p);
 162   static void chk_global_in_use_list_and_count(outputStream * out,
 163                                                int *error_cnt_p);
 164   static void chk_in_use_entry(JavaThread * jt, ObjectMonitor * n,
 165                                outputStream * out, int *error_cnt_p);
 166   static void chk_per_thread_in_use_list_and_count(JavaThread *jt,
 167                                                    outputStream * out,
 168                                                    int *error_cnt_p);
 169   static void chk_per_thread_free_list_and_count(JavaThread *jt,
 170                                                  outputStream * out,
 171                                                  int *error_cnt_p);
 172   static void log_in_use_monitor_details(outputStream * out, bool on_exit);
 173   static int  log_monitor_list_counts(outputStream * out);
 174   static int  verify_objmon_isinpool(ObjectMonitor *addr) PRODUCT_RETURN0;
 175 



 176  private:
 177   friend class SynchronizerTest;
 178 
 179   enum { _BLOCKSIZE = 128 };
 180   // global list of blocks of monitors
 181   static PaddedEnd<ObjectMonitor> * volatile gBlockList;
 182   // global monitor free list
 183   static ObjectMonitor * volatile gFreeList;
 184   // global monitor in-use list, for moribund threads,
 185   // monitors they inflated need to be scanned for deflation
 186   static ObjectMonitor * volatile gOmInUseList;
 187   // count of entries in gOmInUseList
 188   static int gOmInUseCount;


 189 
 190   // Process oops in all global used monitors (i.e. moribund thread's monitors)
 191   static void global_used_oops_do(OopClosure* f);
 192   // Process oops in monitors on the given list
 193   static void list_oops_do(ObjectMonitor* list, OopClosure* f);
 194 
 195   // Support for SynchronizerTest access to GVars fields:
 196   static u_char* get_gvars_addr();
 197   static u_char* get_gvars_hcSequence_addr();
 198   static size_t get_gvars_size();
 199   static u_char* get_gvars_stwRandom_addr();
 200 };
 201 
 202 // ObjectLocker enforces balanced locking and can never throw an
 203 // IllegalMonitorStateException. However, a pending exception may
 204 // have to pass through, and we must also be able to deal with
 205 // asynchronous exceptions. The caller is responsible for checking
 206 // the thread's pending exception if needed.
 207 class ObjectLocker : public StackObj {
 208  private:


  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #ifndef SHARE_RUNTIME_SYNCHRONIZER_HPP
  26 #define SHARE_RUNTIME_SYNCHRONIZER_HPP
  27 
  28 #include "memory/padded.hpp"
  29 #include "oops/markOop.hpp"
  30 #include "runtime/basicLock.hpp"
  31 #include "runtime/handles.hpp"
  32 #include "runtime/perfData.hpp"
  33 
  34 class ObjectMonitor;
  35 class ObjectMonitorHandle;
  36 class ThreadsList;
  37 
  38 struct DeflateMonitorCounters {
  39   int nInuse;              // currently associated with objects
  40   int nInCirculation;      // extant
  41   int nScavenged;          // reclaimed (global and per-thread)
  42   int perThreadScavenged;  // per-thread scavenge total
  43   double perThreadTimes;   // per-thread scavenge times
  44 };
  45 
  46 class ObjectSynchronizer : AllStatic {
  47   friend class VMStructs;
  48  public:
  49   typedef enum {
  50     owner_self,
  51     owner_none,
  52     owner_other
  53   } LockOwnership;
  54 
  55   typedef enum {


  91   // Handle all interpreter, compiler and jni cases
  92   static int  wait(Handle obj, jlong millis, TRAPS);
  93   static void notify(Handle obj, TRAPS);
  94   static void notifyall(Handle obj, TRAPS);
  95 
  96   static bool quick_notify(oopDesc* obj, Thread* Self, bool All);
  97   static bool quick_enter(oop obj, Thread* Self, BasicLock* Lock);
  98 
  99   // Special internal-use-only method for use by JVM infrastructure
 100   // that needs to wait() on a java-level object but that can't risk
 101   // throwing unexpected InterruptedExecutionExceptions.
 102   static void waitUninterruptibly(Handle obj, jlong Millis, Thread * THREAD);
 103 
 104   // used by classloading to free classloader object lock,
 105   // wait on an internal lock, and reclaim original lock
 106   // with original recursion count
 107   static intptr_t complete_exit(Handle obj, TRAPS);
 108   static void reenter (Handle obj, intptr_t recursion, TRAPS);
 109 
 110   // thread-specific and global objectMonitor free list accessors
 111   static ObjectMonitor * omAlloc(Thread * Self, const InflateCause cause);
 112   static void omRelease(Thread * Self, ObjectMonitor * m,
 113                         bool FromPerThreadAlloc);
 114   static void omFlush(Thread * Self);
 115 
 116   // Inflate light weight monitor to heavy weight monitor
 117   static void inflate(ObjectMonitorHandle * omh_p, Thread * Self, oop obj,
 118                       const InflateCause cause);
 119   // This version is only for internal use
 120   static void inflate_helper(ObjectMonitorHandle * omh_p, oop obj);
 121   static const char* inflate_cause_name(const InflateCause cause);
 122 
 123   // Returns the identity hash value for an oop
 124   // NOTE: It may cause monitor inflation
 125   static intptr_t identity_hash_value_for(Handle obj);
 126   static intptr_t FastHashCode(Thread * Self, oop obj);
 127 
 128   // java.lang.Thread support
 129   static bool current_thread_holds_lock(JavaThread* thread, Handle h_obj);
 130   static LockOwnership query_lock_ownership(JavaThread * self, Handle h_obj);
 131 
 132   static JavaThread* get_lock_owner(ThreadsList * t_list, Handle h_obj);
 133 
 134   // JNI detach support
 135   static void release_monitors_owned_by_thread(TRAPS);
 136   static void monitors_iterate(MonitorClosure* m);
 137 
 138   // GC: we current use aggressive monitor deflation policy
 139   // Basically we deflate all monitors that are not busy.
 140   // An adaptive profile-based deflation policy could be used if needed
 141   static void deflate_idle_monitors(DeflateMonitorCounters* counters);
 142   static void deflate_global_idle_monitors_using_JT();
 143   static void deflate_per_thread_idle_monitors_using_JT();
 144   static void deflate_thread_local_monitors(Thread* thread, DeflateMonitorCounters* counters);
 145   static void prepare_deflate_idle_monitors(DeflateMonitorCounters* counters);
 146   static void finish_deflate_idle_monitors(DeflateMonitorCounters* counters);
 147 
 148   // For a given monitor list: global or per-thread, deflate idle monitors
 149   static int deflate_monitor_list(ObjectMonitor** listheadp,
 150                                   ObjectMonitor** freeHeadp,
 151                                   ObjectMonitor** freeTailp);
 152   // For a given in-use monitor list: global or per-thread, deflate idle
 153   // monitors using a JavaThread.
 154   static int deflate_monitor_list_using_JT(ObjectMonitor** listHeadp,
 155                                            ObjectMonitor** freeHeadp,
 156                                            ObjectMonitor** freeTailp,
 157                                            ObjectMonitor** savedMidInUsep);
 158   static bool deflate_monitor(ObjectMonitor* mid, oop obj,
 159                               ObjectMonitor** freeHeadp,
 160                               ObjectMonitor** freeTailp);
 161   static bool deflate_monitor_using_JT(ObjectMonitor* mid,
 162                                        ObjectMonitor** freeHeadp,
 163                                        ObjectMonitor** freeTailp);
 164   static bool is_cleanup_needed();
 165   static bool is_cleanup_requested() { return _is_cleanup_requested; }
 166   static void set_is_cleanup_requested(bool new_value) { _is_cleanup_requested = new_value; }
 167   static void oops_do(OopClosure* f);
 168   // Process oops in thread local used monitors
 169   static void thread_local_used_oops_do(Thread* thread, OopClosure* f);
 170 
 171   // debugging
 172   static void audit_and_print_stats(bool on_exit);
 173   static void chk_free_entry(JavaThread * jt, ObjectMonitor * n,
 174                              outputStream * out, int *error_cnt_p);
 175   static void chk_global_free_list_and_count(outputStream * out,
 176                                              int *error_cnt_p);
 177   static void chk_global_in_use_list_and_count(outputStream * out,
 178                                                int *error_cnt_p);
 179   static void chk_in_use_entry(JavaThread * jt, ObjectMonitor * n,
 180                                outputStream * out, int *error_cnt_p);
 181   static void chk_per_thread_in_use_list_and_count(JavaThread *jt,
 182                                                    outputStream * out,
 183                                                    int *error_cnt_p);
 184   static void chk_per_thread_free_list_and_count(JavaThread *jt,
 185                                                  outputStream * out,
 186                                                  int *error_cnt_p);
 187   static void log_in_use_monitor_details(outputStream * out, bool on_exit);
 188   static int  log_monitor_list_counts(outputStream * out);
 189   static int  verify_objmon_isinpool(ObjectMonitor *addr) PRODUCT_RETURN0;
 190 
 191   static bool gOmShouldDeflateIdleMonitors() { return _gOmShouldDeflateIdleMonitors; }
 192   static void do_safepoint_work(DeflateMonitorCounters* _counters);
 193 
 194  private:
 195   friend class SynchronizerTest;
 196 
 197   enum { _BLOCKSIZE = 128 };
 198   // global list of blocks of monitors
 199   static PaddedEnd<ObjectMonitor> * volatile gBlockList;
 200   // global monitor free list
 201   static ObjectMonitor * volatile gFreeList;
 202   // global monitor in-use list, for moribund threads,
 203   // monitors they inflated need to be scanned for deflation
 204   static ObjectMonitor * volatile gOmInUseList;
 205   // count of entries in gOmInUseList
 206   static int gOmInUseCount;
 207   static bool _gOmShouldDeflateIdleMonitors;
 208   static volatile bool _is_cleanup_requested;
 209 
 210   // Process oops in all global used monitors (i.e. moribund thread's monitors)
 211   static void global_used_oops_do(OopClosure* f);
 212   // Process oops in monitors on the given list
 213   static void list_oops_do(ObjectMonitor* list, OopClosure* f);
 214 
 215   // Support for SynchronizerTest access to GVars fields:
 216   static u_char* get_gvars_addr();
 217   static u_char* get_gvars_hcSequence_addr();
 218   static size_t get_gvars_size();
 219   static u_char* get_gvars_stwRandom_addr();
 220 };
 221 
 222 // ObjectLocker enforces balanced locking and can never throw an
 223 // IllegalMonitorStateException. However, a pending exception may
 224 // have to pass through, and we must also be able to deal with
 225 // asynchronous exceptions. The caller is responsible for checking
 226 // the thread's pending exception if needed.
 227 class ObjectLocker : public StackObj {
 228  private:
< prev index next >