hotspot/src/share/vm/runtime/threadLocalStorage.hpp
changeset 34633 2a6c7c7b30a7
parent 32181 dee472a9b4db
child 37466 287c4ebd11b0
equal deleted inserted replaced
34632:bf3518bba285 34633:2a6c7c7b30a7
    23  */
    23  */
    24 
    24 
    25 #ifndef SHARE_VM_RUNTIME_THREADLOCALSTORAGE_HPP
    25 #ifndef SHARE_VM_RUNTIME_THREADLOCALSTORAGE_HPP
    26 #define SHARE_VM_RUNTIME_THREADLOCALSTORAGE_HPP
    26 #define SHARE_VM_RUNTIME_THREADLOCALSTORAGE_HPP
    27 
    27 
    28 #include "gc/shared/gcUtil.hpp"
       
    29 #include "runtime/os.hpp"
       
    30 #include "utilities/top.hpp"
    28 #include "utilities/top.hpp"
    31 
    29 
    32 // Interface for thread local storage
    30 // forward-decl as we can't have an include cycle
       
    31 class Thread;
    33 
    32 
    34 // Fast variant of ThreadLocalStorage::get_thread_slow
    33 // Wrapper class for library-based (as opposed to compiler-based)
    35 extern "C" Thread*   get_thread();
    34 // thread-local storage (TLS). All platforms require this for
    36 
    35 // signal-handler based TLS access (which while not strictly async-signal
    37 // Get raw thread id: e.g., %g7 on sparc, fs or gs on x86
    36 // safe in theory, is and has-been for a long time, in practice).
    38 extern "C" uintptr_t _raw_thread_id();
    37 // Platforms without compiler-based TLS (i.e. __thread storage-class modifier)
       
    38 // will use this implementation for all TLS access - see thread.hpp/cpp
    39 
    39 
    40 class ThreadLocalStorage : AllStatic {
    40 class ThreadLocalStorage : AllStatic {
    41 
    41 
    42  // Exported API
    42  // Exported API
    43  public:
    43  public:
    44   static void    set_thread(Thread* thread);
    44   static Thread* thread(); // return current thread, if attached
    45   static Thread* get_thread_slow();
    45   static void    set_thread(Thread* thread); // set current thread
    46   static void    invalidate_all() { pd_invalidate_all(); }
       
    47   static void    init();
    46   static void    init();
    48   static bool    is_initialized();
    47   static bool    is_initialized(); // can't use TLS prior to initialization
    49 
       
    50   // Machine dependent stuff
       
    51 #ifdef TARGET_OS_ARCH_linux_x86
       
    52 # include "threadLS_linux_x86.hpp"
       
    53 #endif
       
    54 #ifdef TARGET_OS_ARCH_linux_sparc
       
    55 # include "threadLS_linux_sparc.hpp"
       
    56 #endif
       
    57 #ifdef TARGET_OS_ARCH_linux_zero
       
    58 # include "threadLS_linux_zero.hpp"
       
    59 #endif
       
    60 #ifdef TARGET_OS_ARCH_solaris_x86
       
    61 # include "threadLS_solaris_x86.hpp"
       
    62 #endif
       
    63 #ifdef TARGET_OS_ARCH_solaris_sparc
       
    64 # include "threadLS_solaris_sparc.hpp"
       
    65 #endif
       
    66 #ifdef TARGET_OS_ARCH_windows_x86
       
    67 # include "threadLS_windows_x86.hpp"
       
    68 #endif
       
    69 #ifdef TARGET_OS_ARCH_linux_arm
       
    70 # include "threadLS_linux_arm.hpp"
       
    71 #endif
       
    72 #ifdef TARGET_OS_ARCH_linux_ppc
       
    73 # include "threadLS_linux_ppc.hpp"
       
    74 #endif
       
    75 #ifdef TARGET_OS_ARCH_linux_aarch64
       
    76 # include "threadLS_linux_aarch64.hpp"
       
    77 #endif
       
    78 #ifdef TARGET_OS_ARCH_aix_ppc
       
    79 # include "threadLS_aix_ppc.hpp"
       
    80 #endif
       
    81 #ifdef TARGET_OS_ARCH_bsd_x86
       
    82 # include "threadLS_bsd_x86.hpp"
       
    83 #endif
       
    84 #ifdef TARGET_OS_ARCH_bsd_zero
       
    85 # include "threadLS_bsd_zero.hpp"
       
    86 #endif
       
    87 
       
    88 #ifndef SOLARIS
       
    89  public:
       
    90   // Accessor
       
    91   static inline int  thread_index()              { return _thread_index; }
       
    92   static inline void set_thread_index(int index) { _thread_index = index; }
       
    93 
       
    94  private:
       
    95   static int     _thread_index;
       
    96 
       
    97   static void    generate_code_for_get_thread();
       
    98 
       
    99   // Processor dependent parts of set_thread and initialization
       
   100   static void pd_set_thread(Thread* thread);
       
   101   static void pd_init();
       
   102 
       
   103 #endif // SOLARIS
       
   104 
       
   105   // Invalidate any thread cacheing or optimization schemes.
       
   106   static void pd_invalidate_all();
       
   107 
       
   108 };
    48 };
   109 
    49 
   110 #endif // SHARE_VM_RUNTIME_THREADLOCALSTORAGE_HPP
    50 #endif // SHARE_VM_RUNTIME_THREADLOCALSTORAGE_HPP