summaryrefslogtreecommitdiffstats
path: root/src/core/hle/kernel/k_light_lock.h
blob: 626f57596f12c1087762d41afe8e6463f7cd2f18 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later

#pragma once

#include <atomic>

#include "core/hle/kernel/k_scoped_lock.h"

namespace Kernel {

class KernelCore;

class KLightLock {
public:
    explicit KLightLock(KernelCore& kernel) : m_kernel{kernel} {}

    void Lock();

    void Unlock();

    bool LockSlowPath(uintptr_t owner, uintptr_t cur_thread);

    void UnlockSlowPath(uintptr_t cur_thread);

    bool IsLocked() const {
        return m_tag.load() != 0;
    }

    bool IsLockedByCurrentThread() const;

private:
    std::atomic<uintptr_t> m_tag{};
    KernelCore& m_kernel;
};

using KScopedLightLock = KScopedLock<KLightLock>;

} // namespace Kernel