/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Copyright 2018 Danny Robson */ #include "spinlock.hpp" #include "../debug.hpp" using cruft::thread::spinlock; /////////////////////////////////////////////////////////////////////////////// spinlock::spinlock (): held (false) { ; } //----------------------------------------------------------------------------- spinlock::spinlock (spinlock &&rhs) noexcept: held (rhs.held.load ()) { ; } /////////////////////////////////////////////////////////////////////////////// void spinlock::lock (void) { do { bool expected = false; if (held.compare_exchange_weak (expected, true)) return; while (held) __asm__ volatile ("pause"); } while (true); } //----------------------------------------------------------------------------- void spinlock::unlock (void) { CHECK (held); held = false; }