diff options
author | Andreas Kling <awesomekling@gmail.com> | 2019-04-10 22:39:59 +0200 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-04-10 22:39:59 +0200 |
commit | d8e15457837e43a58c4f96d1ac3f1a5e9c973476 (patch) | |
tree | ab8e1b2c86806234707cb7958c2b38df1a798c12 /LibGUI | |
parent | ab1c84cf537123a939bd040cb2545909031a72ce (diff) | |
download | serenity-d8e15457837e43a58c4f96d1ac3f1a5e9c973476.zip |
LibCore: Move LibGUI/GLock to LibCore/CLock.
Diffstat (limited to 'LibGUI')
-rw-r--r-- | LibGUI/GLock.h | 103 |
1 files changed, 0 insertions, 103 deletions
diff --git a/LibGUI/GLock.h b/LibGUI/GLock.h deleted file mode 100644 index ad0f1c4995..0000000000 --- a/LibGUI/GLock.h +++ /dev/null @@ -1,103 +0,0 @@ -#pragma once - -#include <AK/Assertions.h> -#include <AK/Types.h> -#include <unistd.h> - -#define memory_barrier() asm volatile ("" ::: "memory") - -static inline dword CAS(volatile dword* mem, dword newval, dword oldval) -{ - dword ret; - asm volatile( - "cmpxchgl %2, %1" - :"=a"(ret), "+m"(*mem) - :"r"(newval), "0"(oldval) - :"cc", "memory"); - return ret; -} - -class GLock { -public: - GLock() { } - ~GLock() { } - - void lock(); - void unlock(); - -private: - volatile dword m_lock { 0 }; - dword m_level { 0 }; - int m_holder { -1 }; -}; - -class GLocker { -public: - [[gnu::always_inline]] inline explicit GLocker(GLock& l) : m_lock(l) { lock(); } - [[gnu::always_inline]] inline ~GLocker() { unlock(); } - [[gnu::always_inline]] inline void unlock() { m_lock.unlock(); } - [[gnu::always_inline]] inline void lock() { m_lock.lock(); } - -private: - GLock& m_lock; -}; - -[[gnu::always_inline]] inline void GLock::lock() -{ - for (;;) { - if (CAS(&m_lock, 1, 0) == 0) { - if (m_holder == -1 || m_holder == gettid()) { - m_holder = gettid(); - ++m_level; - memory_barrier(); - m_lock = 0; - return; - } - m_lock = 0; - } - donate(m_holder); - } -} - -inline void GLock::unlock() -{ - for (;;) { - if (CAS(&m_lock, 1, 0) == 0) { - ASSERT(m_holder == gettid()); - ASSERT(m_level); - --m_level; - if (m_level) { - memory_barrier(); - m_lock = 0; - return; - } - m_holder = -1; - memory_barrier(); - m_lock = 0; - return; - } - donate(m_holder); - } -} - -#define LOCKER(lock) GLocker locker(lock) - -template<typename T> -class GLockable { -public: - GLockable() { } - GLockable(T&& resource) : m_resource(move(resource)) { } - GLock& lock() { return m_lock; } - T& resource() { return m_resource; } - - T lock_and_copy() - { - LOCKER(m_lock); - return m_resource; - } - -private: - T m_resource; - GLock m_lock; -}; - |