8151322: Implement os::set_native_thread_name() on Solaris

Reviewed-by: sla, kbarrett, gziemski
This commit is contained in:
David Holmes 2016-04-10 21:34:47 -04:00
parent 6cec4d5047
commit 7b27547030
3 changed files with 22 additions and 4 deletions

View file

@ -161,6 +161,7 @@ address os::Solaris::handler_end; // end pc of thr_sighndlrinfo
address os::Solaris::_main_stack_base = NULL; // 4352906 workaround
os::Solaris::pthread_setname_np_func_t os::Solaris::_pthread_setname_np = NULL;
// "default" initializers for missing libc APIs
extern "C" {
@ -441,8 +442,15 @@ static bool assign_distribution(processorid_t* id_array,
}
void os::set_native_thread_name(const char *name) {
// Not yet implemented.
return;
if (Solaris::_pthread_setname_np != NULL) {
// Only the first 31 bytes of 'name' are processed by pthread_setname_np
// but we explicitly copy into a size-limited buffer to avoid any
// possible overflow.
char buf[32];
snprintf(buf, sizeof(buf), "%s", name);
buf[sizeof(buf) - 1] = '\0';
Solaris::_pthread_setname_np(pthread_self(), buf);
}
}
bool os::distribute_processes(uint length, uint* distribution) {
@ -4410,6 +4418,13 @@ void os::init(void) {
// the minimum of what the OS supports (thr_min_stack()), and
// enough to allow the thread to get to user bytecode execution.
Solaris::min_stack_allowed = MAX2(thr_min_stack(), Solaris::min_stack_allowed);
// retrieve entry point for pthread_setname_np
void * handle = dlopen("libc.so.1", RTLD_LAZY);
if (handle != NULL) {
Solaris::_pthread_setname_np =
(Solaris::pthread_setname_np_func_t)dlsym(handle, "pthread_setname_np");
}
}
// To install functions for atexit system call

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -122,6 +122,9 @@ class Solaris {
static int _SIGasync; // user-overridable ASYNC_SIGNAL
static void set_SIGasync(int newsig) { _SIGasync = newsig; }
typedef int (*pthread_setname_np_func_t)(pthread_t, const char*);
static pthread_setname_np_func_t _pthread_setname_np;
public:
// Large Page Support--ISM.
static bool largepage_range(char* addr, size_t size);

View file

@ -328,7 +328,7 @@ inline size_t pointer_delta(const MetaWord* left, const MetaWord* right) {
// so far from the middle of the road that it is likely to be problematic in
// many C++ compilers.
//
#define CAST_TO_FN_PTR(func_type, value) ((func_type)(castable_address(value)))
#define CAST_TO_FN_PTR(func_type, value) (reinterpret_cast<func_type>(value))
#define CAST_FROM_FN_PTR(new_type, func_ptr) ((new_type)((address_word)(func_ptr)))
// Unsigned byte types for os and stream.hpp