--- old/src/share/vm/runtime/threadLocalStorage.hpp 2015-11-11 15:14:59.207538854 -0500 +++ new/src/share/vm/runtime/threadLocalStorage.hpp 2015-11-11 15:14:57.167423336 -0500 @@ -25,86 +25,26 @@ #ifndef SHARE_VM_RUNTIME_THREADLOCALSTORAGE_HPP #define SHARE_VM_RUNTIME_THREADLOCALSTORAGE_HPP -#include "gc/shared/gcUtil.hpp" -#include "runtime/os.hpp" #include "utilities/top.hpp" -// Interface for thread local storage +// forward-decl as we can't have an include cycle +class Thread; -// Fast variant of ThreadLocalStorage::get_thread_slow -extern "C" Thread* get_thread(); - -// Get raw thread id: e.g., %g7 on sparc, fs or gs on x86 -extern "C" uintptr_t _raw_thread_id(); +// Wrapper class for library-based (as opposed to compiler-based) +// thread-local storage (TLS). All platforms require this for +// signal-handler based TLS access (which while not strictly async-signal +// safe in theory, is and has-been for a long time, in practice). +// Platforms without compiler-based TLS (ie __thread storage-class modifier) +// will use this implementation for all TLS access - see thread.hpp/cpp class ThreadLocalStorage : AllStatic { // Exported API public: - static void set_thread(Thread* thread); - static Thread* get_thread_slow(); - static void invalidate_all() { pd_invalidate_all(); } + static Thread* thread(); // return current thread, if attached + static void set_thread(Thread* thread); // set current thread static void init(); - static bool is_initialized(); - - // Machine dependent stuff -#ifdef TARGET_OS_ARCH_linux_x86 -# include "threadLS_linux_x86.hpp" -#endif -#ifdef TARGET_OS_ARCH_linux_sparc -# include "threadLS_linux_sparc.hpp" -#endif -#ifdef TARGET_OS_ARCH_linux_zero -# include "threadLS_linux_zero.hpp" -#endif -#ifdef TARGET_OS_ARCH_solaris_x86 -# include "threadLS_solaris_x86.hpp" -#endif -#ifdef TARGET_OS_ARCH_solaris_sparc -# include "threadLS_solaris_sparc.hpp" -#endif -#ifdef TARGET_OS_ARCH_windows_x86 -# include "threadLS_windows_x86.hpp" -#endif -#ifdef TARGET_OS_ARCH_linux_arm -# include "threadLS_linux_arm.hpp" -#endif -#ifdef TARGET_OS_ARCH_linux_ppc -# include "threadLS_linux_ppc.hpp" -#endif -#ifdef TARGET_OS_ARCH_linux_aarch64 -# include "threadLS_linux_aarch64.hpp" -#endif -#ifdef TARGET_OS_ARCH_aix_ppc -# include "threadLS_aix_ppc.hpp" -#endif -#ifdef TARGET_OS_ARCH_bsd_x86 -# include "threadLS_bsd_x86.hpp" -#endif -#ifdef TARGET_OS_ARCH_bsd_zero -# include "threadLS_bsd_zero.hpp" -#endif - -#ifndef SOLARIS - public: - // Accessor - static inline int thread_index() { return _thread_index; } - static inline void set_thread_index(int index) { _thread_index = index; } - - private: - static int _thread_index; - - static void generate_code_for_get_thread(); - - // Processor dependent parts of set_thread and initialization - static void pd_set_thread(Thread* thread); - static void pd_init(); - -#endif // SOLARIS - - // Invalidate any thread cacheing or optimization schemes. - static void pd_invalidate_all(); - + static bool is_initialized(); // can't use TLS prior to initialization }; #endif // SHARE_VM_RUNTIME_THREADLOCALSTORAGE_HPP