From 03f68b57a9c2152c2cebd8362bf049914f7cc079 Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Tue, 28 Jan 2014 22:19:59 +0100 Subject: [PATCH] Finalize code --- kernel/include/semaphore.hpp | 13 ++++++++----- kernel/include/spinlock.hpp | 2 +- kernel/include/stl/lock_guard.hpp | 11 +++++++++-- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/kernel/include/semaphore.hpp b/kernel/include/semaphore.hpp index 5081172b..4f9f9b19 100644 --- a/kernel/include/semaphore.hpp +++ b/kernel/include/semaphore.hpp @@ -8,22 +8,23 @@ #ifndef SEMAPHORE_H #define SEMAPHORE_H +#include "stl/vector.hpp" #include "stl/lock_guard.hpp" #include "spinlock.hpp" -#include "vector.hpp" +#include "scheduler.hpp" //TODO Implement a queue and use it for more fairness struct semaphore { private: spinlock lock; - std::size_t value; + size_t value; std::vector queue; public: - void init(std::size_t value) : value(value) { - //Nothing else to init + void init(size_t v){ + value = v; } void wait(){ @@ -43,9 +44,11 @@ public: if(queue.empty()){ ++value; } else { - auto pid = queue.pop_back(); + auto pid = queue.back(); scheduler::unblock_process(pid); + queue.pop_back(); + //No need to increment value, the process won't //decrement it } diff --git a/kernel/include/spinlock.hpp b/kernel/include/spinlock.hpp index b1872854..70ace491 100644 --- a/kernel/include/spinlock.hpp +++ b/kernel/include/spinlock.hpp @@ -14,7 +14,7 @@ private: public: void acquire(){ - asm volatile(".retry: ; lock bts [%0], 0; jc .retry" : : "m" (lock)); + asm volatile("1: ; lock bts [%0], 0; jc 1" : : "m" (lock)); } void release(){ diff --git a/kernel/include/stl/lock_guard.hpp b/kernel/include/stl/lock_guard.hpp index e4f11502..07e529d9 100644 --- a/kernel/include/stl/lock_guard.hpp +++ b/kernel/include/stl/lock_guard.hpp @@ -8,17 +8,24 @@ #ifndef LOCK_GUARD_HPP #define LOCK_GUARD_HPP +namespace std { + template struct lock_guard { Lock& lock; - lock_guard(Lock& lock) : lock(lock) { + explicit lock_guard(Lock& l) : lock(l) { lock.acquire(); } + lock_guard(const lock_guard&) = delete; + lock_guard& operator=(const lock_guard&) = delete; + ~lock_guard(){ lock.release(); } -} +}; + +} //End of namespace std #endif