65 lines
1.4 KiB
C++
65 lines
1.4 KiB
C++
|
|
#pragma once
|
|
|
|
#ifndef MIJIN_ASYNC_TASK_MUTEX_HPP_INCLUDED
|
|
#define MIJIN_ASYNC_TASK_MUTEX_HPP_INCLUDED 1
|
|
|
|
#include "./coroutine.hpp"
|
|
#include "../internal/common.hpp"
|
|
|
|
namespace mijin
|
|
{
|
|
class [[nodiscard]] TaskMutexLock
|
|
{
|
|
private:
|
|
class TaskMutex* mutex_;
|
|
|
|
public:
|
|
explicit TaskMutexLock(class TaskMutex* mutex) MIJIN_NOEXCEPT : mutex_(mutex) {}
|
|
TaskMutexLock(const TaskMutexLock&) = delete;
|
|
TaskMutexLock(TaskMutexLock&& other) MIJIN_NOEXCEPT : mutex_(std::exchange(other.mutex_, nullptr)) {}
|
|
|
|
TaskMutexLock& operator=(const TaskMutexLock&) = delete;
|
|
inline TaskMutexLock& operator=(TaskMutexLock&& other) MIJIN_NOEXCEPT;
|
|
inline ~TaskMutexLock() MIJIN_NOEXCEPT;
|
|
};
|
|
|
|
class TaskMutex
|
|
{
|
|
private:
|
|
bool locked_ = false;
|
|
public:
|
|
Task<TaskMutexLock> c_lock()
|
|
{
|
|
while (locked_)
|
|
{
|
|
co_await c_suspend();
|
|
}
|
|
locked_ = true;
|
|
co_return TaskMutexLock(this);
|
|
}
|
|
[[nodiscard]] inline bool isLocked() const MIJIN_NOEXCEPT { return locked_; }
|
|
|
|
friend class TaskMutexLock;
|
|
};
|
|
|
|
TaskMutexLock::~TaskMutexLock() MIJIN_NOEXCEPT
|
|
{
|
|
if (mutex_)
|
|
{
|
|
mutex_->locked_ = false;
|
|
}
|
|
}
|
|
|
|
TaskMutexLock& TaskMutexLock::operator=(TaskMutexLock&& other) MIJIN_NOEXCEPT
|
|
{
|
|
if (mutex_)
|
|
{
|
|
mutex_->locked_ = false;
|
|
}
|
|
mutex_ = std::exchange(other.mutex_, nullptr);
|
|
return *this;
|
|
}
|
|
}
|
|
|
|
#endif // MIJIN_ASYNC_TASK_MUTEX_HPP_INCLUDED
|