< prev index next >

src/share/vm/gc_implementation/shared/suspendibleThreadSet.hpp

Print this page
rev 8331 : 8079579: Add SuspendibleThreadSetLeaver and make SuspendibleThreadSet::joint()/leave() private
Reviewed-by:

*** 1,7 **** /* ! * Copyright (c) 2014, 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. --- 1,7 ---- /* ! * Copyright (c) 2014, 2015, 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.
*** 34,56 **** // until all the threads in the set have yielded or left the set. Threads // may not enter the set when an attempted suspension is in progress. The // suspending thread later calls desynchronize(), allowing the suspended // threads to continue. class SuspendibleThreadSet : public AllStatic { private: static uint _nthreads; static uint _nthreads_stopped; static bool _suspend_all; static double _suspend_all_start; - public: // Add the current thread to the set. May block if a suspension is in progress. static void join(); // Removes the current thread from the set. static void leave(); // Returns true if an suspension is in progress. static bool should_yield() { return _suspend_all; } // Suspends the current thread if a suspension is in progress. static void yield(); --- 34,59 ---- // until all the threads in the set have yielded or left the set. Threads // may not enter the set when an attempted suspension is in progress. The // suspending thread later calls desynchronize(), allowing the suspended // threads to continue. class SuspendibleThreadSet : public AllStatic { + friend class SuspendibleThreadSetJoiner; + friend class SuspendibleThreadSetLeaver; + private: static uint _nthreads; static uint _nthreads_stopped; static bool _suspend_all; static double _suspend_all_start; // Add the current thread to the set. May block if a suspension is in progress. static void join(); // Removes the current thread from the set. static void leave(); + public: // Returns true if an suspension is in progress. static bool should_yield() { return _suspend_all; } // Suspends the current thread if a suspension is in progress. static void yield();
*** 61,84 **** // Resumes all suspended threads in the set. static void desynchronize(); }; class SuspendibleThreadSetJoiner : public StackObj { public: ! SuspendibleThreadSetJoiner() { SuspendibleThreadSet::join(); } ~SuspendibleThreadSetJoiner() { SuspendibleThreadSet::leave(); } bool should_yield() { return SuspendibleThreadSet::should_yield(); } void yield() { SuspendibleThreadSet::yield(); } }; #endif // SHARE_VM_GC_IMPLEMENTATION_SHARED_SUSPENDIBLETHREADSET_HPP --- 64,117 ---- // Resumes all suspended threads in the set. static void desynchronize(); }; class SuspendibleThreadSetJoiner : public StackObj { + private: + bool _active; + public: ! SuspendibleThreadSetJoiner(bool active = true) : _active(active) { ! if (_active) { SuspendibleThreadSet::join(); } + } ~SuspendibleThreadSetJoiner() { + if (_active) { SuspendibleThreadSet::leave(); } + } bool should_yield() { + if (_active) { return SuspendibleThreadSet::should_yield(); + } else { + return false; + } } void yield() { + assert(_active, "Thread has not joined the suspendible thread set"); SuspendibleThreadSet::yield(); } }; + class SuspendibleThreadSetLeaver : public StackObj { + private: + bool _active; + + public: + SuspendibleThreadSetLeaver(bool active = true) : _active(active) { + if (_active) { + SuspendibleThreadSet::leave(); + } + } + + ~SuspendibleThreadSetLeaver() { + if (_active) { + SuspendibleThreadSet::join(); + } + } + }; + #endif // SHARE_VM_GC_IMPLEMENTATION_SHARED_SUSPENDIBLETHREADSET_HPP
< prev index next >