/usr/include/simgear/threads/SGThread.hxx is in libsimgear-dev 3.4.0-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 | // SGThread - Simple pthread class wrappers.
//
// Written by Bernie Bright, started April 2001.
//
// Copyright (C) 2001 Bernard Bright - bbright@bigpond.net.au
// Copyright (C) 2011 Mathias Froehlich
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef SGTHREAD_HXX_INCLUDED
#define SGTHREAD_HXX_INCLUDED 1
#include <simgear/compiler.h>
/**
* Encapsulate generic threading methods.
* Users derive a class from SGThread and implement the run() member function.
*/
class SGThread {
public:
/**
* Create a new thread object.
* When a SGThread object is created it does not begin execution
* immediately. It is started by calling the start() member function.
*/
SGThread();
/**
* Start the underlying thread of execution.
* @return Pthread error code if execution fails, otherwise returns 0.
*/
bool start();
/**
* Suspends the exection of the calling thread until this thread
* terminates.
*/
void join();
/**
*Retreive the current thread id.
*/
static long current( void );
protected:
/**
* Destroy a thread object.
* This is protected so that its illegal to simply delete a thread
* - it must return from its run() function.
*/
virtual ~SGThread();
/**
* All threads execute by deriving the run() method of SGThread.
* If this function terminates then the thread also terminates.
*/
virtual void run() = 0;
private:
// Disable copying.
SGThread(const SGThread&);
SGThread& operator=(const SGThread&);
struct PrivateData;
PrivateData* _privateData;
friend struct PrivateData;
};
class SGWaitCondition;
/**
* A mutex is used to protect a section of code such that at any time
* only a single thread can execute the code.
*/
class SGMutex {
public:
/**
* Create a new mutex.
* Under Linux this is a 'fast' mutex.
*/
SGMutex();
/**
* Destroy a mutex object.
* Note: it is the responsibility of the caller to ensure the mutex is
* unlocked before destruction occurs.
*/
~SGMutex();
/**
* Lock this mutex.
* If the mutex is currently unlocked, it becomes locked and owned by
* the calling thread. If the mutex is already locked by another thread,
* the calling thread is suspended until the mutex is unlocked. If the
* mutex is already locked and owned by the calling thread, the calling
* thread is suspended until the mutex is unlocked, effectively causing
* the calling thread to deadlock.
*/
void lock();
/**
* Unlock this mutex.
* It is assumed that the mutex is locked and owned by the calling thread.
*/
void unlock();
private:
struct PrivateData;
PrivateData* _privateData;
friend class SGWaitCondition;
};
/**
* A condition variable is a synchronization device that allows threads to
* suspend execution until some predicate on shared data is satisfied.
* A condition variable is always associated with a mutex to avoid race
* conditions.
*/
class SGWaitCondition {
public:
/**
* Create a new condition variable.
*/
SGWaitCondition();
/**
* Destroy the condition object.
*/
~SGWaitCondition();
/**
* Wait for this condition variable to be signaled.
*
* @param mutex Reference to a locked mutex.
*/
void wait(SGMutex& mutex);
/**
* Wait for this condition variable to be signaled for at most \a 'msec'
* milliseconds.
*
* @param mutex Reference to a locked mutex.
* @param msec Milliseconds to wait for a signal.
*
* @return
*/
bool wait(SGMutex& mutex, unsigned msec);
/**
* Wake one thread waiting on this condition variable.
* Nothing happens if no threads are waiting.
* If several threads are waiting exactly one thread is restarted. It
* is not specified which.
*/
void signal();
/**
* Wake all threads waiting on this condition variable.
* Nothing happens if no threads are waiting.
*/
void broadcast();
private:
// Disable copying.
SGWaitCondition(const SGWaitCondition&);
SGWaitCondition& operator=(const SGWaitCondition&);
struct PrivateData;
PrivateData* _privateData;
};
#endif /* SGTHREAD_HXX_INCLUDED */
|