[go: up one dir, main page]

Menu

[ab7a0e]: / libgnuworld / gThread.h  Maximize  Restore  History

Download this file

179 lines (147 with data), 4.4 kB

  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
/**
* gThread.h
* Copyright (C) 2002 Daniel Karrels <dan@karrels.com>
*
* 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*
* $Id: gThread.h,v 1.5 2003/12/29 23:59:36 dan_karrels Exp $
*/
#ifndef __GTHREAD_H
#define __GTHREAD_H "$Id: gThread.h,v 1.5 2003/12/29 23:59:36 dan_karrels Exp $"
#include <pthread.h>
#include <map>
#include <string>
#include "misc.h"
namespace gnuworld
{
/**
* The base class for creating a thread.
* Simply subclass this class and overload the Exec()
* method, and call Start() to have a running thread.
* Once started, each thread is responsible for monitoring
* this object's 'keepRunning' variable. It should
* poll this variable (note: do not block indefinitely)
* and return from its Exec() method when keepRunning
* is set to false; this indicates that a Stop() request
* has been issued.
*/
class gThread
{
protected:
/**
* The type used to store mutexes.
*/
typedef std::map< std::string, pthread_mutex_t, noCaseCompare >
mutexMapType ;
/**
* The iterator type to the mutex map.
*/
typedef mutexMapType::iterator mutexIterator ;
/**
* The const_iterator type to the mutex map.
*/
typedef mutexMapType::const_iterator constMutexIterator ;
public:
/**
* Default constructor.
*/
gThread() ;
/**
* The destructor will stop the thread, issue a join(), and
* destroy any mutexes.
*/
virtual ~gThread() ;
/**
* Invoke this method to begin the Exec() method in a new
* thread.
*/
virtual bool Start() ;
/**
* Return true if this thread is running, false otherwise.
*/
virtual bool isRunning() const
{ return (keepRunning && (threadID != 0)) ; }
/**
* Request that this thread stop processing. This could take
* an arbitrary length of time to fully stop, depending on how
* well the thread subclass follows directions (see above).
*/
virtual void Stop()
{ keepRunning = false ; }
/**
* Issue a pthread_join() on this (already stopped) thread to
* cleanup.
*/
virtual void Join() ;
/**
* Create a mutex with the given case insensitive name.
* True is returned if successfull, false otherwise.
*/
virtual bool CreateMutex( const std::string& mutexName ) ;
/**
* Destroy a mutex with the given case insensitive name.
* True is returned if successfull, false otherwise.
*/
virtual bool DestroyMutex( const std::string& mutexName ) ;
/**
* Destroy all active mutexes.
*/
virtual void DestroyAllMutexes() ;
/**
* Locks the mutex specified by mutexName.
* This method blocks indefinitely until the lock is obtained.
*/
virtual void LockMutex( const std::string& mutexName )
;
/**
* Unlocks the mutex specified by mutexName.
* This method will return immediately.
*/
virtual void UnLockMutex( const std::string& mutexName ) ;
/**
* This method is invoked in a new thread when the Start()
* method is invoked. Subclasses must overload this method
* to perform the meaningful duty of the thread proper.
* This method must halt when keepRunning is set to false.
*/
virtual void Exec() {}
protected:
/**
* The running status of the thread. Subclasses must honor
* the value of this variable.
*/
bool keepRunning ;
/**
* True if shutdown has completed (keepRunning request has
* been honored), and it is clear to issue a join(), false
* otherwise.
*/
bool isShutdownComplete ;
/**
* The thread ID for this thread, 0 if not running.
*/
pthread_t threadID ;
/**
* The container used to store the active mutexes.
*/
mutexMapType mutexMap ;
/**
* A general purpose mutex on which to wait.
*/
pthread_mutex_t waitMutex ;
} ; // class gThread
} // namespace gnuworld
#endif // __GTHREAD_H