annotate thread/Thread.h @ 189:e4a57215ddee

Fix compiler warnings with -Wall -Wextra
author Chris Cannam
date Mon, 28 Sep 2015 12:33:17 +0100
parents 5f88f517b637
children 701233f8ed41
rev   line source
cannam@62 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
cannam@62 2
cannam@62 3 /*
cannam@62 4 QM DSP Library
cannam@62 5
cannam@62 6 Centre for Digital Music, Queen Mary, University of London.
cannam@62 7 This file copyright Chris Cannam, used with permission.
cannam@62 8 */
cannam@62 9
cannam@62 10 #ifndef _THREAD_H_
cannam@62 11 #define _THREAD_H_
cannam@62 12
cannam@62 13 #ifdef _WIN32
cannam@62 14 #include <windows.h>
cannam@62 15 #else /* !_WIN32 */
cannam@62 16 #ifdef USE_PTHREADS
cannam@62 17 #include <pthread.h>
Chris@134 18 #else
Chris@134 19 #error Must have either _WIN32 or USE_PTHREADS defined
cannam@62 20 #endif /* USE_PTHREADS */
cannam@62 21 #endif /* !_WIN32 */
cannam@62 22
cannam@62 23 #include <string>
cannam@62 24
cannam@62 25 //#define DEBUG_THREAD 1
cannam@62 26 //#define DEBUG_MUTEX 1
cannam@62 27 //#define DEBUG_CONDITION 1
cannam@62 28
cannam@62 29 class Thread
cannam@62 30 {
cannam@62 31 public:
cannam@62 32 #ifdef _WIN32
cannam@62 33 typedef HANDLE Id;
cannam@62 34 #else
cannam@62 35 #ifdef USE_PTHREADS
cannam@62 36 typedef pthread_t Id;
cannam@62 37 #endif
cannam@62 38 #endif
cannam@62 39
cannam@62 40 Thread();
cannam@62 41 virtual ~Thread();
cannam@62 42
cannam@62 43 Id id();
cannam@62 44
cannam@62 45 void start();
cannam@62 46 void wait();
cannam@62 47
cannam@62 48 static bool threadingAvailable();
cannam@62 49
cannam@62 50 protected:
cannam@62 51 virtual void run() = 0;
cannam@62 52
cannam@62 53 private:
cannam@62 54 #ifdef _WIN32
cannam@62 55 HANDLE m_id;
cannam@62 56 bool m_extant;
cannam@62 57 static DWORD WINAPI staticRun(LPVOID lpParam);
cannam@62 58 #else
cannam@62 59 #ifdef USE_PTHREADS
cannam@62 60 pthread_t m_id;
cannam@62 61 bool m_extant;
cannam@62 62 static void *staticRun(void *);
cannam@62 63 #endif
cannam@62 64 #endif
cannam@62 65 };
cannam@62 66
cannam@62 67 class Mutex
cannam@62 68 {
cannam@62 69 public:
cannam@62 70 Mutex();
cannam@62 71 ~Mutex();
cannam@62 72
cannam@62 73 void lock();
cannam@62 74 void unlock();
cannam@62 75 bool trylock();
cannam@62 76
cannam@62 77 private:
cannam@62 78 #ifdef _WIN32
cannam@62 79 HANDLE m_mutex;
cannam@62 80 #ifndef NO_THREAD_CHECKS
cannam@62 81 DWORD m_lockedBy;
cannam@62 82 #endif
cannam@62 83 #else
cannam@62 84 #ifdef USE_PTHREADS
cannam@62 85 pthread_mutex_t m_mutex;
cannam@62 86 #ifndef NO_THREAD_CHECKS
cannam@62 87 pthread_t m_lockedBy;
cannam@62 88 bool m_locked;
cannam@62 89 #endif
cannam@62 90 #endif
cannam@62 91 #endif
cannam@62 92 };
cannam@62 93
cannam@62 94 class MutexLocker
cannam@62 95 {
cannam@62 96 public:
cannam@62 97 MutexLocker(Mutex *);
cannam@62 98 ~MutexLocker();
cannam@62 99
cannam@62 100 private:
cannam@62 101 Mutex *m_mutex;
cannam@62 102 };
cannam@62 103
cannam@62 104 class Condition
cannam@62 105 {
cannam@62 106 public:
cannam@62 107 Condition(std::string name);
cannam@62 108 ~Condition();
cannam@62 109
cannam@63 110 // Condition bundles a pthread-style condition variable and mutex
cannam@63 111 // into one class.
cannam@62 112
cannam@63 113 // To wait on a condition, call lock(), test termination variables
cannam@63 114 // as appropriate, and then wait(). The condition will be
cannam@63 115 // unlocked for the duration of the wait() call, which will end
cannam@63 116 // when the condition is signalled. The condition will be locked
cannam@63 117 // again when wait() returns.
cannam@63 118 //
cannam@63 119 // To signal a condition, call signal(). If the waiting thread
cannam@63 120 // will be performing tests between its own lock() and wait(),
cannam@63 121 // then the signalling thread should also lock() before it signals
cannam@63 122 // (and then unlock afterwards). If the signalling thread always
cannam@63 123 // locks the mutex during signalling, then the waiting thread
cannam@63 124 // knows that signals will only happen during wait() and not be
cannam@63 125 // missed at other times.
cannam@63 126
cannam@62 127 void lock();
cannam@62 128 void unlock();
cannam@62 129 void wait(int us = 0);
cannam@62 130
cannam@62 131 void signal();
cannam@62 132
cannam@62 133 private:
cannam@62 134
cannam@62 135 #ifdef _WIN32
cannam@62 136 HANDLE m_mutex;
cannam@62 137 HANDLE m_condition;
cannam@62 138 bool m_locked;
cannam@62 139 #else
cannam@62 140 #ifdef USE_PTHREADS
cannam@62 141 pthread_mutex_t m_mutex;
cannam@62 142 pthread_cond_t m_condition;
cannam@62 143 bool m_locked;
cannam@62 144 #endif
cannam@62 145 #endif
cannam@62 146 #ifdef DEBUG_CONDITION
cannam@62 147 std::string m_name;
cannam@62 148 #endif
cannam@62 149 };
cannam@62 150
cannam@62 151 #endif