summaryrefslogtreecommitdiff
path: root/Kernel/ScopedCritical.cpp
diff options
context:
space:
mode:
authorTimon Kruiper <timonkruiper@gmail.com>2022-10-25 22:17:57 +0200
committerAndrew Kaster <andrewdkaster@gmail.com>2022-12-29 19:32:20 -0700
commitb18a7297c58a97fcfe501f7df0fb628125884278 (patch)
treecbe0ceb2a2ba3812f9857472ba58cf762cb1198c /Kernel/ScopedCritical.cpp
parent496a3cdcd300417e24bd520a0e0e603219544a22 (diff)
downloadserenity-b18a7297c58a97fcfe501f7df0fb628125884278.zip
Kernel: Move ScopedCritical.cpp to Kernel base directory
This file does not contain any architecture specific implementations, so we can move it to the Kernel base directory. Also update the relevant include paths.
Diffstat (limited to 'Kernel/ScopedCritical.cpp')
-rw-r--r--Kernel/ScopedCritical.cpp51
1 files changed, 51 insertions, 0 deletions
diff --git a/Kernel/ScopedCritical.cpp b/Kernel/ScopedCritical.cpp
new file mode 100644
index 0000000000..c97478c6d5
--- /dev/null
+++ b/Kernel/ScopedCritical.cpp
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <Kernel/ScopedCritical.h>
+
+#include <Kernel/Arch/Processor.h>
+
+namespace Kernel {
+
+ScopedCritical::ScopedCritical()
+{
+ enter();
+}
+
+ScopedCritical::~ScopedCritical()
+{
+ if (m_valid)
+ leave();
+}
+
+ScopedCritical::ScopedCritical(ScopedCritical&& from)
+ : m_valid(exchange(from.m_valid, false))
+{
+}
+
+ScopedCritical& ScopedCritical::operator=(ScopedCritical&& from)
+{
+ if (&from != this) {
+ m_valid = exchange(from.m_valid, false);
+ }
+ return *this;
+}
+
+void ScopedCritical::leave()
+{
+ VERIFY(m_valid);
+ m_valid = false;
+ Processor::leave_critical();
+}
+
+void ScopedCritical::enter()
+{
+ VERIFY(!m_valid);
+ m_valid = true;
+ Processor::enter_critical();
+}
+
+}