thread.h
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:4k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * thread.h
  3.  *
  4.  * Thread of execution control class.
  5.  *
  6.  * Portable Windows Library
  7.  *
  8.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Portable Windows Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  25.  * All Rights Reserved.
  26.  *
  27.  * Contributor(s): ______________________________________.
  28.  *
  29.  * $Log: thread.h,v $
  30.  * Revision 1.18  1999/08/25 02:41:16  robertj
  31.  * Fixed problem with creating windows in background threads, not happening until have a message sent.
  32.  *
  33.  * Revision 1.17  1998/11/30 02:55:41  robertj
  34.  * New directory structure
  35.  *
  36.  * Revision 1.16  1998/09/24 03:30:34  robertj
  37.  * Added open software license.
  38.  *
  39.  * Revision 1.15  1998/04/01 01:53:14  robertj
  40.  * Fixed problem with NoAutoDelete threads.
  41.  *
  42.  * Revision 1.14  1996/08/17 10:00:36  robertj
  43.  * Changes for Windows DLL support.
  44.  *
  45.  * Revision 1.13  1996/08/08 10:09:19  robertj
  46.  * Directory structure changes for common files.
  47.  *
  48.  * Revision 1.12  1996/07/27 04:08:34  robertj
  49.  * Changed thread creation to use C library function instead of direct WIN32.
  50.  *
  51.  * Revision 1.11  1996/06/13 13:32:12  robertj
  52.  * Rewrite of auto-delete threads, fixes Windows95 total crash.
  53.  *
  54.  * Revision 1.10  1996/03/31 09:08:42  robertj
  55.  * Added mutex to thread dictionary access.
  56.  *
  57.  * Revision 1.9  1995/12/10 11:48:54  robertj
  58.  * Fixed bug in application shutdown of child threads.
  59.  *
  60.  * Revision 1.8  1995/08/24 12:38:36  robertj
  61.  * Added extra conditional compile for WIN32 code.
  62.  *
  63.  * Revision 1.7  1995/07/02 01:23:51  robertj
  64.  * Allowed access to thread info to descendents.
  65.  *
  66.  * Revision 1.6  1995/04/25 11:19:53  robertj
  67.  * Fixes for DLL use in WIN32.
  68.  *
  69.  * Revision 1.5  1995/03/12 05:00:02  robertj
  70.  * Re-organisation of DOS/WIN16 and WIN32 platforms to maximise common code.
  71.  * Used built-in equate for WIN32 API (_WIN32).
  72.  *
  73.  * Revision 1.4  1994/07/27  06:00:10  robertj
  74.  * Backup
  75.  *
  76.  * Revision 1.3  1994/07/21  12:35:18  robertj
  77.  * *** empty log message ***
  78.  *
  79.  * Revision 1.2  1994/07/02  03:18:09  robertj
  80.  * Multi-threading implementation.
  81.  *
  82.  * Revision 1.1  1994/06/25  12:13:01  robertj
  83.  * Initial revision
  84.  *
  85.  */
  86. #ifndef _PTHREAD
  87. #if defined(_WIN32)
  88. #define P_PLATFORM_HAS_THREADS
  89. #undef Yield
  90. #else
  91. #include <malloc.h>
  92. #include <setjmp.h>
  93. #if defined(_MSC_VER) && !defined(_JMP_BUF_DEFINED)
  94. typedef int jmp_buf[9];
  95. #define setjmp _setjmp
  96. extern "C" int  __cdecl _setjmp(jmp_buf);
  97. extern "C" void __cdecl longjmp(jmp_buf, int);
  98. #endif
  99. #endif
  100. ///////////////////////////////////////////////////////////////////////////////
  101. // PThread
  102. #include "../../thread.h"
  103. #if defined(P_PLATFORM_HAS_THREADS)
  104.   public:
  105.     HANDLE GetHandle() const { return threadHandle; }
  106.     UINT GetThreadId() const { return threadId; }
  107.   protected:
  108.     HANDLE threadHandle;
  109.     UINT   threadId;
  110.   private:
  111.     PINDEX originalStackSize;
  112.     static UINT __stdcall MainFunction(void * thread);
  113. #else
  114.   public:
  115.     typedef BOOL (__far *BlockFunction)(PObject *);
  116.     void Block(BlockFunction isBlocked, PObject * obj);
  117.       // Flag the thread as blocked. The scheduler will call the specified
  118.       // function with the obj parameter to determine if the thread is to be
  119.       // unblocked.
  120.   protected:
  121.     BOOL IsOnlyThread() const;
  122.       // Return TRUE if is only thread in process
  123.   private:
  124.     // Member fields
  125.     BlockFunction isBlocked;
  126.       // Callback function to determine if the thread is blocked on I/O.
  127.     PObject * blocker;
  128.       // When thread is blocked on I/O this is the object to pass to isBlocked.
  129. #ifdef _WINDOWS
  130.     unsigned stackUsed;
  131.       // High water mark for stack allocated for the thread
  132. #endif
  133. #endif
  134. };
  135. inline PThread::PThread()
  136.   { }   // Is mostly initialised by InitialiseProcessThread().
  137. #endif