| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright 2015 Google Inc. | 2  * Copyright 2015 Google Inc. | 
| 3  * | 3  * | 
| 4  * Use of this source code is governed by a BSD-style license that can be | 4  * Use of this source code is governed by a BSD-style license that can be | 
| 5  * found in the LICENSE file. | 5  * found in the LICENSE file. | 
| 6  */ | 6  */ | 
| 7 | 7 | 
| 8 #include "SkSemaphore.h" | 8 #include "SkSemaphore.h" | 
| 9 | 9 | 
| 10 #if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) | 10 #if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) | 
| 11     #include <mach/mach.h> | 11     #include <mach/mach.h> | 
| 12     struct SkSemaphore::OSSemaphore { | 12     struct SkSemaphore::OSSemaphore { | 
| 13         semaphore_t fSemaphore; | 13         semaphore_t fSemaphore; | 
| 14 | 14 | 
| 15         OSSemaphore()  { | 15         OSSemaphore()  { | 
| 16             semaphore_create(mach_task_self(), &fSemaphore, SYNC_POLICY_LIFO, 0/
    *initial count*/); | 16             semaphore_create(mach_task_self(), &fSemaphore, SYNC_POLICY_LIFO, 0/
    *initial count*/); | 
| 17         } | 17         } | 
| 18         ~OSSemaphore() { semaphore_destroy(mach_task_self(), fSemaphore); } | 18         ~OSSemaphore() { semaphore_destroy(mach_task_self(), fSemaphore); } | 
| 19 | 19 | 
| 20         void signal(int n) { while (n --> 0) { semaphore_signal(fSemaphore); } } | 20         void signal(int n) { while (n --> 0) { semaphore_signal(fSemaphore); } } | 
| 21         void wait() { semaphore_wait(fSemaphore); } | 21         void wait() { semaphore_wait(fSemaphore); } | 
| 22     }; | 22     }; | 
| 23 #elif defined(SK_BUILD_FOR_WIN32) | 23 #elif defined(SK_BUILD_FOR_WIN32) | 
| 24     struct SkSemaphore::OSSemaphore { | 24     struct SkSemaphore::OSSemaphore { | 
| 25         HANDLE fSemaphore; | 25         HANDLE fSemaphore; | 
| 26 | 26 | 
| 27         OSSemaphore()  { | 27         OSSemaphore()  { | 
| 28             fSemaphore = CreateSemaphore(NULL    /*security attributes, optional
    */, | 28             fSemaphore = CreateSemaphore(nullptr    /*security attributes, optio
    nal*/, | 
| 29                                          0       /*initial count*/, | 29                                          0       /*initial count*/, | 
| 30                                          MAXLONG /*max count*/, | 30                                          MAXLONG /*max count*/, | 
| 31                                          NULL    /*name, optional*/); | 31                                          nullptr    /*name, optional*/); | 
| 32         } | 32         } | 
| 33         ~OSSemaphore() { CloseHandle(fSemaphore); } | 33         ~OSSemaphore() { CloseHandle(fSemaphore); } | 
| 34 | 34 | 
| 35         void signal(int n) { | 35         void signal(int n) { | 
| 36             ReleaseSemaphore(fSemaphore, n, NULL/*returns previous count, option
    al*/); | 36             ReleaseSemaphore(fSemaphore, n, nullptr/*returns previous count, opt
    ional*/); | 
| 37         } | 37         } | 
| 38         void wait() { WaitForSingleObject(fSemaphore, INFINITE/*timeout in ms*/)
    ; } | 38         void wait() { WaitForSingleObject(fSemaphore, INFINITE/*timeout in ms*/)
    ; } | 
| 39     }; | 39     }; | 
| 40 #else | 40 #else | 
| 41     // It's important we test for Mach before this.  This code will compile but 
    not work there. | 41     // It's important we test for Mach before this.  This code will compile but 
    not work there. | 
| 42     #include <errno.h> | 42     #include <errno.h> | 
| 43     #include <semaphore.h> | 43     #include <semaphore.h> | 
| 44     struct SkSemaphore::OSSemaphore { | 44     struct SkSemaphore::OSSemaphore { | 
| 45         sem_t fSemaphore; | 45         sem_t fSemaphore; | 
| 46 | 46 | 
| (...skipping 30 matching lines...) Expand all  Loading... | 
| 77     } | 77     } | 
| 78 } | 78 } | 
| 79 | 79 | 
| 80 void SkSemaphore::wait() { | 80 void SkSemaphore::wait() { | 
| 81     // We only wait() on the OS semaphore if the count drops <= 0, | 81     // We only wait() on the OS semaphore if the count drops <= 0, | 
| 82     // i.e. when we need to make this thread sleep to wait for it to go back up. | 82     // i.e. when we need to make this thread sleep to wait for it to go back up. | 
| 83     if (fCount.fetch_add(-1, sk_memory_order_acquire) <= 0) { | 83     if (fCount.fetch_add(-1, sk_memory_order_acquire) <= 0) { | 
| 84         fOSSemaphore->wait(); | 84         fOSSemaphore->wait(); | 
| 85     } | 85     } | 
| 86 } | 86 } | 
| OLD | NEW | 
|---|