📄 osutils.cxx
字号:
/*
* osutils.cxx
*
* Operating System utilities.
*
* 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: osutils.cxx,v $
* Revision 1.7 2007/07/16 09:43:56 joegenbaclor
* PTRACE now uses internal OSS Logger
*
* Revision 1.6 2007/07/16 05:55:43 joegenbaclor
* Added new func to set Ptrace stream as well as the external mutex
*
* Revision 1.5 2007/03/11 03:58:46 joegenbaclor
* Disabled PMEMORY_CHECK for release builds
*
* Revision 1.4 2007/01/10 23:58:02 joegenbaclor
* launcher specific code
*
* Revision 1.3 2006/11/28 07:59:30 joegenbaclor
* Corrected some compile warning on X64 build
*
* Revision 1.2 2006/11/15 09:17:13 joegenbaclor
* Replaced all __asm int 3 instances with new __debugbreak() intrinsic
*
* Revision 1.1 2006/06/29 04:18:19 joegenbaclor
* *** empty log message ***
*
* Revision 1.239 2006/05/23 22:28:11 csoutheren
* Add timer protection for backwards running clocks
*
* Revision 1.238 2006/05/23 00:57:30 csoutheren
* Fix race condition in timer startup (maybe)
*
* Revision 1.237 2005/12/04 22:43:30 csoutheren
* Cleanup patches from Kilian Krause
*
* Revision 1.236 2005/11/30 12:47:42 csoutheren
* Removed tabs, reformatted some code, and changed tags for Doxygen
*
* Revision 1.235 2005/11/09 09:11:39 csoutheren
* Moved Windows-specific AttachThreadInput callsto seperate member function
* on PThread. This removes a linearly increasing delay in creating new threads
*
* Revision 1.234 2005/10/22 04:50:23 csoutheren
* Fixed hole in mutex locking of PTrace
*
* Revision 1.233 2005/08/30 06:36:39 csoutheren
* Added ability to rotate output logs on a daily basis
*
* Revision 1.232 2005/03/19 02:52:55 csoutheren
* Fix warnings from gcc 4.1-20050313 shapshot
*
* Revision 1.231 2005/01/31 08:05:40 csoutheren
* More patches for MacOSX, thanks to Hannes Friederich
*
* Revision 1.230 2005/01/26 05:37:59 csoutheren
* Added ability to remove config file support
*
* Revision 1.229 2005/01/04 07:44:03 csoutheren
* More changes to implement the new configuration methodology, and also to
* attack the global static problem
*
* Revision 1.228 2004/08/16 06:40:59 csoutheren
* Added adapters template to make device plugins available via the abstract factory interface
*
* Revision 1.227 2004/06/30 12:17:06 rjongbloed
* Rewrite of plug in system to use single global variable for all factories to avoid all sorts
* of issues with startup orders and Windows DLL multiple instances.
*
* Revision 1.226 2004/06/03 13:30:58 csoutheren
* Renamed INSTANTIATE_FACTORY to avoid potential namespace collisions
* Added documentaton on new PINSTANTIATE_FACTORY macro
* Added generic form of PINSTANTIATE_FACTORY
*
* Revision 1.225 2004/06/03 12:47:59 csoutheren
* Decomposed PFactory declarations to hopefully avoid problems with Windows DLLs
*
* Revision 1.224 2004/06/01 05:22:44 csoutheren
* Restored memory check functionality
*
* Revision 1.223 2004/05/23 12:34:38 rjongbloed
* Fixed PProcess startup up execution to after PProcess instance is created
* so does not crash if using startup technique to initialise tracing.
*
* Revision 1.222 2004/05/21 00:28:39 csoutheren
* Moved PProcessStartup creation to PProcess::Initialise
* Added PreShutdown function and called it from ~PProcess to handle PProcessStartup removal
*
* Revision 1.221 2004/05/18 21:49:25 csoutheren
* Added ability to display trace output from program startup via environment
* variable or by application creating a PProcessStartup descendant
*
* Revision 1.220 2004/05/18 12:43:31 csoutheren
* Fixed compile problem on MSVC 6
*
* Revision 1.219 2004/05/18 06:01:06 csoutheren
* Deferred plugin loading until after main has executed by using abstract factory classes
*
* Revision 1.218 2004/05/18 02:32:09 csoutheren
* Fixed linking problems with PGenericFactory classes
*
* Revision 1.217 2004/05/13 15:05:43 csoutheren
* Added <vector.h>
*
* Revision 1.216 2004/05/13 14:54:57 csoutheren
* Implement PProcess startup and shutdown handling using abstract factory classes
*
* Revision 1.215 2004/04/24 06:27:56 rjongbloed
* Fixed GCC 3.4.0 warnings about PAssertNULL and improved recoverability on
* NULL pointer usage in various bits of code.
*
* Revision 1.214 2004/04/12 07:33:46 csoutheren
* Temporarily disabled removal of empty TRACE output on Linux
*
* Revision 1.213 2004/04/03 08:22:21 csoutheren
* Remove pseudo-RTTI and replaced with real RTTI
*
* Revision 1.212 2004/04/03 06:54:29 rjongbloed
* Many and various changes to support new Visual C++ 2003
*
* Revision 1.211 2004/03/22 10:15:27 rjongbloed
* Added classes similar to PWaitAndSignal to automatically unlock a PReadWriteMutex
* when goes out of scope.
*
* Revision 1.210 2004/03/20 09:08:15 rjongbloed
* Changed interaction between PTrace and PSystemLog so that the tracing code does
* not need to know about the system log, thus reducing the code footprint for most apps.
*
* Revision 1.209 2003/11/13 21:42:32 csoutheren
* Fixed problem with thread name display under Windows thanks to Ted Szoczei
*
* Revision 1.208 2003/11/08 01:42:19 rjongbloed
* Added thread names to DevStudio display, thanks Ted Szoczei
*
* Revision 1.207 2003/09/17 09:02:14 csoutheren
* Removed memory leak detection code
*
* Revision 1.206 2003/09/17 01:18:03 csoutheren
* Removed recursive include file system and removed all references
* to deprecated coooperative threading support
*
* Revision 1.205 2003/07/24 22:01:42 dereksmithies
* Add fixes from Peter Nixon for fixing install problems. Thanks.
*
* Revision 1.204 2003/03/27 07:27:44 robertj
* Added function to get a bunch of arguments as a string array.
*
* Revision 1.203 2003/01/24 10:21:06 robertj
* Fixed issues in RTEMS support, thanks Vladimir Nesic
*
* Revision 1.202 2002/12/18 05:31:31 robertj
* Moved PTimeInterval::GetInterval() to common code.
*
* Revision 1.201 2002/12/11 03:23:27 robertj
* Fixed deadlock in read/write mutex, at price of not having seemless upgrading
* of read lock to write lock. There is now a window in which some other
* thread may gain write lock from the thread that was trying to upgrade.
*
* Revision 1.200 2002/12/10 02:39:07 robertj
* Avoid odd trace output to stderr before trace file is set.
*
* Revision 1.199 2002/10/09 00:46:19 robertj
* Changed PThread::Create() so does not return PThread pointer if the thread
* has been created auto-delete, the pointer is extremely dangerous to use
* as it could be deleted at any time, so to remove temptation ...
*
* Revision 1.198 2002/10/08 03:35:15 robertj
* Fixed BSD warning
*
* Revision 1.197 2002/10/04 08:21:26 robertj
* Changed read/write mutex so can be called by same thread without deadlock.
*
* Revision 1.196 2002/07/30 02:55:09 craigs
* Added program start time to PProcess
*
* Revision 1.195 2002/06/27 06:38:58 robertj
* Changes to remove memory leak display for things that aren't memory leaks.
*
* Revision 1.194 2002/06/15 02:16:36 robertj
* Fixed bug (from rev 1.190) so can now use PTimer::Reset() after the timer
* had previously expired (resetTiem was being zeroed), thanks Ted Szoczei
*
* Revision 1.193 2002/06/05 12:29:15 craigs
* Changes for gcc 3.1
*
* Revision 1.192 2002/06/04 00:25:31 robertj
* Fixed incorrectly initialised trace indent, thanks Artis Kugevics
*
* Revision 1.191 2002/05/31 04:10:44 robertj
* Fixed missing mutex in PTrace::SetStream, thanks Federico Pinna
*
* Revision 1.190 2002/05/28 13:05:26 robertj
* Fixed PTimer::SetInterval so it restarts timer as per operator=()
*
* Revision 1.189 2002/05/22 00:42:03 craigs
* Added GMTTime flag to tracing options
*
* Revision 1.188 2002/05/01 03:45:09 robertj
* Added initialisation of PreadWriteMutex and changed slightly to agree
* with the text book definition of a semaphore for one of the mutexes.
*
* Revision 1.187 2002/04/30 06:21:38 robertj
* Fixed PReadWriteMutex class to implement text book algorithm!
*
* Revision 1.186 2002/04/30 03:39:21 robertj
* Changed PTimer::Stop() so does not return until timer is REALLY stopped, in
* particular when a possibly executing OnTimeout() function has completed.
*
* Revision 1.185 2002/04/24 01:19:07 robertj
* Added milliseconds to PTRACE output timestamp
*
* Revision 1.184 2002/04/24 01:10:28 robertj
* Fixed problem with PTRACE_BLOCK indent level being correct across threads.
*
* Revision 1.183 2002/04/19 00:43:17 craigs
* Fixed problem with file modes
*
* Revision 1.182 2002/04/19 00:20:31 craigs
* Added option to append to log file rather than create anew each time
*
* Revision 1.181 2002/02/14 05:14:51 robertj
* Fixed possible deadlock if a timer is deleted (however indirectly) in the
* OnTimeout of another timer.
*
* Revision 1.180 2002/02/11 04:07:00 robertj
* Fixed possibly race condition in PTRACE of first message. Consequence is
* that cannot PTRACE until have PProcess, ie before main() is executed.
*
* Revision 1.179 2002/01/31 08:14:16 robertj
* Put back code taken out by GCC 3.0 patch. It really SHOULD be there!
*
* Revision 1.178 2002/01/26 23:57:45 craigs
* Changed for GCC 3.0 compatibility, thanks to manty@manty.net
*
* Revision 1.177 2002/01/26 15:04:44 yurik
* Fixed trace stream to a file
*
* Revision 1.176 2001/12/18 23:22:54 robertj
* Fixed problem for if excecutable is "renamed" using unix exec() and the
* argv0 does not point to executable file.
*
* Revision 1.175 2001/12/15 04:49:17 robertj
* Added stream I/O functions for argument list.
*
* Revision 1.174 2001/12/14 00:42:56 robertj
* Fixed unix compatibility with trace of threads not created by pwlib.
*
* Revision 1.173 2001/12/13 09:21:43 robertj
* Changed trace so shows thread id if current thread not created by PWLib.
*
* Revision 1.172 2001/11/30 04:19:26 robertj
* Fixed correct setting of option bits in PTrace::Initialise()
* Added date and time to first message in PTrace::Initialise()
*
* Revision 1.171 2001/11/14 06:06:26 robertj
* Added functions on PTimer to get reset value and restart timer to it.
*
* Revision 1.170 2001/10/15 00:48:02 robertj
* Fixed warning on later MSVC compilers.
*
* Revision 1.169 2001/09/03 08:08:31 robertj
* Added tab so get extra "column" in trace output.
*
* Revision 1.168 2001/08/20 06:56:47 robertj
* Fixed memory leak report which isn't a memory leak.
*
* Revision 1.167 2001/07/20 04:14:19 robertj
* Removed GNU warning.
*
* Revision 1.166 2001/05/29 02:50:56 robertj
* Fixed GNU compatibility
*
* Revision 1.165 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.164 2001/05/03 06:26:22 robertj
* Fixed strange problem that occassionally crashes on exit. Mutex cannot be
* destroyed before program exit.
*
* Revision 1.163 2001/04/27 01:05:26 yurik
* Exit crash removal try
*
* Revision 1.162 2001/04/15 03:39:24 yurik
* Removed shutdown flag. Use IsTerminated() instead
*
* Revision 1.161 2001/04/14 04:53:01 yurik
* Got rid of init_seg pragma and added process shutdown flag
*
* Revision 1.160 2001/03/23 20:28:54 yurik
* Got rid of pragma warning for WinCE port
*
* Revision 1.159 2001/03/09 05:50:48 robertj
* Added ability to set default PConfig file or path to find it.
*
* Revision 1.158 2001/03/02 22:29:08 yurik
* New pragma for WinCE related port which enables (de)construction of library static objects be before applications'
* Eliminated nasty access violation stemmed from using static PMutex object in PTrace code. Thanks to Yuriy Gorvitovskiy.
*
* Revision 1.157 2001/02/22 22:31:44 robertj
* Changed PProcess version display to show build number even if zero.
*
* Revision 1.156 2001/02/22 08:16:42 robertj
* Added standard trace file setup subroutine.
*
* Revision 1.155 2001/02/19 03:44:20 robertj
* Changed "pl" in version number string to a simple ".", Now like 1.1.19
*
* Revision 1.154 2001/01/28 00:53:00 yurik
* WinCE port-related - streams refined
*
* Revision 1.153 2001/01/25 07:14:39 robertj
* Fixed spurios memory leak message. Usual static global problem.
*
* Revision 1.152 2001/01/24 18:27:44 yurik
* Added if !#defined WinCE when asm code used. Asm can't be used under WCE
*
* Revision 1.151 2001/01/02 07:47:44 robertj
* Fixed very narrow race condition in timers (destroyed while in OnTimeout()).
*
* Revision 1.150 2000/12/21 12:37:03 craigs
* Fixed deadlock problem with creating PTimer inside OnTimeout
*
* Revision 1.149 2000/11/28 12:55:37 robertj
* Added static function to create a new thread class and automatically
* run a function on another class in the context of that thread.
*
* Revision 1.148 2000/10/20 05:31:32 robertj
* Added function to change auto delete flag on a thread.
*
* Revision 1.147 2000/08/31 01:12:36 robertj
* Fixed problem with no new lines in trace output to stderr.
*
* Revision 1.146 2000/08/30 05:56:07 robertj
* Fixed free running timers broken by previous change.
*
* Revision 1.145 2000/08/30 03:17:00 robertj
* Improved multithreaded reliability of the timers under stress.
*
* Revision 1.144 2000/06/26 11:17:20 robertj
* Nucleus++ port (incomplete).
*
* Revision 1.143 2000/06/26 09:27:16 robertj
* Added ability to get at the PTraceStream without timestamps etc, use UINT_MAX trace level.
*
* Revision 1.142 2000/06/02 01:38:07 craigs
* Fixed typos
*
* Revision 1.141 2000/06/02 01:35:56 craigs
* Added more guards for NULL PStrings in PConfigArg handling
*
* Revision 1.140 2000/05/25 14:45:07 robertj
* Fixed detection of real argument over configured value.
*
* Revision 1.139 2000/05/25 13:47:51 robertj
* Fixed warning with GNU.
*
* Revision 1.138 2000/05/25 11:05:55 robertj
* Added PConfigArgs class so can save program arguments to config files.
*
* Revision 1.137 2000/05/05 10:08:29 robertj
* Fixed some GNU compiler warnings
*
* Revision 1.136 2000/04/28 06:58:50 robertj
* Fixed bug introduced when added Ashley Untts fix, forgot to take out old code!
*
* Revision 1.135 2000/04/27 04:19:27 robertj
* Fixed bug in restarting free running timers, thanks Ashley Unitt.
*
* Revision 1.134 2000/04/03 18:42:40 robertj
* Added function to determine if PProcess instance is initialised.
*
* Revision 1.133 2000/03/29 20:12:00 robertj
* Fixed GNU C++ warning
*
* Revision 1.132 2000/03/29 01:55:52 robertj
* Fixed infinite recursion on PProcess::Current() = NULL assertion.
*
* Revision 1.131 2000/03/02 05:43:12 robertj
* Fixed handling of NULL pointer on current thread in PTRACE output.
*
* Revision 1.130 2000/02/29 12:26:14 robertj
* Added named threads to tracing, thanks to Dave Harvey
*
* Revision 1.129 2000/02/17 11:34:28 robertj
* Changed PTRACE output to help line up text after filename output.
*
* Revision 1.128 2000/01/06 14:09:42 robertj
* Fixed problems with starting up timers,losing up to 10 seconds
*
* Revision 1.127 1999/10/19 09:21:30 robertj
* Added functions to get current trace options and level.
*
* Revision 1.126 1999/10/14 08:08:27 robertj
* Fixed problem, assuring millisecond accuracy in timestamp of trace output.
*
* Revision 1.125 1999/09/14 13:02:52 robertj
* Fixed PTRACE to PSYSTEMLOG conversion problem under Unix.
*
* Revision 1.124 1999/09/13 13:15:07 robertj
* Changed PTRACE so will output to system log in PServiceProcess applications.
*
* Revision 1.123 1999/08/22 12:54:35 robertj
* Fixed warnings about inlines on older GNU compiler
*
* Revision 1.122 1999/06/23 14:19:46 robertj
* Fixed core dump problem with SIGINT/SIGTERM terminating process.
*
* Revision 1.121 1999/06/14 07:59:38 robertj
* Enhanced tracing again to add options to trace output (timestamps etc).
*
* Revision 1.120 1999/04/26 08:06:51 robertj
* Added missing function in cooperative threading.
*
* Revision 1.119 1999/03/01 13:51:30 craigs
* Fixed ugly little bug in the cooperative multithreading that meant that threads blocked
* on timers didn't always get rescheduled.
*
* Revision 1.118 1999/02/23 10:13:31 robertj
* Changed trace to only diplay filename and not whole path.
*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -