// // Created by Stepan Usatiuk on 20.08.2023. // #ifndef FICUS_MUTEX_H #define FICUS_MUTEX_H #include #include #include #include "List.hpp" #include "Spinlock.hpp" struct Task; struct TaskListNode; class Mutex { public: Mutex() = default; void lock(); // void spin_lock(); bool try_lock(); void unlock(); // Same as unlock, but assumes scheduler lock is taken void unlock_nolock(); bool test(); Task *owner() { return _owner; } private: std::atomic locked = false; List waiters; Spinlock waiters_lock; Task *_owner = nullptr; uint8_t spin_success = 127; }; #endif //FICUS_MUTEX_H