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 |