]> git.kernelconcepts.de Git - karo-tx-redboot.git/blobdiff - tools/src/tools/Utils/common/eCosThreadUtils.h
Initial revision
[karo-tx-redboot.git] / tools / src / tools / Utils / common / eCosThreadUtils.h
diff --git a/tools/src/tools/Utils/common/eCosThreadUtils.h b/tools/src/tools/Utils/common/eCosThreadUtils.h
new file mode 100644 (file)
index 0000000..0601741
--- /dev/null
@@ -0,0 +1,155 @@
+//####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