src/hotspot/share/runtime/thread.hpp
changeset 49956 a87f2e7a527c
parent 49848 fcd5df7aa235
child 49982 9042ffe5b7fe
equal deleted inserted replaced
49955:ea246151be08 49956:a87f2e7a527c
    50 #include "utilities/macros.hpp"
    50 #include "utilities/macros.hpp"
    51 #ifdef ZERO
    51 #ifdef ZERO
    52 # include "stack_zero.hpp"
    52 # include "stack_zero.hpp"
    53 #endif
    53 #endif
    54 
    54 
       
    55 class SafeThreadsListPtr;
    55 class ThreadSafepointState;
    56 class ThreadSafepointState;
    56 class ThreadsList;
    57 class ThreadsList;
    57 class ThreadsSMRSupport;
    58 class ThreadsSMRSupport;
    58 class NestedThreadsList;
       
    59 
    59 
    60 class JvmtiThreadState;
    60 class JvmtiThreadState;
    61 class JvmtiGetLoadedClassesClosure;
    61 class JvmtiGetLoadedClassesClosure;
    62 class ThreadStatistics;
    62 class ThreadStatistics;
    63 class ConcurrentLocksDump;
    63 class ConcurrentLocksDump;
   133  protected:
   133  protected:
   134   // Support for forcing alignment of thread objects for biased locking
   134   // Support for forcing alignment of thread objects for biased locking
   135   void*       _real_malloc_address;
   135   void*       _real_malloc_address;
   136 
   136 
   137   // JavaThread lifecycle support:
   137   // JavaThread lifecycle support:
       
   138   friend class SafeThreadsListPtr;  // for _threads_list_ptr, cmpxchg_threads_hazard_ptr(), {dec_,inc_,}nested_threads_hazard_ptr_cnt(), {g,s}et_threads_hazard_ptr(), inc_nested_handle_cnt(), tag_hazard_ptr() access
   138   friend class ScanHazardPtrGatherProtectedThreadsClosure;  // for cmpxchg_threads_hazard_ptr(), get_threads_hazard_ptr(), is_hazard_ptr_tagged() access
   139   friend class ScanHazardPtrGatherProtectedThreadsClosure;  // for cmpxchg_threads_hazard_ptr(), get_threads_hazard_ptr(), is_hazard_ptr_tagged() access
   139   friend class ScanHazardPtrGatherThreadsListClosure;  // for get_nested_threads_hazard_ptr(), get_threads_hazard_ptr(), untag_hazard_ptr() access
   140   friend class ScanHazardPtrGatherThreadsListClosure;  // for get_threads_hazard_ptr(), untag_hazard_ptr() access
   140   friend class ScanHazardPtrPrintMatchingThreadsClosure;  // for get_threads_hazard_ptr(), is_hazard_ptr_tagged() access
   141   friend class ScanHazardPtrPrintMatchingThreadsClosure;  // for get_threads_hazard_ptr(), is_hazard_ptr_tagged() access
   141   friend class ThreadsListSetter;  // for get_threads_hazard_ptr() access
   142   friend class ThreadsSMRSupport;  // for _nested_threads_hazard_ptr_cnt, _threads_hazard_ptr, _threads_list_ptr access
   142   friend class ThreadsSMRSupport;  // for get_threads_hazard_ptr() access
       
   143 
   143 
   144   ThreadsList* volatile _threads_hazard_ptr;
   144   ThreadsList* volatile _threads_hazard_ptr;
       
   145   SafeThreadsListPtr*   _threads_list_ptr;
   145   ThreadsList*          cmpxchg_threads_hazard_ptr(ThreadsList* exchange_value, ThreadsList* compare_value);
   146   ThreadsList*          cmpxchg_threads_hazard_ptr(ThreadsList* exchange_value, ThreadsList* compare_value);
   146   ThreadsList*          get_threads_hazard_ptr();
   147   ThreadsList*          get_threads_hazard_ptr();
   147   void                  set_threads_hazard_ptr(ThreadsList* new_list);
   148   void                  set_threads_hazard_ptr(ThreadsList* new_list);
   148   static bool           is_hazard_ptr_tagged(ThreadsList* list) {
   149   static bool           is_hazard_ptr_tagged(ThreadsList* list) {
   149     return (intptr_t(list) & intptr_t(1)) == intptr_t(1);
   150     return (intptr_t(list) & intptr_t(1)) == intptr_t(1);
   151   static ThreadsList*   tag_hazard_ptr(ThreadsList* list) {
   152   static ThreadsList*   tag_hazard_ptr(ThreadsList* list) {
   152     return (ThreadsList*)(intptr_t(list) | intptr_t(1));
   153     return (ThreadsList*)(intptr_t(list) | intptr_t(1));
   153   }
   154   }
   154   static ThreadsList*   untag_hazard_ptr(ThreadsList* list) {
   155   static ThreadsList*   untag_hazard_ptr(ThreadsList* list) {
   155     return (ThreadsList*)(intptr_t(list) & ~intptr_t(1));
   156     return (ThreadsList*)(intptr_t(list) & ~intptr_t(1));
   156   }
       
   157   NestedThreadsList* _nested_threads_hazard_ptr;
       
   158   NestedThreadsList* get_nested_threads_hazard_ptr() {
       
   159     return _nested_threads_hazard_ptr;
       
   160   }
       
   161   void set_nested_threads_hazard_ptr(NestedThreadsList* value) {
       
   162     assert(Threads_lock->owned_by_self(),
       
   163            "must own Threads_lock for _nested_threads_hazard_ptr to be valid.");
       
   164     _nested_threads_hazard_ptr = value;
       
   165   }
   157   }
   166   // This field is enabled via -XX:+EnableThreadSMRStatistics:
   158   // This field is enabled via -XX:+EnableThreadSMRStatistics:
   167   uint _nested_threads_hazard_ptr_cnt;
   159   uint _nested_threads_hazard_ptr_cnt;
   168   void dec_nested_threads_hazard_ptr_cnt() {
   160   void dec_nested_threads_hazard_ptr_cnt() {
   169     assert(_nested_threads_hazard_ptr_cnt != 0, "mismatched {dec,inc}_nested_threads_hazard_ptr_cnt()");
   161     assert(_nested_threads_hazard_ptr_cnt != 0, "mismatched {dec,inc}_nested_threads_hazard_ptr_cnt()");
   638   int     lgrp_id() const        { return _lgrp_id; }
   630   int     lgrp_id() const        { return _lgrp_id; }
   639   void    set_lgrp_id(int value) { _lgrp_id = value; }
   631   void    set_lgrp_id(int value) { _lgrp_id = value; }
   640 
   632 
   641   // Printing
   633   // Printing
   642   virtual void print_on(outputStream* st) const;
   634   virtual void print_on(outputStream* st) const;
   643   virtual void print_nested_threads_hazard_ptrs_on(outputStream* st) const;
       
   644   void print() const { print_on(tty); }
   635   void print() const { print_on(tty); }
   645   virtual void print_on_error(outputStream* st, char* buf, int buflen) const;
   636   virtual void print_on_error(outputStream* st, char* buf, int buflen) const;
   646   void print_value_on(outputStream* st) const;
   637   void print_value_on(outputStream* st) const;
   647 
   638 
   648   // Debug-only code
   639   // Debug-only code