Serenity Operating System
at master 51 lines 825 B view raw
1/* 2 * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <Kernel/ScopedCritical.h> 8 9#include <Kernel/Arch/Processor.h> 10 11namespace Kernel { 12 13ScopedCritical::ScopedCritical() 14{ 15 enter(); 16} 17 18ScopedCritical::~ScopedCritical() 19{ 20 if (m_valid) 21 leave(); 22} 23 24ScopedCritical::ScopedCritical(ScopedCritical&& from) 25 : m_valid(exchange(from.m_valid, false)) 26{ 27} 28 29ScopedCritical& ScopedCritical::operator=(ScopedCritical&& from) 30{ 31 if (&from != this) { 32 m_valid = exchange(from.m_valid, false); 33 } 34 return *this; 35} 36 37void ScopedCritical::leave() 38{ 39 VERIFY(m_valid); 40 m_valid = false; 41 Processor::leave_critical(); 42} 43 44void ScopedCritical::enter() 45{ 46 VERIFY(!m_valid); 47 m_valid = true; 48 Processor::enter_critical(); 49} 50 51}