diff options
| author | bunnei <bunneidev@gmail.com> | 2018-01-07 16:52:23 -0500 | 
|---|---|---|
| committer | bunnei <bunneidev@gmail.com> | 2018-01-07 16:52:23 -0500 | 
| commit | 4e33b4b42f404ff6250df15f1a48ed96ce839b77 (patch) | |
| tree | ea823ee6866e9c9a2e694d0e58c63ddb43ecf92f | |
| parent | 0f6fbdb9632d4d67695b4f151884434b91441782 (diff) | |
semaphore: More changes for Switch.
| -rw-r--r-- | src/core/hle/kernel/semaphore.cpp | 20 | ||||
| -rw-r--r-- | src/core/hle/kernel/semaphore.h | 8 | 
2 files changed, 17 insertions, 11 deletions
diff --git a/src/core/hle/kernel/semaphore.cpp b/src/core/hle/kernel/semaphore.cpp index 3f364661b..9c58aa42f 100644 --- a/src/core/hle/kernel/semaphore.cpp +++ b/src/core/hle/kernel/semaphore.cpp @@ -14,7 +14,8 @@ namespace Kernel {  Semaphore::Semaphore() {}  Semaphore::~Semaphore() {} -ResultVal<SharedPtr<Semaphore>> Semaphore::Create(VAddr guest_addr, VAddr mutex_addr, std::string name) { +ResultVal<SharedPtr<Semaphore>> Semaphore::Create(VAddr guest_addr, VAddr mutex_addr, +                                                  std::string name) {      SharedPtr<Semaphore> semaphore(new Semaphore);      // When the semaphore is created, some slots are reserved for other threads, @@ -37,23 +38,28 @@ bool Semaphore::ShouldWait(Thread* thread) const {  void Semaphore::Acquire(Thread* thread) {      if (available_count <= 0)          return; +      --available_count;      UpdateGuestState();  } -ResultVal<s32> Semaphore::Release(s32 release_count) { -    s32 previous_count = available_count; -    available_count += release_count; +ResultCode Semaphore::Release(s32 target) { +    ++available_count;      UpdateGuestState(); -    WakeupAllWaitingThreads(); +    if (target == -1) { +        // When -1, wake up all waiting threads +        WakeupAllWaitingThreads(); +    } else { +        // Otherwise, wake up just a single thread +        WakeupWaitingThread(GetHighestPriorityReadyThread()); +    } -    return MakeResult<s32>(previous_count); +    return RESULT_SUCCESS;  }  void Semaphore::UpdateGuestState() {      Memory::Write32(guest_addr, available_count);  } -  } // namespace Kernel diff --git a/src/core/hle/kernel/semaphore.h b/src/core/hle/kernel/semaphore.h index 9cad4450a..e80230cac 100644 --- a/src/core/hle/kernel/semaphore.h +++ b/src/core/hle/kernel/semaphore.h @@ -50,11 +50,11 @@ public:      void Acquire(Thread* thread) 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 +     * Releases a slot from a semaphore. +     * @param target The number of threads to wakeup, -1 is all. +     * @return ResultCode indicating if the operation succeeded.       */ -    ResultVal<s32> Release(s32 release_count); +    ResultCode Release(s32 target);  private:      Semaphore();  | 
