📄 ecosthreadutils.h
字号:
//####COPYRIGHTBEGIN####
//
// ----------------------------------------------------------------------------
// Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
//
// This program is part of the eCos host tools.
//
// 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.
//
// ----------------------------------------------------------------------------
//
//####COPYRIGHTEND####
//=================================================================
//
// eCosThreadUtils.h
//
//
//=================================================================
//=================================================================
//#####DESCRIPTIONBEGIN####
//
// Author(s): sdf
// Contributors: sdf
// Date: 1999-04-01
// Description: Threading-related utiltities
// Usage:
//
//####DESCRIPTIONEND####
#ifndef _ECOSTHREADUTILS_H
#define _ECOSTHREADUTILS_H
#include "eCosStd.h"
#include "Collections.h"
#ifndef _WIN32 // UNIX
#ifndef NO_THREADS
#include <pthread.h>
#endif
#endif
//=================================================================
// This class handles threads in a host-independent manner.
// It also contains a few thread-related functions such as Sleep
//=================================================================
class CeCosThreadUtils {
public:
#ifdef _WIN32
typedef DWORD THREAD_ID;
#else // UNIX
#ifndef NO_THREADS
typedef int THREAD_ID;
#else
typedef pthread_t THREAD_ID;
#endif
#endif
static THREAD_ID GetThreadId(); // Get my current thread ID, mostly for debugging
// CS supports a single system-wide critical sections (recursive mutexes).
// You are expected to use macros ENTERCRITICAL and LEAVECRITICAL to use this class - these macros define
// a block containing a CS object, which has the effect of creating a critical section.
// Exit from the block (by whatever means, including an exception) causes the CS dtor
// to be called so as to release the section.
class CS{
public:
static bool InCriticalSection(); // This thread owns the critical section
CS();
virtual ~CS();
protected:
static int m_nCriticalSectionLock; // The number of times the recursive mutex has been locked. Management of this allows us to avoid use of true recursive mutexes on UNIX.
static THREAD_ID nCSOwner; // The thread owning the resource.
#ifdef _WIN32
static CRITICAL_SECTION cs; // The one and only critical section
static bool bCSInitialized;
#else // UNIX
#ifndef NO_THREADS
static pthread_mutex_t cs; // The one and only critical section
#endif
#endif
};
#define ENTERCRITICAL {CeCosThreadUtils::CS c
#define LEAVECRITICAL }
static int AtomicIncrement (int &n); // return old value
static int AtomicDecrement (int &n); // return old value
// Wait for this boolean to become true, subject to the given timeout
// If the timeout happens first, the return code will be false - otherwise true
static bool WaitFor (bool &b, int dTimeout=0x7fffffff);
///////////////////////////////////////////////////////////////////////////
// Define the characteristics of a callback procedure:
// A callback procedure, used both for thread entry points and thread completion callbacks
typedef void (CALLBACK CallbackProc)(void *);
// Run a thread: pThreadFunc is the entry point (passed pParam). No notification of completion.
static bool RunThread(CallbackProc *pThreadFunc, void *pParam, LPCTSTR pszName=_T("")) { return RunThread(pThreadFunc,pParam,0,0,pszName); }
// Run a thread, setting the bool on completion
static bool RunThread(CallbackProc *pThreadFunc, void *pParam, bool *pb, LPCTSTR pszName=_T("")) { *pb=false; return RunThread(pThreadFunc,pParam,0,pb,pszName); }
// Run a thread, calling the callback on completion
static bool RunThread(CallbackProc *pThreadFunc, void *pParam, CallbackProc *pCompletionFunc, LPCTSTR pszName=_T("")) { return RunThread(pThreadFunc,pParam,pCompletionFunc,pParam,pszName); }
static void Sleep (int nMsec);
protected:
// Run a thread: arbitrary callbcak
static bool RunThread(CallbackProc *pThreadFunc, void *pParam, CallbackProc *pCompletionFunc, void *pCompletionParam, LPCTSTR pszName);
// This is the information that is passed to the host-specific thread proc. It is simply enough to call the thread entry point and
// call the callback (or set the boolean) at the end.
struct ThreadInfo {
CallbackProc *pThreadFunc; // The thread proc is this function
void *pThreadParam; // - called with this parameter
CallbackProc *pCompletionFunc; // At the end - call this function
void *pCompletionParam; // with this parameter
String strName; // For debugging
ThreadInfo (CallbackProc *_pThreadFunc,void *_pThreadParam,CallbackProc *_pCompletionFunc,void *_pCompletionParam,LPCTSTR pszName) :
pThreadFunc(_pThreadFunc),
pThreadParam(_pThreadParam),
pCompletionFunc(_pCompletionFunc),
pCompletionParam(_pCompletionParam),
strName(pszName){}
};
// THREADFUNC is the result type of the thread function
#ifdef _WIN32
typedef unsigned long THREADFUNC;
static int CALLBACK FilterFunction(LPEXCEPTION_POINTERS p);
#else // UNIX
typedef void * THREADFUNC;
#endif
static THREADFUNC CALLBACK SThreadFunc (void *pParam);
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -