< prev index next >
src/hotspot/share/services/attachListener.hpp
Print this page
@@ -24,10 +24,12 @@
#ifndef SHARE_SERVICES_ATTACHLISTENER_HPP
#define SHARE_SERVICES_ATTACHLISTENER_HPP
#include "memory/allocation.hpp"
+#include "metaprogramming/isRegisteredEnum.hpp"
+#include "runtime/atomic.hpp"
#include "utilities/debug.hpp"
#include "utilities/globalDefinitions.hpp"
#include "utilities/macros.hpp"
#include "utilities/ostream.hpp"
@@ -47,34 +49,64 @@
struct AttachOperationFunctionInfo {
const char* name;
AttachOperationFunction func;
};
+enum AttachListenerState {
+ AL_NOT_INITIALIZED,
+ AL_INITIALIZING,
+ AL_INITIALIZED
+};
+
+template<> struct IsRegisteredEnum<AttachListenerState> : public TrueType {};
+
class AttachListener: AllStatic {
public:
static void vm_start() NOT_SERVICES_RETURN;
static void init() NOT_SERVICES_RETURN;
static void abort() NOT_SERVICES_RETURN;
// invoke to perform clean-up tasks when all clients detach
static void detachall() NOT_SERVICES_RETURN;
+ // check unix domain socket file on filesystem
+ static bool check_socket_file() NOT_SERVICES_RETURN_(false);
+
// indicates if the Attach Listener needs to be created at startup
static bool init_at_startup() NOT_SERVICES_RETURN_(false);
// indicates if we have a trigger to start the Attach Listener
static bool is_init_trigger() NOT_SERVICES_RETURN_(false);
#if !INCLUDE_SERVICES
static bool is_attach_supported() { return false; }
#else
+
private:
- static volatile bool _initialized;
+ static volatile AttachListenerState _state;
public:
- static bool is_initialized() { return _initialized; }
- static void set_initialized() { _initialized = true; }
+ static void set_state(AttachListenerState new_state) {
+ Atomic::store(new_state, &_state);
+ }
+
+ static AttachListenerState get_state() {
+ return Atomic::load(&_state);
+ }
+
+ static AttachListenerState transit_state(AttachListenerState new_state,
+ AttachListenerState cmp_state) {
+ return Atomic::cmpxchg(new_state, &_state, cmp_state);
+ }
+
+ static bool is_initialized() {
+ return Atomic::load(&_state) == AL_INITIALIZED;
+ }
+
+ static void set_initialized() {
+ Atomic::store(AL_INITIALIZED, &_state);
+ }
// indicates if this VM supports attach-on-demand
static bool is_attach_supported() { return !DisableAttachMechanism; }
// platform specific initialization
< prev index next >