1 /////////////////////////////////////////////////////////////////////////// 2 // 3 // Copyright (c) 2005, Industrial Light & Magic, a division of Lucas 4 // Digital Ltd. LLC 5 // 6 // All rights reserved. 7 // 8 // Redistribution and use in source and binary forms, with or without 9 // modification, are permitted provided that the following conditions are 10 // met: 11 // * Redistributions of source code must retain the above copyright 12 // notice, this list of conditions and the following disclaimer. 13 // * Redistributions in binary form must reproduce the above 14 // copyright notice, this list of conditions and the following disclaimer 15 // in the documentation and/or other materials provided with the 16 // distribution. 17 // * Neither the name of Industrial Light & Magic nor the names of 18 // its contributors may be used to endorse or promote products derived 19 // from this software without specific prior written permission. 20 // 21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 // 33 /////////////////////////////////////////////////////////////////////////// 34 35 #ifndef INCLUDED_ILM_THREAD_SEMAPHORE_H 36 #define INCLUDED_ILM_THREAD_SEMAPHORE_H 37 38 //----------------------------------------------------------------------------- 39 // 40 // class Semaphore -- a wrapper class for 41 // system-dependent counting semaphores 42 // 43 //----------------------------------------------------------------------------- 44 45 #include "IlmBaseConfig.h" 46 47 #if defined _WIN32 || defined _WIN64 48 #ifdef NOMINMAX 49 #undef NOMINMAX 50 #endif 51 #define NOMINMAX 52 #include <windows.h> 53 #elif HAVE_PTHREAD && !HAVE_POSIX_SEMAPHORES 54 #include <pthread.h> 55 #elif HAVE_PTHREAD && HAVE_POSIX_SEMAPHORES 56 #include <semaphore.h> 57 #endif 58 59 namespace IlmThread { 60 61 62 class Semaphore 63 { 64 public: 65 66 Semaphore (unsigned int value = 0); 67 virtual ~Semaphore(); 68 69 void wait(); 70 bool tryWait(); 71 void post(); 72 int value() const; 73 74 private: 75 76 #if defined _WIN32 || defined _WIN64 77 78 mutable HANDLE _semaphore; 79 80 #elif HAVE_PTHREAD && !HAVE_POSIX_SEMAPHORES 81 82 // 83 // If the platform has Posix threads but no semapohores, 84 // then we implement them ourselves using condition variables 85 // 86 87 struct sema_t 88 { 89 unsigned int count; 90 unsigned long numWaiting; 91 pthread_mutex_t mutex; 92 pthread_cond_t nonZero; 93 }; 94 95 mutable sema_t _semaphore; 96 97 #elif HAVE_PTHREAD && HAVE_POSIX_SEMAPHORES 98 99 mutable sem_t _semaphore; 100 101 #endif 102 103 void operator = (const Semaphore& s); // not implemented 104 Semaphore (const Semaphore& s); // not implemented 105 }; 106 107 108 } // namespace IlmThread 109 110 #endif 111