📄 tlibthrd.cxx
字号:
/* * tlibthrd.cxx * * Routines for pre-emptive threading system * * Portable Windows Library * * Copyright (c) 1993-1998 Equivalence Pty. Ltd. * * The contents of this file are subject to the Mozilla Public License * Version 1.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See * the License for the specific language governing rights and limitations * under the License. * * The Original Code is Portable Windows Library. * * The Initial Developer of the Original Code is Equivalence Pty. Ltd. * * Portions are Copyright (C) 1993 Free Software Foundation, Inc. * All Rights Reserved. * * Contributor(s): ______________________________________. * * $Log: tlibthrd.cxx,v $ * Revision 1.134.2.1 2005/02/04 05:19:12 csoutheren * Backported patches from Atlas-devel * * Revision 1.137 2005/01/21 21:25:19 csoutheren * Removed incorrect return in PThread::WaitForTermination * * Revision 1.136 2005/01/16 23:00:37 csoutheren * Fixed problem when calling WaitForTermination from within the same thread * * Revision 1.135 2004/12/21 06:30:55 csoutheren * Added explicit stack size for pthreads to minimise VM usage, thanks to Diana Cionoiu * * Revision 1.134 2004/09/02 07:55:44 csoutheren * Added extra PXAbortBlock to WaitForTermination to assist in terminaing * threads under certain conditions * * Revision 1.133 2004/06/24 11:29:44 csoutheren * Changed to use pthread_mutex_timedlock for more efficient mutex wait operations * Thanks to Michal Zygmuntowicz * * Revision 1.132 2004/06/01 07:42:20 csoutheren * Restored memory allocation checking * Added configure flag to enable, thanks to Derek Smithies * * Revision 1.131 2004/05/21 00:49:16 csoutheren * Added PreShutdown to ~PProcess * * Revision 1.130 2004/04/27 04:36:47 rjongbloed * Fixed occassional crash on exit due to level 5 trace in PProcess * destructor that needs an undestructed PProcess. * Added some more logging for unblocking threads. * * Revision 1.129 2004/04/12 03:35:27 csoutheren * Fixed problems with non-recursuve mutexes and critical sections on * older compilers and libc * * Revision 1.128 2004/04/12 00:58:45 csoutheren * Fixed PAtomicInteger on Linux, and modified PMutex to use it * * Revision 1.127 2004/04/11 07:58:08 csoutheren * Added configure.in check for recursive mutexes, and changed implementation * without recursive mutexes to use PCriticalSection or atomic word structs * * Revision 1.126 2004/03/24 02:37:04 csoutheren * Fixed problem with incorrect usage of sem_timedwait * * Revision 1.125 2004/03/23 04:56:23 csoutheren * Added patches to use XPG6 threading under Linux if available * Thanks to Matthew Hodgson * * Revision 1.124 2004/02/01 11:23:16 dsandras * Reverted previous Change and removed Yield call from Current (). Fix from Christian Meder <chris@onestepahead.de>. Thanks for your help, Christian! * * Revision 1.123 2004/01/31 13:49:18 dominance * Added 2.6 performance fix as proposed by Christian Meder <chris@onestepahead.de>. * * Revision 1.122 2003/09/17 09:02:15 csoutheren * Removed memory leak detection code * * Revision 1.121 2003/05/16 17:40:55 shawn * On Mac OS X, thread with the highest priority should use fixed priority * scheduling policy. This avoids starvation caused by desktop activity. * * Revision 1.120 2003/05/02 00:58:40 dereks * Add test for linux at the end of PMutex::Signal. Thanks Robert! * * Revision 1.119 2003/05/02 00:39:11 dereks * Changes to make threading work on Redhat 9 * * Revision 1.118 2003/04/24 12:03:13 rogerh * Calling pthread_mutex_unlock() on a mutex which is not locked can be * considered an error. NetBSD now enforce this error so we need to quickly * try locking the mutex before unlocking it in ~PThread and ~PSemaphore. * * Revision 1.117 2003/04/08 03:29:31 robertj * Fixed IsSuspeneded() so returns TRUE if thread not started yet, this makes * it the same as the Win32 semantics. * * Revision 1.116 2003/03/10 15:37:00 rogerh * fix IsTerminated() function. * * Revision 1.115 2003/03/07 00:07:15 robertj * Fixed Mac OS X patch which broke every other platform. * * Revision 1.114 2003/03/06 08:58:48 rogerh * P_MACOSX now carries the OSRELEASE. Use this to enable better threads * support on Darwin 6.4. Submitted by Shawn. * * Revision 1.113 2003/02/20 23:32:00 robertj * More RTEMS support patches, thanks Sebastian Meyer. * * Revision 1.112 2003/01/24 10:21:06 robertj * Fixed issues in RTEMS support, thanks Vladimir Nesic * * Revision 1.111 2003/01/20 10:13:18 rogerh * NetBSD thread changes * * Revision 1.110 2003/01/20 10:05:46 rogerh * NetBSD thread changes * * Revision 1.109 2003/01/08 08:47:51 rogerh * Add new Sleep() function for GNU PTH threads. * Taken from NetBSD's package which uses PTH. * Note: I am not sure this works correctly. * * Revision 1.108 2003/01/06 18:49:15 rogerh * Back out pthead_kill to pthread_cancel change on NetBSD * * Revision 1.107 2002/12/11 05:39:26 robertj * Added logging for file handle changes. * Fixd bug where internal maxHandles not set when increased. * * Revision 1.106 2002/12/02 03:57:18 robertj * More RTEMS support patches, thank you Vladimir Nesic. * * Revision 1.105 2002/11/22 10:14:07 robertj * QNX port, thanks Xiaodan Tang * * Revision 1.104 2002/11/04 16:01:27 rogerh * Using pthread_cancel and not pthread_kill with SIGKILL to terminate a thread * On FreeBSD the thread does not have a handler for SIGKILL, it passes it up * to the main process which gets killed! Assume the other BSDs are the same. * * Revision 1.103 2002/10/24 00:40:56 robertj * Put back ability to terminate a thread from that threads context (removed * in revision 1.101) but requires that destructor not do so. * Changed pipe close to allow for possible EINTR, and retry close. * * Revision 1.102 2002/10/24 00:25:13 robertj * Changed high load thread problem fix from the termination function to start * function to finally, once and for all (I hope!) fix the race condition. * * Revision 1.101 2002/10/23 14:56:22 craigs * Fixed problem with pipe leak under some circumstances * * Revision 1.100 2002/10/23 04:29:32 robertj * Improved debugging for thread create/start/stop/destroy. * Fixed race condition bug if auto-delete thread starts and completes before * pthread_create returns, PX_threadId is not set yet! * * Revision 1.99 2002/10/22 07:42:52 robertj * Added extra debugging for file handle and thread leak detection. * * Revision 1.98 2002/10/18 03:05:39 robertj * Fixed thread leak caused by fixing the thread crash a few revisions back, * caused by strange pthreads behaviour, at least under Linux. * * Revision 1.97 2002/10/17 13:44:27 robertj * Port to RTEMS, thanks Vladimir Nesic. * * Revision 1.96 2002/10/17 12:57:24 robertj * Added ability to increase maximum file handles on a process. * * Revision 1.95 2002/10/16 11:26:29 rogerh * Add missing include. Noticed by Matthias on the GnomeMeeting IRC * * Revision 1.94 2002/10/10 03:09:48 robertj * Fixed high load race condition when starting threads. * * Revision 1.93 2002/10/05 05:22:43 robertj * Fixed adding GetThreadId() function. * * Revision 1.92 2002/10/01 06:27:48 robertj * Added bullet proofing against possible EINTR error returns on all pthread * functions when under heavy load. Linux really should NOT do this, but ... * * Revision 1.91 2002/09/04 03:14:18 robertj * Backed out changes submitted by Martin Froehlich as they do not appear to * actually do anything other than add a sychronisation point. The variables * the patches intended to protect were already protected. * Fixed bug where if a PMutex was signalled by a thread that did not have it * locked, it would assert but continue to alter PMutex variables such that * a deadlock or crash is likely. * * Revision 1.90 2002/08/29 01:50:40 robertj * Changed the pthread_create so does retries if get EINTR or EAGAIN errors * which indicate a (possibly) temporary resource limit. * Enabled and adjusted tracing. * * Revision 1.89 2002/08/22 13:05:57 craigs * Fixed problems with mutex implementation thanks to Martin Froehlich * * Revision 1.88 2002/07/15 06:56:59 craigs * Fixed missing brace * * Revision 1.87 2002/07/15 06:39:23 craigs * Added function to allow raising of per-process file handle limit * * Revision 1.86 2002/06/27 06:38:58 robertj * Changes to remove memory leak display for things that aren't memory leaks. * * Revision 1.85 2002/06/27 02:04:01 robertj * Fixed NetBSD compatibility issue, thanks Motoyuki OHMORI. * * Revision 1.84 2002/06/04 00:25:31 robertj * Fixed incorrectly initialised trace indent, thanks Artis Kugevics * * Revision 1.83 2002/05/21 09:13:00 robertj * Fixed problem when using posix recursive mutexes, thanks Artis Kugevics * * Revision 1.82 2002/04/24 01:11:37 robertj * Fixed problem with PTRACE_BLOCK indent level being correct across threads. * * Revision 1.81 2002/04/16 10:57:26 rogerh * Change WaitForTermination() so it does not use 100% CPU. * Reported by Andrea <ghittino@tiscali.it> * * Revision 1.80 2002/01/23 04:26:36 craigs * Added copy constructors for PSemaphore, PMutex and PSyncPoint to allow * use of default copy constructors for objects containing instances of * these classes * * Revision 1.79 2002/01/10 06:36:58 robertj * Fixed possible resource leak under Solaris, thanks Joegen Baclor * * Revision 1.78 2001/12/17 11:06:46 robertj * Removed assert on NULL PThread::Current(), can occur if thread from other * subsystem to pwlib * * Revision 1.77 2001/10/03 05:11:50 robertj * Fixed PSyncPoint wait with timeout when have pending signals. * * Revision 1.76 2001/09/27 23:50:03 craigs * Fixed typo in PSemaphone destructor * * Revision 1.75 2001/09/24 10:09:48 rogerh * Fix an uninitialised variable problem. * * Revision 1.74 2001/09/20 05:38:25 robertj * Changed PSyncPoint to use pthread cond so timed wait blocks properly. * Also prevented semaphore from being created if subclass does not use it. * * Revision 1.73 2001/09/19 17:37:47 craigs * Added support for nested mutexes under Linux * * Revision 1.72 2001/09/18 06:53:35 robertj * Made sure suspend can't exit early if get spurious signal * * Revision 1.71 2001/09/18 05:56:03 robertj * Fixed numerous problems with thread suspend/resume and signals handling. * * Revision 1.70 2001/09/10 03:03:02 robertj * Major change to fix problem with error codes being corrupted in a * PChannel when have simultaneous reads and writes in threads. * Changed threading so does not actually start thread until Resume(), makes * the logic of start up much simpler and more portable. * Quite a bit of tidyin up of the pthreads code. * * Revision 1.69 2001/08/30 08:57:40 robertj * Changed calls to usleep to be PThread::Yield(), normalising single * timeslice process swap out. * * Revision 1.68 2001/08/20 06:55:45 robertj * Fixed ability to have PMutex::Wait() with times less than one second. * Fixed small error in return value of block on I/O function, not critical. * * Revision 1.67 2001/08/07 02:50:03 craigs * Fixed potential race condition in IO blocking * * Revision 1.66 2001/07/09 13:23:37 rogerh * Fix a subtle bug in semaphore wait which showed up on FreeBSD * * Revision 1.65 2001/05/29 00:49:18 robertj * Added ability to put in a printf %x in thread name to get thread object * address into user settable thread name. * * Revision 1.64 2001/05/23 00:18:55 robertj * Added support for real time threads, thanks Erland Lewin. * * Revision 1.63 2001/04/20 09:27:25 robertj * Fixed previous change for auto delete threads, must have thread ID zeroed. * * Revision 1.62 2001/04/20 09:09:05 craigs * Removed possible race condition whilst shutting down threads * * Revision 1.61 2001/03/20 06:44:25 robertj * Lots of changes to fix the problems with terminating threads that are I/O * blocked, especially when doing orderly shutdown of service via SIGTERM. * * Revision 1.60 2001/03/14 01:16:11 robertj * Fixed signals processing, now uses housekeeping thread to handle signals * synchronously. This also fixes issues with stopping PServiceProcess. * * Revision 1.59 2001/02/25 19:39:42 rogerh * Use a Semaphore on Mac OS X to support threads which are started as 'suspended' * * Revision 1.58 2001/02/24 14:49:22 rogerh * Add missing bracket * * Revision 1.57 2001/02/24 13:29:34 rogerh * Mac OS X change to avoid Assertion * * Revision 1.56 2001/02/24 13:24:24 rogerh * Add PThread support for Mac OS X and Darwin. There is one major issue. This * OS does not suport pthread_kill() and sigwait() so we cannot support the * Suspend() and Resume() functions to start and stop threads and we cannot * create new threads in 'suspended' mode. * Calling Suspend() raises an assertion. Calling Resume() does nothing. * Threads started in 'suspended' mode start immediatly. * * Revision 1.55 2001/02/21 22:48:42 robertj * Fixed incorrect test in PSemaphore::WillBlock() just added, thank Artis Kugevics. * * Revision 1.54 2001/02/20 00:21:14 robertj * Fixed major bug in PSemapahore::WillBlock(), thanks Tomas Heran. * * Revision 1.53 2000/12/21 12:36:32 craigs * Removed potential to stop threads twice * * Revision 1.52 2000/12/05 08:24:50 craigs * Fixed problem with EINTR causing havoc * * Revision 1.51 2000/11/16 11:06:38 rogerh * Add a better fix for the "user signal 2" aborts seen on FreeBSD 4.2 and above. * We need to sched_yeild() after the pthread_create() to make sure the new thread * actually has a chance to execute. The abort problem was caused when the * resume signal was issued before the thread was ready for it. * * Revision 1.50 2000/11/12 23:30:02 craigs * Added extra WaitForTermination to assist bug location * * Revision 1.49 2000/11/12 08:16:07 rogerh * This change and the previous change, make pthreads work on FreeBSD 4.2. * FreeBSD has improved its thread signal handling and now correctly generates a * SIGUSR2 signal on a thread (the Resume Signal). However there was no handler * for this signal and applications would abort with "User signal 2". * So, a dummy sigResumeHandler has been added. * * Revision 1.48 2000/11/12 07:57:45 rogerh * *** empty log message *** * * Revision 1.47 2000/10/31 08:09:51 rogerh * Change return type of PX_GetThreadId() to save unnecessary typecasting * * Revision 1.46 2000/10/31 07:52:06 rogerh * Add type casts to allow the code to compile on FreeBSD 4.1.1 * * Revision 1.45 2000/10/30 05:48:33 robertj * Added assert when get nested mutex. * * Revision 1.44 2000/10/24 03:32:40 robertj * Fixed problem where thread that uses PThread::Current() in dtor crashes. * * Revision 1.43 2000/10/20 06:11:48 robertj * Added function to change auto delete flag on a thread. * * Revision 1.42 2000/09/20 04:24:09 craigs * Added extra tracing, and removed segv on exit when using tracing * * Revision 1.41 2000/06/21 01:01:22 robertj * AIX port, thanks Wolfgang Platzer (wolfgang.platzer@infonova.at). * * Revision 1.40 2000/04/13 07:21:10 rogerh * Fix typo in #defined * * Revision 1.39 2000/04/11 11:38:49 rogerh * More NetBSD Pthread changes * * Revision 1.38 2000/04/10 11:47:02 rogerh * Add initial NetBSD pthreads support * * Revision 1.37 2000/04/06 12:19:49 rogerh * Add Mac OS X support submitted by Kevin Packard * * Revision 1.36 2000/03/20 22:56:34 craigs * Fixed problems with race conditions caused by testing or changing * attributes on a terminated thread. Only occured on a fast machine! * * Revision 1.35 2000/03/17 03:45:40 craigs * Fixed problem with connect call hanging * * Revision 1.34 2000/03/08 12:17:09 rogerh * Add OpenBSD support * * Revision 1.33 2000/02/29 13:18:21 robertj * Added named threads to tracing, thanks to Dave Harvey * * Revision 1.32 2000/01/20 08:20:57 robertj * FreeBSD v3 compatibility changes, thanks Roger Hardiman & Motonori Shindo * * Revision 1.31 1999/11/18 14:02:57 craigs * Fixed problem with houskeeping thread termination * * Revision 1.30 1999/11/15 01:12:56 craigs * Fixed problem with PSemaphore::Wait consuming 100% CPU * * Revision 1.29 1999/10/30 13:44:11 craigs * Added correct method of aborting socket operations asynchronously * * Revision 1.28 1999/10/24 13:03:30 craigs * Changed to capture io break signal * * Revision 1.27 1999/09/23 06:52:16 robertj * Changed PSemaphore to use Posix semaphores. * * Revision 1.26 1999/09/03 02:26:25 robertj * Changes to aid in breaking I/O locks on thread termination. Still needs more work esp in BSD! * * Revision 1.25 1999/09/02 11:56:35 robertj * Fixed problem with destroying PMutex that is already locked. * * Revision 1.24 1999/08/24 13:40:56 craigs * Fixed problem with condwait destorys failing on linux * * Revision 1.23 1999/08/23 05:33:45 robertj * Made last threading changes Linux only. * * Revision 1.22 1999/08/23 05:14:13 robertj * Removed blocking of interrupt signals as does not work in Linux threads. * * Revision 1.21 1999/07/30 00:40:32 robertj * Fixed problem with signal variable in non-Linux platforms * * Revision 1.20 1999/07/19 01:32:24 craigs * Changed signals used in pthreads code, is used by linux version. * * Revision 1.19 1999/07/15 13:10:55 craigs * Fixed problem with EINTR in nontimed sempahore waits * * Revision 1.18 1999/07/15 13:05:33 robertj * Fixed problem with getting EINTR in semaphore wait, is normal, not error. * * Revision 1.17 1999/07/11 13:42:13 craigs * pthreads support for Linux * * Revision 1.16 1999/05/12 03:29:20 robertj * Fixed problem with semaphore free, done at wrong time. * * Revision 1.15 1999/04/29 08:41:26 robertj * Fixed problems with uninitialised mutexes in PProcess. * * Revision 1.14 1999/03/16 10:54:16 robertj * Added parameterless version of WaitForTermination.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -