< prev index next >

src/hotspot/share/runtime/handshake.hpp

Print this page
rev 57079 : imported patch 8234796

@@ -27,27 +27,46 @@
 
 #include "memory/allocation.hpp"
 #include "runtime/flags/flagSetting.hpp"
 #include "runtime/semaphore.hpp"
 
-class ThreadClosure;
 class JavaThread;
 
 // A handshake operation is a callback that is executed for each JavaThread
 // while that thread is in a safepoint safe state. The callback is executed
 // either by the thread itself or by the VM thread while keeping the thread
 // in a blocked state. A handshake can be performed with a single
 // JavaThread as well.
+class HandshakeOperation: public StackObj {
+  static Semaphore _done;
+  const char* _name;
+  bool _executed;
+public:
+  HandshakeOperation(const char* name) : _name(name), _executed(false) {}
+
+  void do_handshake(JavaThread* thread);
+  bool thread_has_completed() { return _done.trywait(); }
+  bool executed() const { return _executed; }
+  const char* name() { return _name; };
+
+#ifdef ASSERT
+  void check_state() {
+    assert(!_done.trywait(), "Must be zero");
+  }
+#endif
+
+  // Impl
+  virtual void do_thread(JavaThread* thread) = 0;
+};
+
 class Handshake : public AllStatic {
  public:
   // Execution of handshake operation
-  static void execute(ThreadClosure* thread_cl);
-  static bool execute(ThreadClosure* thread_cl, JavaThread* target);
+  static void execute(HandshakeOperation* hs_op);
+  static bool execute(HandshakeOperation* hs_op, JavaThread* target);
 };
 
-class HandshakeOperation;
-
 // The HandshakeState keep tracks of an ongoing handshake for one JavaThread.
 // VM thread and JavaThread are serialized with the semaphore making sure
 // the operation is only done by either VM thread on behalf of the JavaThread
 // or the JavaThread itself.
 class HandshakeState {
< prev index next >