File: Thread.h

package info (click to toggle)
tulip 4.8.0dfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 179,264 kB
  • ctags: 64,517
  • sloc: cpp: 600,444; ansic: 36,311; makefile: 22,136; python: 1,304; sh: 946; yacc: 522; xml: 337; pascal: 157; php: 66; lex: 55
file content (163 lines) | stat: -rw-r--r-- 3,941 bytes parent folder | download | duplicates (2)
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
/*
 * $Revision: 3504 $
 *
 * last checkin:
 *   $Author: beyer $
 *   $Date: 2013-05-16 14:49:39 +0200 (Thu, 16 May 2013) $
 ***************************************************************/

/** \file
 * \brief Declaration of Thread class representing threads.
 *
 * \author Carsten Gutwenger
 *
 * \par License:
 * This file is part of the Open Graph Drawing Framework (OGDF).
 *
 * \par
 * Copyright (C)<br>
 * See README.txt in the root directory of the OGDF installation for details.
 *
 * \par
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * Version 2 or 3 as published by the Free Software Foundation;
 * see the file LICENSE.txt included in the packaging of this file
 * for details.
 *
 * \par
 * 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.
 *
 * \par
 * 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.
 *
 * \see  http://www.gnu.org/copyleft/gpl.html
 ***************************************************************/


#ifdef _MSC_VER
#pragma once
#endif


#ifndef OGDF_THREAD_H
#define OGDF_THREAD_H

#include <ogdf/basic/basic.h>


#ifdef OGDF_SYSTEM_WINDOWS
#include <process.h>

#if _WIN32_WINNT >= 0x0600
#define OGDF_USE_THREAD_POOL
#endif

#else
#include <pthread.h>
#endif


namespace ogdf {


//! Base class for threads.
class Thread
{
	friend class Initialization;

#ifdef OGDF_USE_THREAD_POOL
	static void initPool();
	static void cleanupPool();
#endif

public:

	//! Initializes a thread, but does not create a system thread yet.
	Thread();

	//! Destructor. Frees resources.
	virtual ~Thread();

	//! Returns the ID of the system thread associated with the thread object.
	long threadID() const;

	//! Returns whether the thread has been started (i.e. a system thread is currently associated with the thread object).
	bool started() const;

	//! Sets the CPU affinity mask of the thread to \a mask.
	__uint64 cpuAffinity(__uint64 mask);

	//! Starts execution of the thread.
	void start();

	//! Waits until the thread has finished.
	void join();

	//! Waits until the thread has finished or the time-out interval of \a milliseconds elapses.
	/**
	 * @param milliseconds is the time-out interval in milliseconds.
	 * @return true if the thread has finished or false if the time-out interval has elapsed.
	 */
	bool join(unsigned long milliseconds);

protected:
	//! The actual work perfomed by the thread. Must be defined by derived classes.
	virtual void doWork() = 0;

private:

#ifdef OGDF_SYSTEM_WINDOWS

#ifdef OGDF_USE_THREAD_POOL
	struct PoolThreadData;

	static SRWLOCK s_poolLock;
	static int s_numPoolThreads;
	static int s_numSleepingThreads;
	static int s_maxNumPoolThreads;

	static PoolThreadData **s_poolThreads;
	static PoolThreadData **s_sleepingThreads;

	PoolThreadData *m_poolThread;	//!< associated pool thread (0 if no pool thread is used)
#endif

	HANDLE          m_handle;		//!< thread handle (0 if pool thread)
	unsigned int    m_id;			//!< thread id (0 if pool thread)
	HANDLE          m_evFinished;	//!< event which is signaled by thread when work is finished

	HANDLE getThreadHandle();

	//! Thread procedure for normal threads; \a pParam points to the Thread object.
	static unsigned int __stdcall threadProc(void *pParam);

#ifdef OGDF_USE_THREAD_POOL
	//! Thread procedure for pool threads; \a pParam points to the PoolThreadData object.
	static unsigned int __stdcall poolThreadProc(void *pParam);
#endif


#else

	static void *threadProc(void *pParam);

	pthread_t m_pt;

#endif

	OGDF_NEW_DELETE

};


} // end namespace ogdf


#endif