aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/hle/kernel/semaphore.cpp
diff options
context:
space:
mode:
authorGravatar Subv <subv2112@gmail.com>2014-12-12 20:46:52 -0500
committerGravatar Subv <subv2112@gmail.com>2014-12-13 13:40:16 -0500
commit5e259862352eaef61567ee33b7d68f2f268344b5 (patch)
tree3d512289130ceffa57db31db41d3781c5a753103 /src/core/hle/kernel/semaphore.cpp
parentcc81a510e3ab61786f83df1cb2e55a0b29b7eefb (diff)
Kernel/Semaphores: Addressed some issues.
Diffstat (limited to 'src/core/hle/kernel/semaphore.cpp')
-rw-r--r--src/core/hle/kernel/semaphore.cpp41
1 files changed, 13 insertions, 28 deletions
diff --git a/src/core/hle/kernel/semaphore.cpp b/src/core/hle/kernel/semaphore.cpp
index 216c9783..f7a895c3 100644
--- a/src/core/hle/kernel/semaphore.cpp
+++ b/src/core/hle/kernel/semaphore.cpp
@@ -27,11 +27,11 @@ public:
std::string name; ///< Name of semaphore (optional)
/**
- * Tests whether a semaphore is at its peak capacity
- * @return Whether the semaphore is full
+ * Tests whether a semaphore still has free slots
+ * @return Whether the semaphore is available
*/
- bool IsFull() const {
- return current_usage == max_count;
+ bool IsAvailable() const {
+ return current_usage < max_count;
}
ResultVal<bool> WaitSynchronization() override {
@@ -50,42 +50,27 @@ public:
////////////////////////////////////////////////////////////////////////////////////////////////////
-/**
- * Creates a semaphore
- * @param initial_count number of slots reserved for other threads
- * @param max_count maximum number of holders the semaphore can have
- * @param name Optional name of semaphore
- * @return Handle for the newly created semaphore
- */
-Handle CreateSemaphore(u32 initial_count,
+ResultCode CreateSemaphore(Handle* handle, u32 initial_count,
u32 max_count, const std::string& name) {
+ if (initial_count > max_count)
+ return ResultCode(ErrorDescription::InvalidCombination, ErrorModule::Kernel,
+ ErrorSummary::WrongArgument, ErrorLevel::Permanent);
+
Semaphore* semaphore = new Semaphore;
- Handle handle = g_object_pool.Create(semaphore);
+ *handle = g_object_pool.Create(semaphore);
semaphore->initial_count = initial_count;
// When the semaphore is created, some slots are reserved for other threads,
// and the rest is reserved for the caller thread
- semaphore->max_count = semaphore->current_usage = max_count;
- semaphore->current_usage -= initial_count;
+ semaphore->max_count = max_count;
+ semaphore->current_usage = max_count - initial_count;
semaphore->name = name;
- return handle;
-}
-
-ResultCode CreateSemaphore(Handle* handle, u32 initial_count,
- u32 max_count, const std::string& name) {
-
- if (initial_count > max_count)
- return ResultCode(ErrorDescription::InvalidCombination, ErrorModule::Kernel,
- ErrorSummary::WrongArgument, ErrorLevel::Permanent);
- *handle = CreateSemaphore(initial_count, max_count, name);
-
return RESULT_SUCCESS;
}
ResultCode ReleaseSemaphore(s32* count, Handle handle, s32 release_count) {
-
Semaphore* semaphore = g_object_pool.Get<Semaphore>(handle);
if (semaphore == nullptr)
return InvalidHandle(ErrorModule::Kernel);
@@ -99,7 +84,7 @@ ResultCode ReleaseSemaphore(s32* count, Handle handle, s32 release_count) {
// Notify some of the threads that the semaphore has been released
// stop once the semaphore is full again or there are no more waiting threads
- while (!semaphore->waiting_threads.empty() && !semaphore->IsFull()) {
+ while (!semaphore->waiting_threads.empty() && semaphore->IsAvailable()) {
Kernel::ResumeThreadFromWait(semaphore->waiting_threads.front());
semaphore->waiting_threads.pop();
semaphore->current_usage++;