/*
* Copyright ( c ) 2019 , Red Hat , Inc . 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 .
*
* This code is distributed in the hope that it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE . See the GNU General Public License
* version 2 for more details ( a copy is included in the LICENSE file that
* accompanied this code ) .
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work ; if not , write to the Free Software Foundation ,
* Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA .
*
* Please contact Oracle , 500 Oracle Parkway , Redwood Shores , CA 94065 USA
* or visit www . oracle . com if you need additional information or have any
* questions .
*
*/
#include "precompiled.hpp"
#include "runtime/os.hpp"
#include "gc/shenandoah/shenandoahLock.hpp"
#include "runtime/atomic.hpp"
#include "runtime/javaThread.hpp"
#include "runtime/os.inline.hpp"
ShenandoahSimpleLock::ShenandoahSimpleLock() {
assert(os::mutex_init_done(), "Too early!" );
}
void ShenandoahSimpleLock::lock() {
_lock.lock();
}
void ShenandoahSimpleLock::unlock() {
_lock.unlock();
}
ShenandoahReentrantLock::ShenandoahReentrantLock() :
ShenandoahSimpleLock(), _owner(NULL), _count(0 ) {
assert(os::mutex_init_done(), "Too early!" );
}
ShenandoahReentrantLock::~ShenandoahReentrantLock() {
assert(_count == 0 , "Unbalance" );
}
void ShenandoahReentrantLock::lock() {
Thread* const thread = Thread::current();
Thread* const owner = Atomic::load(&_owner);
if (owner != thread) {
ShenandoahSimpleLock::lock();
Atomic::store(&_owner, thread);
}
_count++;
}
void ShenandoahReentrantLock::unlock() {
assert(owned_by_self(), "Invalid owner" );
assert(_count > 0 , "Invalid count" );
_count--;
if (_count == 0 ) {
Atomic::store(&_owner, (Thread*)NULL);
ShenandoahSimpleLock::unlock();
}
}
bool ShenandoahReentrantLock::owned_by_self() const {
Thread* const thread = Thread::current();
Thread* const owner = Atomic::load(&_owner);
return owner == thread;
}
Messung V0.5 in Prozent C=90 H=95 G=92
¤ Dauer der Verarbeitung: 0.9 Sekunden
(vorverarbeitet am 2026-09-11)
¤
*© Formatika GbR, Deutschland