aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/hle/kernel/semaphore.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/kernel/semaphore.h')
-rw-r--r--src/core/hle/kernel/semaphore.h58
1 files changed, 40 insertions, 18 deletions
diff --git a/src/core/hle/kernel/semaphore.h b/src/core/hle/kernel/semaphore.h
index 8644ecf0..d8dc1fd7 100644
--- a/src/core/hle/kernel/semaphore.h
+++ b/src/core/hle/kernel/semaphore.h
@@ -4,29 +4,51 @@
#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 final : 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();
+ ~Semaphore() override;
+};
} // namespace