7061197: ThreadLocalStorage sp map table should be optional
Reviewed-by: dholmes, never, jwilhelm, kvn
This commit is contained in:
parent
769ba74d9c
commit
c76b491afb
hotspot/src/os_cpu/linux_x86/vm
@ -33,6 +33,28 @@ void MacroAssembler::int3() {
|
||||
call(RuntimeAddress(CAST_FROM_FN_PTR(address, os::breakpoint)));
|
||||
}
|
||||
|
||||
#ifdef MINIMIZE_RAM_USAGE
|
||||
|
||||
void MacroAssembler::get_thread(Register thread) {
|
||||
// call pthread_getspecific
|
||||
// void * pthread_getspecific(pthread_key_t key);
|
||||
if (thread != rax) push(rax);
|
||||
push(rcx);
|
||||
push(rdx);
|
||||
|
||||
push(ThreadLocalStorage::thread_index());
|
||||
call(RuntimeAddress(CAST_FROM_FN_PTR(address, pthread_getspecific)));
|
||||
increment(rsp, wordSize);
|
||||
|
||||
pop(rdx);
|
||||
pop(rcx);
|
||||
if (thread != rax) {
|
||||
mov(thread, rax);
|
||||
pop(rax);
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
void MacroAssembler::get_thread(Register thread) {
|
||||
movl(thread, rsp);
|
||||
shrl(thread, PAGE_SHIFT);
|
||||
@ -43,6 +65,7 @@ void MacroAssembler::get_thread(Register thread) {
|
||||
|
||||
movptr(thread, tls);
|
||||
}
|
||||
#endif // MINIMIZE_RAM_USAGE
|
||||
#else
|
||||
void MacroAssembler::int3() {
|
||||
call(RuntimeAddress(CAST_FROM_FN_PTR(address, os::breakpoint)));
|
||||
|
@ -52,25 +52,20 @@
|
||||
// MADV_DONTNEED on Linux keeps the virtual memory mapping, but zaps the
|
||||
// physical memory page (i.e. similar to MADV_FREE on Solaris).
|
||||
|
||||
#ifndef AMD64
|
||||
#if !defined(AMD64) && !defined(MINIMIZE_RAM_USAGE)
|
||||
Thread* ThreadLocalStorage::_sp_map[1UL << (SP_BITLENGTH - PAGE_SHIFT)];
|
||||
#endif // !AMD64
|
||||
|
||||
void ThreadLocalStorage::generate_code_for_get_thread() {
|
||||
// nothing we can do here for user-level thread
|
||||
}
|
||||
|
||||
void ThreadLocalStorage::pd_init() {
|
||||
#ifndef AMD64
|
||||
assert(align_size_down(os::vm_page_size(), PAGE_SIZE) == os::vm_page_size(),
|
||||
"page size must be multiple of PAGE_SIZE");
|
||||
#endif // !AMD64
|
||||
}
|
||||
|
||||
void ThreadLocalStorage::pd_set_thread(Thread* thread) {
|
||||
os::thread_local_storage_at_put(ThreadLocalStorage::thread_index(), thread);
|
||||
|
||||
#ifndef AMD64
|
||||
address stack_top = os::current_stack_base();
|
||||
size_t stack_size = os::current_stack_size();
|
||||
|
||||
@ -88,5 +83,17 @@ void ThreadLocalStorage::pd_set_thread(Thread* thread) {
|
||||
"thread exited without detaching from VM??");
|
||||
_sp_map[(uintptr_t)p >> PAGE_SHIFT] = thread;
|
||||
}
|
||||
#endif // !AMD64
|
||||
}
|
||||
#else
|
||||
|
||||
void ThreadLocalStorage::generate_code_for_get_thread() {
|
||||
// nothing we can do here for user-level thread
|
||||
}
|
||||
|
||||
void ThreadLocalStorage::pd_init() {
|
||||
}
|
||||
|
||||
void ThreadLocalStorage::pd_set_thread(Thread* thread) {
|
||||
os::thread_local_storage_at_put(ThreadLocalStorage::thread_index(), thread);
|
||||
}
|
||||
#endif // !AMD64 && !MINIMIZE_RAM_USAGE
|
||||
|
@ -27,28 +27,32 @@
|
||||
|
||||
// Processor dependent parts of ThreadLocalStorage
|
||||
|
||||
#ifndef AMD64
|
||||
#if !defined(AMD64) && !defined(MINIMIZE_RAM_USAGE)
|
||||
|
||||
// map stack pointer to thread pointer - see notes in threadLS_linux_x86.cpp
|
||||
#define SP_BITLENGTH 32
|
||||
#define PAGE_SHIFT 12
|
||||
#define PAGE_SIZE (1UL << PAGE_SHIFT)
|
||||
static Thread* _sp_map[1UL << (SP_BITLENGTH - PAGE_SHIFT)];
|
||||
#endif // !AMD64
|
||||
|
||||
public:
|
||||
|
||||
#ifndef AMD64
|
||||
static Thread** sp_map_addr() { return _sp_map; }
|
||||
#endif // !AMD64
|
||||
|
||||
static Thread* thread() {
|
||||
#ifdef AMD64
|
||||
return (Thread*) os::thread_local_storage_at(thread_index());
|
||||
#else
|
||||
uintptr_t sp;
|
||||
__asm__ volatile ("movl %%esp, %0" : "=r" (sp));
|
||||
return _sp_map[sp >> PAGE_SHIFT];
|
||||
#endif // AMD64
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
public:
|
||||
|
||||
static Thread* thread() {
|
||||
return (Thread*) os::thread_local_storage_at(thread_index());
|
||||
}
|
||||
|
||||
#endif // AMD64 || MINIMIZE_RAM_USAGE
|
||||
|
||||
#endif // OS_CPU_LINUX_X86_VM_THREADLS_LINUX_X86_HPP
|
||||
|
Loading…
x
Reference in New Issue
Block a user