< prev index next >

src/hotspot/share/gc/shared/barrierSet.cpp

Print this page
rev 52911 : imported patch no_early_njt

*** 24,74 **** #include "precompiled.hpp" #include "gc/shared/barrierSet.hpp" #include "gc/shared/barrierSetAssembler.hpp" #include "runtime/thread.hpp" #include "utilities/macros.hpp" BarrierSet* BarrierSet::_barrier_set = NULL; - class SetBarrierSetNonJavaThread : public ThreadClosure { - BarrierSet* _barrier_set; - size_t _count; - - public: - SetBarrierSetNonJavaThread(BarrierSet* barrier_set) : - _barrier_set(barrier_set), _count(0) {} - - virtual void do_thread(Thread* thread) { - _barrier_set->on_thread_create(thread); - ++_count; - } - - size_t count() const { return _count; } - }; - void BarrierSet::set_barrier_set(BarrierSet* barrier_set) { assert(_barrier_set == NULL, "Already initialized"); _barrier_set = barrier_set; ! // Some threads are created before the barrier set, so the call to ! // BarrierSet::on_thread_create had to be deferred for them. Now that ! // we have the barrier set, do those deferred calls. ! ! // First do any non-JavaThreads. ! SetBarrierSetNonJavaThread njt_closure(_barrier_set); ! Threads::non_java_threads_do(&njt_closure); ! ! // Do the current (main) thread. Ensure it's the one and only ! // JavaThread so far. Also verify that it isn't yet on the thread // list, else we'd also need to call BarrierSet::on_thread_attach. assert(Thread::current()->is_Java_thread(), "Expected main thread to be a JavaThread"); - assert((njt_closure.count() + 1) == Threads::threads_before_barrier_set(), - "Unexpected JavaThreads before barrier set initialization: " - "Non-JavaThreads: " SIZE_FORMAT ", all: " SIZE_FORMAT, - njt_closure.count(), Threads::threads_before_barrier_set()); assert(!JavaThread::current()->on_thread_list(), "Main thread already on thread list."); _barrier_set->on_thread_create(Thread::current()); } --- 24,51 ---- #include "precompiled.hpp" #include "gc/shared/barrierSet.hpp" #include "gc/shared/barrierSetAssembler.hpp" #include "runtime/thread.hpp" + #include "utilities/debug.hpp" #include "utilities/macros.hpp" BarrierSet* BarrierSet::_barrier_set = NULL; void BarrierSet::set_barrier_set(BarrierSet* barrier_set) { assert(_barrier_set == NULL, "Already initialized"); _barrier_set = barrier_set; ! // Notify barrier set of the current (main) thread. Normally the ! // Thread constructor deals with this, but the main thread is ! // created before we get here. Verify it isn't yet on the thread // list, else we'd also need to call BarrierSet::on_thread_attach. + // This is the only thread that can exist at this point; the Thread + // constructor objects to other threads being created before the + // barrier set is available. assert(Thread::current()->is_Java_thread(), "Expected main thread to be a JavaThread"); assert(!JavaThread::current()->on_thread_list(), "Main thread already on thread list."); _barrier_set->on_thread_create(Thread::current()); }
< prev index next >