< prev index next >

src/hotspot/share/runtime/handshake.hpp

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 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
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.

@@ -28,21 +28,17 @@
 #include "memory/allocation.hpp"
 #include "memory/iterator.hpp"
 #include "runtime/flags/flagSetting.hpp"
 #include "runtime/semaphore.hpp"
 
-class HandshakeOperation;
 class JavaThread;
 
 // A handshake closure 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 target JavaThread itself or by the VMThread while keeping
-// the target thread in a blocked state. A handshake can be performed with a
-// single JavaThread as well. In that case, the callback is executed either
-// by the target JavaThread itself or, depending on whether the operation is
-// a direct handshake or not, by the JavaThread that requested the handshake
-// or the VMThread respectively.
+// 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 HandshakeClosure : public ThreadClosure {
   const char* const _name;
  public:
   HandshakeClosure(const char* name) : _name(name) {}
   const char* name() const {

@@ -54,55 +50,51 @@
 class Handshake : public AllStatic {
  public:
   // Execution of handshake operation
   static void execute(HandshakeClosure* hs_cl);
   static bool execute(HandshakeClosure* hs_cl, JavaThread* target);
-  static bool execute_direct(HandshakeClosure* hs_cl, JavaThread* target);
 };
 
-// The HandshakeState keeps track of an ongoing handshake for this JavaThread.
-// VMThread/Handshaker and JavaThread are serialized with semaphore _processing_sem
-// making sure the operation is only done by either VMThread/Handshaker on behalf
-// of the JavaThread or by the target JavaThread itself.
+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 {
-  JavaThread* _handshakee;
   HandshakeOperation* volatile _operation;
-  HandshakeOperation* volatile _operation_direct;
 
-  Semaphore _handshake_turn_sem;  // Used to serialize direct handshakes for this JavaThread.
-  Semaphore _processing_sem;
+  Semaphore _semaphore;
   bool _thread_in_process_handshake;
 
-  bool claim_handshake(bool is_direct);
-  bool possibly_can_process_handshake();
-  bool can_process_handshake();
-  void clear_handshake(bool is_direct);
+  bool claim_handshake_for_vmthread();
+  bool vmthread_can_process_handshake(JavaThread* target);
 
-  void process_self_inner();
+  void clear_handshake(JavaThread* thread);
 
+  void process_self_inner(JavaThread* thread);
 public:
   HandshakeState();
 
-  void set_thread(JavaThread* thread) { _handshakee = thread; }
+  void set_operation(JavaThread* thread, HandshakeOperation* op);
 
-  void set_operation(HandshakeOperation* op);
-  bool has_operation() const { return _operation != NULL || _operation_direct != NULL; }
-  bool has_specific_operation(bool is_direct) const {
-    return is_direct ? _operation_direct != NULL : _operation != NULL;
+  bool has_operation() const {
+    return _operation != NULL;
   }
 
-  void process_by_self() {
+  void process_by_self(JavaThread* thread) {
     if (!_thread_in_process_handshake) {
       FlagSetting fs(_thread_in_process_handshake, true);
-      process_self_inner();
+      process_self_inner(thread);
     }
   }
-  bool try_process(HandshakeOperation* op);
+
+  bool try_process_by_vmThread(JavaThread* target);
 
 #ifdef ASSERT
-  Thread* _active_handshaker;
-  Thread* get_active_handshaker() const { return _active_handshaker; }
+  bool _vmthread_processing_handshake;
+  bool is_vmthread_processing_handshake() const { return _vmthread_processing_handshake; }
 #endif
 
 };
 
 #endif // SHARE_RUNTIME_HANDSHAKE_HPP
< prev index next >