--- old/src/hotspot/os/bsd/attachListener_bsd.cpp 2019-07-15 21:37:21.766458807 +0900 +++ new/src/hotspot/os/bsd/attachListener_bsd.cpp 2019-07-15 21:37:21.666458952 +0900 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2019, 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 @@ -68,17 +68,7 @@ // the file descriptor for the listening socket static int _listener; - static void set_path(char* path) { - if (path == NULL) { - _has_path = false; - } else { - strncpy(_path, path, UNIX_PATH_MAX); - _path[UNIX_PATH_MAX-1] = '\0'; - _has_path = true; - } - } - - static void set_listener(int s) { _listener = s; } + static bool _atexit_registered; // reads a request from the given connected socket static BsdAttachOperation* read_request(int s); @@ -91,6 +81,19 @@ ATTACH_ERROR_BADVERSION = 101 // error codes }; + static void set_path(char* path) { + if (path == NULL) { + _path[0] = '\0'; + _has_path = false; + } else { + strncpy(_path, path, UNIX_PATH_MAX); + _path[UNIX_PATH_MAX-1] = '\0'; + _has_path = true; + } + } + + static void set_listener(int s) { _listener = s; } + // initialize the listener, returns 0 if okay static int init(); @@ -124,6 +127,7 @@ char BsdAttachListener::_path[UNIX_PATH_MAX]; bool BsdAttachListener::_has_path; int BsdAttachListener::_listener = -1; +bool BsdAttachListener::_atexit_registered = false; // Supporting class to help split a buffer into individual components class ArgumentIterator : public StackObj { @@ -158,16 +162,15 @@ // bound too. extern "C" { static void listener_cleanup() { - static int cleanup_done; - if (!cleanup_done) { - cleanup_done = 1; - int s = BsdAttachListener::listener(); - if (s != -1) { - ::close(s); - } - if (BsdAttachListener::has_path()) { - ::unlink(BsdAttachListener::path()); - } + int s = BsdAttachListener::listener(); + if (s != -1) { + BsdAttachListener::set_listener(-1); + ::shutdown(s, SHUT_RDWR); + ::close(s); + } + if (BsdAttachListener::has_path()) { + ::unlink(BsdAttachListener::path()); + BsdAttachListener::set_path(NULL); } } } @@ -180,7 +183,10 @@ int listener; // listener socket (file descriptor) // register function to cleanup - ::atexit(listener_cleanup); + if (!_atexit_registered) { + _atexit_registered = true; + ::atexit(listener_cleanup); + } int n = snprintf(path, UNIX_PATH_MAX, "%s/.java_pid%d", os::get_temp_directory(), os::current_process_id()); @@ -485,6 +491,28 @@ return ret_code; } +bool AttachListener::check_socket_file() { + int ret; + struct stat st; + ret = stat(BsdAttachListener::path(), &st); + if (ret == -1) { // need to restart attach listener. + log_debug(attach)("Socket file %s does not exist - Restart Attach Listener", + BsdAttachListener::path()); + + listener_cleanup(); + + // wait to terminate current attach listener instance... + + while (AttachListener::transit_state(AL_INITIALIZING, + + AL_NOT_INITIALIZED) != AL_NOT_INITIALIZED) { + os::naked_yield(); + } + return is_init_trigger(); + } + return false; +} + // Attach Listener is started lazily except in the case when // +ReduseSignalUsage is used bool AttachListener::init_at_startup() {