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
|