⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 object.cxx

📁 pwlib源码库
💻 CXX
📖 第 1 页 / 共 3 页
字号:
/* * object.cxx * * Global object support. * * 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: object.cxx,v $ * Revision 1.81  2004/10/24 03:43:55  rjongbloed * Used correct test for inclusion of pragma implementation * * Revision 1.80  2004/10/23 10:55:40  ykiryanov * Added ifdef _WIN32_WCE for PocketPC 2003 SDK port * * Revision 1.79  2004/07/11 07:56:36  csoutheren * Applied jumbo VxWorks patch, thanks to Eize Slange * * Revision 1.78  2004/07/01 11:41:30  csoutheren * Fixed compile and run problems on Linux * * Revision 1.77  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.76  2004/06/29 08:20:46  rogerhardiman * The throws are needed on new and delete in GCC 2.95.x too. * This is now important as other code changes (factory and #include <string>) * now cause /usr/include/g++/new to be included too. Tested on FreeBSD 4.10 * * Revision 1.75  2004/06/17 22:02:51  csoutheren * Added check to prevent allocationBreakpoint from causing unintentional break every 2^32 memory allocations * * Revision 1.74  2004/06/01 05:22:43  csoutheren * Restored memory check functionality * * Revision 1.73  2004/04/14 06:58:05  csoutheren * Fixed PAtomicInteger and PSmartPointer to use real atomic operations * * Revision 1.72  2004/04/13 11:47:52  csoutheren * Changed PSmartPtr to use PAtomicInteger * * Revision 1.71  2004/04/03 08:22:21  csoutheren * Remove pseudo-RTTI and replaced with real RTTI * * Revision 1.70  2004/04/03 08:09:16  csoutheren * Fixed compile problem on Windows * * Revision 1.69  2004/04/03 07:41:01  csoutheren * Fixed compile problem with ostringstream/ostrstream * * Revision 1.68  2004/04/03 06:54:28  rjongbloed * Many and various changes to support new Visual C++ 2003 * * Revision 1.67  2003/09/17 09:02:14  csoutheren * Removed memory leak detection code * * Revision 1.66  2003/09/17 05:55:10  csoutheren * Removed recursive includes * * Revision 1.65  2003/02/11 08:05:55  robertj * Fixed problems in dumping memory leaks and statistics as PMemoryHeap *   is flagged deleted too early, thanks Diego T醨tara * * Revision 1.64  2003/02/06 21:03:13  dereks * Patch from Klaus Kaempf to fix warning message on compiling with gcc 3.x Thanks! * * Revision 1.63  2002/11/22 10:14:58  robertj * Fixed correct free of memory blocks in exceptional circumstances. Partially *   trashed heap or objects etc. * * Revision 1.62  2002/10/21 12:52:27  rogerh * Add throw()s to new and delete. Error reported by FreeBSD 5.0 and GCC 3.2.1 * * Revision 1.61  2002/10/10 04:43:44  robertj * VxWorks port, thanks Martijn Roest * * Revision 1.60  2002/09/06 05:29:42  craigs * Reversed order of memory block check on delete to improve performance in * Linux debug mode * * Revision 1.59  2002/09/04 05:23:53  robertj * Fixed crashable way of checking pointer is in PWLib heap check. * * Revision 1.58  2002/08/13 01:28:42  robertj * Added allocation number to memory statistics dump to aid in leak finding. * * Revision 1.57  2002/06/28 05:17:06  yurik * ifndef'd ostrstream as it does not yet exist on wince * * Revision 1.56  2002/06/27 06:10:39  robertj * Removed PAssert on allocation breakpoint as can often caus a deadlock. * * Revision 1.55  2002/06/25 10:33:55  robertj * REmoved usage of sstream for GNU v3 as it is completely different to the *   old ostrstream classes. * * Revision 1.54  2002/06/25 02:23:57  robertj * Improved assertion system to allow C++ class name to be displayed if *   desired, especially relevant to container classes. * * Revision 1.53  2002/06/13 08:50:11  rogerh * GCC 3.1 uses slightly different #includes * * Revision 1.52  2001/09/18 05:56:03  robertj * Fixed numerous problems with thread suspend/resume and signals handling. * * Revision 1.51  2001/08/16 11:58:22  rogerh * Add more Mac OS X changes from John Woods <jfw@jfwhome.funhouse.com> * * Revision 1.50  2001/06/20 06:05:47  rogerh * Updates for Mac OS X from Pai-Hsiang Hsiao <shawn@eecs.harvard.edu> * * Revision 1.49  2001/05/03 06:27:29  robertj * Added return value to PMemoryCheck::SetIgnoreAllocations() so get previous state. * * Revision 1.48  2001/02/18 23:16:02  robertj * Fixed possible NULL pointer reference in memory check validation *   function, thanks Peter Ehlin. * * Revision 1.47  2001/02/13 03:31:02  robertj * Added function to do heap validation. * * Revision 1.46  2001/02/07 04:47:49  robertj * Added changes for possible random crashes in multi DLL environment *   due to memory allocation wierdness, thanks Milan Dimitrijevic. * * Revision 1.45  2001/01/25 07:14:39  robertj * Fixed spurios memory leak message. Usual static global problem. * * Revision 1.44  2000/06/26 11:17:20  robertj * Nucleus++ port (incomplete). * * Revision 1.43  2000/01/05 00:29:12  robertj * Fixed alignment problems in memory checking debug functions. * * Revision 1.42  1999/11/01 00:17:20  robertj * Added override of new functions for MSVC memory check code. * * Revision 1.41  1999/08/22 13:38:39  robertj * Fixed termination hang up problem with memory check code under unix pthreads. * * Revision 1.40  1999/08/10 10:45:09  robertj * Added mutex in memory check detection code. * * Revision 1.39  1999/07/18 15:08:48  robertj * Fixed 64 bit compatibility * * Revision 1.38  1999/05/01 11:29:20  robertj * Alpha linux port changes. * * Revision 1.37  1999/03/09 10:30:17  robertj * Fixed ability to have PMEMORY_CHECK on/off on both debug/release versions. * * Revision 1.36  1999/02/22 10:48:14  robertj * Fixed delete operator prototypes for MSVC6 and GNU compatibility. * * Revision 1.35  1998/12/22 10:24:17  robertj * Fixed MSVC warnings caused by changes made in linux PPC support. * * Revision 1.34  1998/12/15 09:01:10  robertj * Fixed 8 byte alignment problem in memory leak check code for sparc. * * Revision 1.33  1998/11/30 05:33:00  robertj * Fixed duplicate debug stream class, ther can be only one. * * Revision 1.32  1998/11/03 03:11:53  robertj * Fixed memory leak question so correctly detects leaks and can be ^C'd. * * Revision 1.31  1998/11/03 00:55:31  robertj * Added allocation breakpoint variable. * * Revision 1.30  1998/10/15 07:48:56  robertj * Added hex dump to memory leak. * Added ability to ignore G++lib memory leaks. * * Revision 1.29  1998/10/15 01:53:35  robertj * GNU compatibility. * * Revision 1.28  1998/10/13 14:06:26  robertj * Complete rewrite of memory leak detection code. * * Revision 1.27  1998/09/23 06:22:22  robertj * Added open source copyright license. * * Revision 1.26  1998/05/30 13:27:02  robertj * Changed memory check code so global statics are not included in leak check. * * Revision 1.25  1997/07/08 13:07:07  robertj * DLL support. * * Revision 1.24  1997/02/09 03:45:28  robertj * Fixed unix/dos compatibility with include file. * * Revision 1.23  1997/02/05 11:54:12  robertj * Fixed problems with memory check and leak detection. * * Revision 1.22  1996/08/08 10:08:46  robertj * Directory structure changes for common files. * * Revision 1.21  1996/07/15 10:35:11  robertj * Changed memory leak dump to use static class rather than atexit for better portability. * * Revision 1.20  1996/06/17 11:35:47  robertj * Fixed display of memory leak info, needed flush and use of cin as getchar() does not work with services. * * Revision 1.19  1996/05/09 12:19:29  robertj * Fixed up 64 bit integer class for Mac platform. * Fixed incorrect use of memcmp/strcmp return value. * * Revision 1.18  1996/03/26 00:55:20  robertj * Added keypress before dumping memory leaks. * * Revision 1.17  1996/01/28 02:50:27  robertj * Added missing bit shift operators to 64 bit integer class. * Added assert into all Compare functions to assure comparison between compatible objects. * * Revision 1.16  1996/01/23 13:15:52  robertj * Mac Metrowerks compiler support. * * Revision 1.15  1996/01/02 12:52:02  robertj * Mac OS compatibility changes. * * Revision 1.14  1995/11/21 11:51:54  robertj * Improved streams compatibility. * * Revision 1.12  1995/04/25 11:30:34  robertj * Fixed Borland compiler warnings. * Fixed function hiding ancestors virtual. * * Revision 1.11  1995/03/12 04:59:53  robertj * Re-organisation of DOS/WIN16 and WIN32 platforms to maximise common code. * Used built-in equate for WIN32 API (_WIN32). * * Revision 1.10  1995/02/19  04:19:21  robertj * Added dynamically linked command processing. * * Revision 1.9  1995/01/15  04:52:02  robertj * Mac compatibility. * Added memory stats function. *// Revision 1.8  1995/01/09  12:38:07  robertj// Changed variable names around during documentation run.// Fixed smart pointer comparison.// Fixed serialisation stuff.//// Revision 1.7  1995/01/07  04:39:45  robertj// Redesigned font enumeration code and changed font styles.//// Revision 1.6  1995/01/04  10:57:08  robertj// Changed for HPUX and GNU2.6.x//// Revision 1.5  1995/01/03  09:39:10  robertj// Put standard malloc style memory allocation etc into memory check system.//// Revision 1.4  1994/12/21  11:43:29  robertj// Added extra memory stats.//// Revision 1.3  1994/12/13  11:54:54  robertj// Added some memory usage statistics.//// Revision 1.2  1994/12/12  10:08:32  robertj// Renamed PWrapper to PSmartPointer..//// Revision 1.1  1994/10/30  12:02:15  robertj// Initial revision// */#ifdef __GNUC__#pragma implementation "pfactory.h"#endif // __GNUC__#include <ptlib.h>#include <ctype.h>#ifdef _WIN32#include <ptlib/msos/ptlib/debstrm.h>#include <crtdbg.h>#elif defined(__NUCLEUS_PLUS__)#include <ptlib/NucleusDebstrm.h>#else#include <signal.h>#endifPFactoryBase::FactoryMap & PFactoryBase::GetFactories(){  static FactoryMap factories;  return factories;}PMutex & PFactoryBase::GetFactoriesMutex(){  static PMutex mutex;  return mutex;}PFactoryBase::FactoryMap::~FactoryMap(){  FactoryMap::const_iterator entry;  for (entry = begin(); entry != end(); ++entry)    delete entry->second;}void PAssertFunc(const char * file,                 int line,                 const char * className,                 PStandardAssertMessage msg){  if (msg == POutOfMemory) {    // Special case, do not use ostrstream in other PAssertFunc if have    // a memory out situation as that would probably also fail!    static const char fmt[] = "Out of memory at file %.100s, line %u, class %.30s";    char msgbuf[sizeof(fmt)+100+10+30];    sprintf(msgbuf, fmt, file, line, className);    PAssertFunc(msgbuf);    return;  }  static const char * const textmsg[PMaxStandardAssertMessage] = {    NULL,    "Out of memory",    "Null pointer reference",    "Invalid cast to non-descendant class",    "Invalid array index",    "Invalid array element",    "Stack empty",    "Unimplemented function",    "Invalid parameter",    "Operating System error",    "File not open",    "Unsupported feature",    "Invalid or closed operating system window"  };  const char * theMsg;  char msgbuf[20];  if (msg < PMaxStandardAssertMessage)    theMsg = textmsg[msg];  else {    sprintf(msgbuf, "Assertion %i", msg);    theMsg = msgbuf;  }  PAssertFunc(file, line, className, theMsg);}void PAssertFunc(const char * file, int line, const char * className, const char * msg){#if defined(_WIN32)  DWORD err = GetLastError();#else  int err = errno;#endif#ifndef _WIN32_WCE  #if (__GNUC__ >= 3) && defined (__USE_STL__)  ostringstream str;  #else  ostrstream str;  #endif  str << "Assertion fail: ";  if (msg != NULL)    str << msg << ", ";  str << "file " << file << ", line " << line;  if (className != NULL)    str << ", class " << className;  if (err != 0)    str << ", Error=" << err;  str << ends;    #if (__GNUC__ >= 3) && defined (__USE_STL__)  const char * s = str.str().c_str();  #else  const char * s = str.str();  #endif  PAssertFunc(s);#endif // !_WIN32_WCE}PObject::Comparison PObject::CompareObjectMemoryDirect(const PObject&obj) const{  int retval = memcmp(this, &obj, sizeof(PObject));  if (retval < 0)    return LessThan;  if (retval > 0)    return GreaterThan;  return EqualTo;}PObject * PObject::Clone() const{  PAssertAlways(PUnimplementedFunction);  return NULL;}PObject::Comparison PObject::Compare(const PObject & obj) const{  return (Comparison)CompareObjectMemoryDirect(obj);}void PObject::PrintOn(ostream & strm) const{  strm << GetClass();}void PObject::ReadFrom(istream &){}PINDEX PObject::HashFunction() const{  return 0;}///////////////////////////////////////////////////////////////////////////////// General reference counting supportPSmartPointer::PSmartPointer(const PSmartPointer & ptr){

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -