소스 검색

semaphore: More changes for Switch.

bunnei 8 년 전
부모
커밋
4e33b4b42f
2개의 변경된 파일17개의 추가작업 그리고 11개의 파일을 삭제
  1. 13 7
      src/core/hle/kernel/semaphore.cpp
  2. 4 4
      src/core/hle/kernel/semaphore.h

+ 13 - 7
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

+ 4 - 4
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();