< prev index next >

src/hotspot/os/aix/attachListener_aix.cpp

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2018 SAP SE. 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 * under the terms of the GNU General Public License version 2 only, as --- 1,7 ---- /* ! * Copyright (c) 2005, 2019, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2018 SAP SE. 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 * under the terms of the GNU General Public License version 2 only, as
*** 69,89 **** static bool _shutdown; // 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; } // reads a request from the given connected socket static AixAttachOperation* read_request(int s); public: --- 69,79 ---- static bool _shutdown; // the file descriptor for the listening socket static int _listener; ! static bool _atexit_registered; // reads a request from the given connected socket static AixAttachOperation* read_request(int s); public:
*** 92,101 **** --- 82,104 ---- }; enum { 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(); static char* path() { return _path; } static bool has_path() { return _has_path; }
*** 128,137 **** --- 131,141 ---- // statics char AixAttachListener::_path[UNIX_PATH_MAX]; bool AixAttachListener::_has_path; int AixAttachListener::_listener = -1; + bool AixAttachListener::_atexit_registered = false; // Shutdown marker to prevent accept blocking during clean-up bool AixAttachListener::_shutdown = false; // Supporting class to help split a buffer into individual components class ArgumentIterator : public StackObj {
*** 175,195 **** // would be dead after the first operation completion). // 2. close(s) may never return if the listener thread is in socket accept(). Unlinking the file // should be sufficient for cleanup. extern "C" { static void listener_cleanup() { - static int cleanup_done; - if (!cleanup_done) { - cleanup_done = 1; AixAttachListener::set_shutdown(true); int s = AixAttachListener::listener(); if (s != -1) { ::shutdown(s, 2); } if (AixAttachListener::has_path()) { ::unlink(AixAttachListener::path()); ! } } } } // Initialization - create a listener socket and bind it to a file --- 179,197 ---- // would be dead after the first operation completion). // 2. close(s) may never return if the listener thread is in socket accept(). Unlinking the file // should be sufficient for cleanup. extern "C" { static void listener_cleanup() { AixAttachListener::set_shutdown(true); int s = AixAttachListener::listener(); if (s != -1) { + AixAttachListener::set_listener(-1); ::shutdown(s, 2); } if (AixAttachListener::has_path()) { ::unlink(AixAttachListener::path()); ! AixAttachListener::set_path(NULL); } } } // Initialization - create a listener socket and bind it to a file
*** 198,208 **** --- 200,213 ---- char path[UNIX_PATH_MAX]; // socket file char initial_path[UNIX_PATH_MAX]; // socket file during setup int listener; // listener socket (file descriptor) // register function to 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()); if (n < (int)UNIX_PATH_MAX) { n = snprintf(initial_path, UNIX_PATH_MAX, "%s.tmp", path);
*** 513,522 **** --- 518,547 ---- thread->check_and_wait_while_suspended(); return ret_code; } + bool AttachListener::check_socket_file() { + int ret; + struct stat64 st; + ret = stat64(AixAttachListener::path(), &st); + if (ret == -1) { // need to restart attach listener. + log_debug(attach)("Socket file %s does not exist - Restart Attach Listener", + AixAttachListener::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() { if (ReduceSignalUsage) { return true;
< prev index next >