diff --git a/headers/private/shared/ScopeExit.h b/headers/private/shared/ScopeExit.h new file mode 100644 index 0000000000..99c41b3233 --- /dev/null +++ b/headers/private/shared/ScopeExit.h @@ -0,0 +1,43 @@ +/* + * Copyright 2022, Haiku, Inc. All Rights Reserved. + * Distributed under the terms of the MIT License. + */ +#ifndef _SCOPE_EXIT_H +#define _SCOPE_EXIT_H + + +#if __cplusplus < 201103L +#error This file requires compiler support for the C++11 standard. +#endif + + +#include + + +template +class ScopeExit +{ +public: + explicit ScopeExit(F&& fn) : fFn(fn) + { + } + + ~ScopeExit() + { + fFn(); + } + + ScopeExit(ScopeExit&& other) : fFn(std::move(other.fFn)) + { + } + +private: + ScopeExit(const ScopeExit&); + ScopeExit& operator=(const ScopeExit&); + +private: + F fFn; +}; + + +#endif // _SCOPE_EXIT_H diff --git a/src/system/kernel/arch/riscv64/arch_int.cpp b/src/system/kernel/arch/riscv64/arch_int.cpp index ed259207d7..df160a3e59 100644 --- a/src/system/kernel/arch/riscv64/arch_int.cpp +++ b/src/system/kernel/arch/riscv64/arch_int.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include "RISCV64VMTranslationMap.h" #include @@ -354,40 +355,6 @@ SetAccessedFlags(addr_t addr, bool isWrite) } -// TODO: needs moved into an arch-agnostic location? - -template -class ScopeExit -{ -public: - explicit ScopeExit(F&& fn) : fFn(fn) - { - } - - ~ScopeExit() - { - fFn(); - } - - ScopeExit(ScopeExit&& other) : fFn(std::move(other.fFn)) - { - } - -private: - ScopeExit(const ScopeExit&); - ScopeExit& operator=(const ScopeExit&); - -private: - F fFn; -}; - -template -ScopeExit MakeScopeExit(F&& fn) -{ - return ScopeExit(std::move(fn)); -} - - extern "C" void STrap(iframe* frame) { @@ -428,7 +395,7 @@ STrap(iframe* frame) thread_get_current_thread()->arch_info.oldA0 = frame->a0; thread_at_kernel_entry(system_time()); } - const auto& kernelExit = MakeScopeExit([&]() { + const auto& kernelExit = ScopeExit([&]() { if (SstatusReg(frame->status).spp == modeU) { disable_interrupts(); atomic_and(&thread_get_current_thread()->flags, ~THREAD_FLAGS_SYSCALL_RESTARTED);