aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/hle/kernel/semaphore.h
diff options
context:
space:
mode:
authorGravatar Yuri Kunde Schlesner <yuriks@yuriks.net>2015-01-11 13:53:11 -0200
committerGravatar Yuri Kunde Schlesner <yuriks@yuriks.net>2015-01-30 11:47:05 -0200
commitd9b19be1d9c1baa5e8b92c1960c14e435e6b532f (patch)
treeda083beea826952f0a9c07ab392992ef6ca84c5c /src/core/hle/kernel/semaphore.h
parent4bb33dfc30768c536d3f0ffb980464b1ab2d25d9 (diff)
Kernel: Convert Semaphore to not use Handles
Diffstat (limited to 'src/core/hle/kernel/semaphore.h')
-rw-r--r--src/core/hle/kernel/semaphore.h57
1 files changed, 39 insertions, 18 deletions
diff --git a/src/core/hle/kernel/semaphore.h b/src/core/hle/kernel/semaphore.h
index 8644ecf0..b7f22b86 100644
--- a/src/core/hle/kernel/semaphore.h
+++ b/src/core/hle/kernel/semaphore.h
@@ -4,29 +4,50 @@
#pragma once
+#include <queue>
+#include <string>
+
#include "common/common_types.h"
#include "core/hle/kernel/kernel.h"
namespace Kernel {
-/**
- * Creates a semaphore.
- * @param handle Pointer to the handle of the newly created object
- * @param initial_count Number of slots reserved for other threads
- * @param max_count Maximum number of slots the semaphore can have
- * @param name Optional name of semaphore
- * @return ResultCode of the error
- */
-ResultCode CreateSemaphore(Handle* handle, s32 initial_count, s32 max_count, const std::string& name = "Unknown");
-
-/**
- * Releases a certain number of slots from a semaphore.
- * @param count The number of free slots the semaphore had before this call
- * @param handle The handle of the semaphore to release
- * @param release_count The number of slots to release
- * @return ResultCode of the error
- */
-ResultCode ReleaseSemaphore(s32* count, Handle handle, s32 release_count);
+class Semaphore : public WaitObject {
+public:
+ /**
+ * Creates a semaphore.
+ * @param handle Pointer to the handle of the newly created object
+ * @param initial_count Number of slots reserved for other threads
+ * @param max_count Maximum number of slots the semaphore can have
+ * @param name Optional name of semaphore
+ * @return The created semaphore
+ */
+ static ResultVal<SharedPtr<Semaphore>> Create(s32 initial_count, s32 max_count,
+ std::string name = "Unknown");
+
+ std::string GetTypeName() const override { return "Semaphore"; }
+ std::string GetName() const override { return name; }
+
+ static const HandleType HANDLE_TYPE = HandleType::Semaphore;
+ HandleType GetHandleType() const override { return HANDLE_TYPE; }
+
+ s32 max_count; ///< Maximum number of simultaneous holders the semaphore can have
+ s32 available_count; ///< Number of free slots left in the semaphore
+ std::string name; ///< Name of semaphore (optional)
+
+ bool ShouldWait() override;
+ void Acquire() override;
+
+ /**
+ * Releases a certain number of slots from a semaphore.
+ * @param release_count The number of slots to release
+ * @return The number of free slots the semaphore had before this call
+ */
+ ResultVal<s32> Release(s32 release_count);
+
+private:
+ Semaphore() = default;
+};
} // namespace