mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 15:24:43 +02:00
8235962: os::current_thread_id() is not signal safe on macOS
Use mach_thread_self instead of pthread_mach_thread_np Reviewed-by: dholmes, cjplummer
This commit is contained in:
parent
9886cb401c
commit
080c67f096
3 changed files with 38 additions and 37 deletions
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -36,11 +36,12 @@ void OSThread::pd_initialize() {
|
||||||
#else
|
#else
|
||||||
_thread_id = NULL;
|
_thread_id = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
_unique_thread_id = 0;
|
||||||
_pthread_id = NULL;
|
_pthread_id = NULL;
|
||||||
_siginfo = NULL;
|
_siginfo = NULL;
|
||||||
_ucontext = NULL;
|
_ucontext = NULL;
|
||||||
_expanding_stack = 0;
|
_expanding_stack = 0;
|
||||||
_alt_sig_stack = NULL;
|
_alt_sig_stack = NULL;
|
||||||
|
|
||||||
sigemptyset(&_caller_sigmask);
|
sigemptyset(&_caller_sigmask);
|
||||||
|
|
||||||
|
@ -49,6 +50,22 @@ void OSThread::pd_initialize() {
|
||||||
assert(_startThread_lock !=NULL, "check");
|
assert(_startThread_lock !=NULL, "check");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Additional thread_id used to correlate threads in SA
|
||||||
|
void OSThread::set_unique_thread_id() {
|
||||||
|
#ifdef __APPLE__
|
||||||
|
thread_identifier_info_data_t m_ident_info;
|
||||||
|
mach_msg_type_number_t count = THREAD_IDENTIFIER_INFO_COUNT;
|
||||||
|
|
||||||
|
mach_port_t mach_thread_port = mach_thread_self();
|
||||||
|
guarantee(mach_thread_port != 0, "just checking");
|
||||||
|
thread_info(mach_thread_port, THREAD_IDENTIFIER_INFO,
|
||||||
|
(thread_info_t) &m_ident_info, &count);
|
||||||
|
mach_port_deallocate(mach_task_self(), mach_thread_port);
|
||||||
|
|
||||||
|
_unique_thread_id = m_ident_info.thread_id;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void OSThread::pd_destroy() {
|
void OSThread::pd_destroy() {
|
||||||
delete _startThread_lock;
|
delete _startThread_lock;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2019, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -82,9 +82,7 @@
|
||||||
_pthread_id = tid;
|
_pthread_id = tid;
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_unique_thread_id(uint64_t id) {
|
void set_unique_thread_id();
|
||||||
_unique_thread_id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ***************************************************************
|
// ***************************************************************
|
||||||
// suspension support.
|
// suspension support.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2019, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -634,19 +634,6 @@ extern "C" objc_registerThreadWithCollector_t objc_registerThreadWithCollectorFu
|
||||||
objc_registerThreadWithCollector_t objc_registerThreadWithCollectorFunction = NULL;
|
objc_registerThreadWithCollector_t objc_registerThreadWithCollectorFunction = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __APPLE__
|
|
||||||
static uint64_t locate_unique_thread_id(mach_port_t mach_thread_port) {
|
|
||||||
// Additional thread_id used to correlate threads in SA
|
|
||||||
thread_identifier_info_data_t m_ident_info;
|
|
||||||
mach_msg_type_number_t count = THREAD_IDENTIFIER_INFO_COUNT;
|
|
||||||
|
|
||||||
thread_info(mach_thread_port, THREAD_IDENTIFIER_INFO,
|
|
||||||
(thread_info_t) &m_ident_info, &count);
|
|
||||||
|
|
||||||
return m_ident_info.thread_id;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Thread start routine for all newly created threads
|
// Thread start routine for all newly created threads
|
||||||
static void *thread_native_entry(Thread *thread) {
|
static void *thread_native_entry(Thread *thread) {
|
||||||
|
|
||||||
|
@ -672,10 +659,10 @@ static void *thread_native_entry(Thread *thread) {
|
||||||
os::current_thread_id(), (uintx) pthread_self());
|
os::current_thread_id(), (uintx) pthread_self());
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
uint64_t unique_thread_id = locate_unique_thread_id(osthread->thread_id());
|
// Store unique OS X thread id used by SA
|
||||||
guarantee(unique_thread_id != 0, "unique thread id was not found");
|
osthread->set_unique_thread_id();
|
||||||
osthread->set_unique_thread_id(unique_thread_id);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// initialize signal mask for this thread
|
// initialize signal mask for this thread
|
||||||
os::Bsd::hotspot_sigmask(thread);
|
os::Bsd::hotspot_sigmask(thread);
|
||||||
|
|
||||||
|
@ -823,12 +810,12 @@ bool os::create_attached_thread(JavaThread* thread) {
|
||||||
|
|
||||||
osthread->set_thread_id(os::Bsd::gettid());
|
osthread->set_thread_id(os::Bsd::gettid());
|
||||||
|
|
||||||
// Store pthread info into the OSThread
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
uint64_t unique_thread_id = locate_unique_thread_id(osthread->thread_id());
|
// Store unique OS X thread id used by SA
|
||||||
guarantee(unique_thread_id != 0, "just checking");
|
osthread->set_unique_thread_id();
|
||||||
osthread->set_unique_thread_id(unique_thread_id);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Store pthread info into the OSThread
|
||||||
osthread->set_pthread_id(::pthread_self());
|
osthread->set_pthread_id(::pthread_self());
|
||||||
|
|
||||||
// initialize floating point control register
|
// initialize floating point control register
|
||||||
|
@ -1100,12 +1087,11 @@ void os::die() {
|
||||||
pid_t os::Bsd::gettid() {
|
pid_t os::Bsd::gettid() {
|
||||||
int retval = -1;
|
int retval = -1;
|
||||||
|
|
||||||
#ifdef __APPLE__ //XNU kernel
|
#ifdef __APPLE__ // XNU kernel
|
||||||
// despite the fact mach port is actually not a thread id use it
|
mach_port_t port = mach_thread_self();
|
||||||
// instead of syscall(SYS_thread_selfid) as it certainly fits to u4
|
guarantee(MACH_PORT_VALID(port), "just checking");
|
||||||
retval = ::pthread_mach_thread_np(::pthread_self());
|
mach_port_deallocate(mach_task_self(), port);
|
||||||
guarantee(retval != 0, "just checking");
|
return (pid_t)port;
|
||||||
return retval;
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
|
@ -1128,7 +1114,7 @@ pid_t os::Bsd::gettid() {
|
||||||
|
|
||||||
intx os::current_thread_id() {
|
intx os::current_thread_id() {
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
return (intx)::pthread_mach_thread_np(::pthread_self());
|
return (intx)os::Bsd::gettid();
|
||||||
#else
|
#else
|
||||||
return (intx)::pthread_self();
|
return (intx)::pthread_self();
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue