<html> <head> <title>OgreMemoryManager.h Source File - OGRE Documentation</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <link type="text/css" rel="stylesheet" href="style.css"> </head> <body> <!-- Generated by Doxygen 1.3.6 --> <div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical List</a> | <a class="qindex" href="annotated.html">Class List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="namespacemembers.html">Namespace Members</a> | <a class="qindex" href="functions.html">Class Members</a> | <a class="qindex" href="globals.html">File Members</a> | <a class="qindex" href="pages.html">Related Pages</a></div> <h1>OgreMemoryManager.h</h1><a href="OgreMemoryManager_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 <span class="comment">/*</span> 00002 <span class="comment">-----------------------------------------------------------------------------</span> 00003 <span class="comment">This source file is part of OGRE</span> 00004 <span class="comment">(Object-oriented Graphics Rendering Engine)</span> 00005 <span class="comment">For the latest info, see http://www.ogre3d.org/</span> 00006 <span class="comment"></span> 00007 <span class="comment">Copyright (c) 2000-2005 The OGRE Team</span> 00008 <span class="comment">Also see acknowledgements in Readme.html</span> 00009 <span class="comment"></span> 00010 <span class="comment">This program is free software; you can redistribute it and/or modify it under</span> 00011 <span class="comment">the terms of the GNU Lesser General Public License as published by the Free Software</span> 00012 <span class="comment">Foundation; either version 2 of the License, or (at your option) any later</span> 00013 <span class="comment">version.</span> 00014 <span class="comment"></span> 00015 <span class="comment">This program is distributed in the hope that it will be useful, but WITHOUT</span> 00016 <span class="comment">ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS</span> 00017 <span class="comment">FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.</span> 00018 <span class="comment"></span> 00019 <span class="comment">You should have received a copy of the GNU Lesser General Public License along with</span> 00020 <span class="comment">this program; if not, write to the Free Software Foundation, Inc., 59 Temple</span> 00021 <span class="comment">Place - Suite 330, Boston, MA 02111-1307, USA, or go to</span> 00022 <span class="comment">http://www.gnu.org/copyleft/lesser.txt.</span> 00023 <span class="comment">-----------------------------------------------------------------------------</span> 00024 <span class="comment">*/</span> 00025 <span class="comment">//---- ORIGINAL COPYRIGHT FOLLOWS -------------------------------------------</span> 00026 <span class="comment">// ---------------------------------------------------------------------------------------------------------------------------------</span> 00027 <span class="comment">// Copyright 2000, Paul Nettle. All rights reserved.</span> 00028 <span class="comment">//</span> 00029 <span class="comment">// You are free to use this source code in any commercial or non-commercial product.</span> 00030 <span class="comment">//</span> 00031 <span class="comment">// mmgr.cpp - Memory manager & tracking software</span> 00032 <span class="comment">//</span> 00033 <span class="comment">// The most recent version of this software can be found at: ftp://ftp.GraphicsPapers.com/pub/ProgrammingTools/MemoryManagers/</span> 00034 <span class="comment">//</span> 00035 <span class="comment">// [NOTE: Best when viewed with 8-character tabs]</span> 00036 <span class="comment">//</span> 00037 <span class="comment">// ---------------------------------------------------------------------------------------------------------------------------------</span> 00038 <span class="preprocessor">#ifndef __MemoryManager_H__</span> 00039 <span class="preprocessor"></span><span class="preprocessor">#define __MemoryManager_H__</span> 00040 <span class="preprocessor"></span> 00041 <span class="preprocessor">#include "<a class="code" href="OgrePlatform_8h.html">OgrePlatform.h</a>"</span> 00042 <span class="preprocessor">#include "<a class="code" href="OgreStdHeaders_8h.html">OgreStdHeaders.h</a>"</span> 00043 00044 <span class="keyword">namespace </span>Ogre { 00045 00087 <span class="preprocessor">#if OGRE_DEBUG_MEMORY_MANAGER && OGRE_DEBUG_MODE</span> 00088 <span class="preprocessor"></span> 00089 <span class="preprocessor">#ifndef __FUNCTION__</span> 00090 <span class="preprocessor"></span><span class="preprocessor">#define __FUNCTION__ "???"</span> 00091 <span class="preprocessor"></span><span class="preprocessor">#endif</span> 00092 <span class="preprocessor"></span> 00093 } 00094 00095 <span class="comment">//-----------------------------------------------------------------------------</span> 00096 <span class="comment">// We have to declare the global new([])/delete([]) operators before declaring </span> 00097 <span class="comment">// the Ogre::MemoryManager class since it lists them as friend functions</span> 00098 <span class="keywordtype">void</span> *<a class="code" href="OgreMemoryManager_8h.html#a0">operator new</a>(size_t reportedSize); 00099 <span class="keywordtype">void</span> *<a class="code" href="OgreMemoryManager_8h.html#a1">operator new[]</a>(size_t reportedSize); 00100 <span class="keywordtype">void</span> <a class="code" href="OgreMemoryManager_8h.html#a2">operator delete</a>(<span class="keywordtype">void</span> *reportedAddress); 00101 <span class="keywordtype">void</span> <a class="code" href="OgreMemoryManager_8h.html#a3">operator delete[]</a>(<span class="keywordtype">void</span> *reportedAddress); 00102 <span class="comment">//-----------------------------------------------------------------------------</span> 00103 00104 <span class="keyword">namespace </span><a class="code" href="classOgre.html">Ogre</a> { 00105 00115 <span class="keyword">typedef</span> <span class="keyword">struct </span>tag_au 00116 { 00117 size_t actualSize; 00118 size_t reportedSize; 00119 00120 <span class="keywordtype">void</span> *actualAddress; 00121 <span class="keywordtype">void</span> *reportedAddress; 00122 00123 <span class="keywordtype">char</span> sourceFile[40]; 00124 <span class="keywordtype">char</span> sourceFunc[40]; 00125 00126 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sourceLine; 00127 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> allocationType; 00128 00129 <span class="keywordtype">bool</span> breakOnDealloc; 00130 <span class="keywordtype">bool</span> breakOnRealloc; 00131 00132 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> allocationNumber; 00133 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> processID; 00134 00135 <span class="keyword">struct </span><a class="code" href="classtag__au.html">tag_au</a> *next; 00136 <span class="keyword">struct </span><a class="code" href="classtag__au.html">tag_au</a> *prev; 00137 } sAllocUnit; 00138 00139 <span class="keyword">typedef</span> <span class="keyword">struct</span> 00140 <span class="keyword"> </span>{ 00141 size_t totalReportedMemory; 00142 size_t totalActualMemory; 00143 00144 size_t peakReportedMemory; 00145 size_t peakActualMemory; 00146 00147 size_t accumulatedReportedMemory; 00148 size_t accumulatedActualMemory; 00149 size_t accumulatedAllocUnitCount; 00150 00151 size_t totalAllocUnitCount; 00152 size_t peakAllocUnitCount; 00153 } sMStats; 00154 00155 <span class="keyword">enum</span> 00156 { 00157 m_alloc_unknown = 0, 00158 m_alloc_new = 1, 00159 m_alloc_new_array = 2, 00160 m_alloc_malloc = 3, 00161 m_alloc_calloc = 4, 00162 m_alloc_realloc = 5, 00163 m_alloc_delete = 6, 00164 m_alloc_delete_array = 7, 00165 m_alloc_free = 8 00166 }; 00167 00170 <span class="keyword">class </span><a class="code" href="OgrePlatform_8h.html#a13">_OgreExport</a> MemoryManager 00171 { 00172 <span class="keyword">friend</span> <span class="keywordtype">void</span> * ::operator <span class="keyword">new</span>(size_t); 00173 <span class="keyword">friend</span> <span class="keywordtype">void</span> * ::operator <span class="keyword">new</span>[](size_t); 00174 <span class="keyword">friend</span> <a class="code" href="OgreMemoryManager_8h.html#a2">void ::operator delete</a>(<span class="keywordtype">void</span>*); 00175 <span class="keyword">friend</span> <a class="code" href="OgreMemoryManager_8h.html#a3">void ::operator delete[]</a>(<span class="keywordtype">void</span>*); 00176 00177 <span class="keyword">public</span>: 00178 <span class="keyword">static</span> MemoryManager sMemManager; 00179 00180 <span class="keyword">private</span>: 00182 <span class="keywordtype">unsigned</span> m_uProcessIDs; 00184 <span class="keywordtype">bool</span> m_bDeinitTime; 00185 00186 <span class="preprocessor">#ifndef __BORLANDC__</span> 00187 <span class="preprocessor"></span> <span class="keyword">private</span>: 00188 <span class="preprocessor">#else</span> 00189 <span class="preprocessor"></span> <span class="keyword">public</span>: 00190 <span class="preprocessor">#endif</span> 00191 <span class="preprocessor"></span> <span class="comment">//-------------------------------------------------------------------------</span> 00192 <span class="comment">// Wrappers for the new/delete functions </span> 00193 <span class="keywordtype">void</span> *op_new_sc( size_t reportedSize, <span class="keywordtype">unsigned</span> processID ); 00194 <span class="keywordtype">void</span> *op_new_vc( size_t reportedSize, <span class="keywordtype">unsigned</span> processID ); 00195 00196 <span class="keywordtype">void</span> *op_new_sc( size_t reportedSize, <span class="keyword">const</span> <span class="keywordtype">char</span> *sourceFile, <span class="keywordtype">int</span> sourceLine, <span class="keywordtype">unsigned</span> processID ); 00197 <span class="keywordtype">void</span> *op_new_vc( size_t reportedSize, <span class="keyword">const</span> <span class="keywordtype">char</span> *sourceFile, <span class="keywordtype">int</span> sourceLine, <span class="keywordtype">unsigned</span> processID ); 00198 00199 <span class="keywordtype">void</span> op_del_sc( <span class="keywordtype">void</span> *reportedAddress, <span class="keywordtype">unsigned</span> processID ); 00200 <span class="keywordtype">void</span> op_del_vc( <span class="keywordtype">void</span> *reportedAddress, <span class="keywordtype">unsigned</span> processID ); 00201 <span class="comment">//-------------------------------------------------------------------------</span> 00202 00217 <span class="keywordtype">unsigned</span> _getProcessID(); 00218 00219 <span class="keyword">public</span>: 00220 MemoryManager(); 00221 ~MemoryManager(); 00222 00223 <span class="comment">//-------------------------------------------------------------------------</span> 00224 <span class="comment">// Used by the macros </span> 00225 <span class="keywordtype">void</span> setOwner(<span class="keyword">const</span> <span class="keywordtype">char</span> *file, <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> line, <span class="keyword">const</span> <span class="keywordtype">char</span> *func); 00226 <span class="comment">//-------------------------------------------------------------------------</span> 00227 00228 <span class="comment">//-------------------------------------------------------------------------</span> 00229 <span class="comment">// Allocation breakpoints </span> 00230 <span class="keywordtype">bool</span> &breakOnRealloc(<span class="keywordtype">void</span> *reportedAddress); 00231 <span class="keywordtype">bool</span> &breakOnDealloc( <span class="keywordtype">void</span> *reportedAddress ); 00232 <span class="keywordtype">void</span> breakOnAlloc( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count ); 00233 <span class="comment">//-------------------------------------------------------------------------</span> 00234 00235 <span class="comment">//-------------------------------------------------------------------------</span> 00236 <span class="comment">// The meat & potatoes of the memory tracking software</span> 00237 00250 <span class="keywordtype">void</span> * allocMem( 00251 <span class="keyword">const</span> <span class="keywordtype">char</span> *sourceFile, 00252 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sourceLine, 00253 <span class="keyword">const</span> <span class="keywordtype">char</span> *sourceFunc, 00254 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> allocationType, 00255 <span class="keyword">const</span> size_t reportedSize, 00256 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> processID ); 00257 00273 <span class="keywordtype">void</span> * rllocMem( 00274 <span class="keyword">const</span> <span class="keywordtype">char</span> *sourceFile, 00275 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sourceLine, 00276 <span class="keyword">const</span> <span class="keywordtype">char</span> *sourceFunc, 00277 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> reallocationType, 00278 <span class="keyword">const</span> size_t reportedSize, 00279 <span class="keywordtype">void</span> *reportedAddress, 00280 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> processID ); 00281 00304 <span class="keywordtype">void</span> dllocMem( 00305 <span class="keyword">const</span> <span class="keywordtype">char</span> *sourceFile, 00306 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sourceLine, 00307 <span class="keyword">const</span> <span class="keywordtype">char</span> *sourceFunc, 00308 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> deallocationType, 00309 <span class="keyword">const</span> <span class="keywordtype">void</span> *reportedAddress, 00310 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> processID ); 00311 <span class="comment">//-------------------------------------------------------------------------</span> 00312 00313 <span class="comment">//-------------------------------------------------------------------------</span> 00314 <span class="comment">// Utilitarian functions </span> 00315 <span class="keywordtype">bool</span> validateAddr(<span class="keyword">const</span> <span class="keywordtype">void</span> *reportedAddress); 00316 <span class="keywordtype">bool</span> validateAlloc(<span class="keyword">const</span> sAllocUnit *allocUnit); 00317 <span class="keywordtype">bool</span> validateAllAllocs(); 00318 <span class="comment">//-------------------------------------------------------------------------</span> 00319 00320 <span class="comment">//-------------------------------------------------------------------------</span> 00321 <span class="comment">// Unused RAM calculations </span> 00322 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> calcUnused( <span class="keyword">const</span> sAllocUnit *allocUnit ); 00323 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> calcAllUnused(); 00324 <span class="comment">//-------------------------------------------------------------------------</span> 00325 00326 <span class="comment">//-------------------------------------------------------------------------</span> 00327 <span class="comment">// Logging and reporting </span> 00328 <span class="keywordtype">void</span> dumpAllocUnit( <span class="keyword">const</span> sAllocUnit *allocUnit, <span class="keyword">const</span> <span class="keywordtype">char</span> *prefix = <span class="stringliteral">""</span> ); 00329 <span class="keywordtype">void</span> dumpMemReport( <span class="keyword">const</span> <span class="keywordtype">char</span> *filename = <span class="stringliteral">"memreport.log"</span>, <span class="keyword">const</span> <span class="keywordtype">bool</span> overwrite = <span class="keyword">true</span> ); 00330 sMStats getMemStats(); 00331 <span class="comment">//------------------------------------------------------------------------- </span> 00332 }; 00333 } 00334 00341 <span class="keyword">static</span> <span class="keywordtype">unsigned</span> gProcessID = 0; 00342 00343 <span class="comment">//-----------------------------------------------------------------------------</span> 00344 <span class="comment">// Overridden global new([])/delete([]) functions</span> 00345 <span class="comment">//</span> 00346 <span class="keyword">inline</span> <span class="keywordtype">void</span> *<a class="code" href="OgreMemoryManager_8h.html#a0">operator new</a>(size_t reportedSize) 00347 { 00348 <span class="keywordflow">if</span>( !gProcessID ) 00349 gProcessID = <a class="code" href="classOgre_1_1MemoryManager.html#Ogre_1_1MemoryManagers0">Ogre::MemoryManager::sMemManager</a>._getProcessID(); 00350 <span class="keywordflow">return</span> <a class="code" href="classOgre_1_1MemoryManager.html#Ogre_1_1MemoryManagers0">Ogre::MemoryManager::sMemManager</a>.op_new_sc( reportedSize, gProcessID ); 00351 } 00352 <span class="keyword">inline</span> <span class="keywordtype">void</span> *<a class="code" href="OgreMemoryManager_8h.html#a1">operator new[]</a>(size_t reportedSize) 00353 { 00354 <span class="keywordflow">if</span>( !gProcessID ) 00355 gProcessID = <a class="code" href="classOgre_1_1MemoryManager.html#Ogre_1_1MemoryManagers0">Ogre::MemoryManager::sMemManager</a>._getProcessID(); 00356 <span class="keywordflow">return</span> <a class="code" href="classOgre_1_1MemoryManager.html#Ogre_1_1MemoryManagers0">Ogre::MemoryManager::sMemManager</a>.op_new_vc( reportedSize, gProcessID ); 00357 } 00358 00359 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="OgreMemoryManager_8h.html#a2">operator delete</a>(<span class="keywordtype">void</span> *reportedAddress) 00360 { 00361 <a class="code" href="classOgre_1_1MemoryManager.html#Ogre_1_1MemoryManagers0">Ogre::MemoryManager::sMemManager</a>.op_del_sc( reportedAddress, gProcessID ); 00362 } 00363 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="OgreMemoryManager_8h.html#a3">operator delete[]</a>(<span class="keywordtype">void</span> *reportedAddress) 00364 { 00365 <a class="code" href="classOgre_1_1MemoryManager.html#Ogre_1_1MemoryManagers0">Ogre::MemoryManager::sMemManager</a>.op_del_vc( reportedAddress, gProcessID ); 00366 } 00367 <span class="comment">//-----------------------------------------------------------------------------</span> 00368 00369 <span class="comment">//-----------------------------------------------------------------------------</span> 00370 <span class="comment">// This header adds the *alloc/free macros, wrapping the C functions</span> 00371 <span class="preprocessor">#include "<a class="code" href="OgreMemoryMacros_8h.html">OgreMemoryMacros.h</a>"</span> 00372 <span class="comment">//-----------------------------------------------------------------------------</span> 00373 00374 <span class="preprocessor">#else</span> 00375 <span class="preprocessor"></span> <a name="l00378"></a><a class="code" href="classOgre_1_1MemoryManager.html">00378</a> <span class="keyword">class </span><a class="code" href="class__OgreExport.html">_OgreExport</a> MemoryManager 00379 { 00380 <span class="keyword">public</span>: <a name="l00381"></a><a class="code" href="classOgre_1_1MemoryManager.html#Ogre_1_1MemoryManagers0">00381</a> <span class="keyword">static</span> MemoryManager sMemManager; 00382 00383 MemoryManager(); 00384 ~MemoryManager(); 00385 00388 <span class="keywordtype">void</span> *allocMem( <span class="keyword">const</span> <span class="keywordtype">char</span> *szFile, size_t uLine, size_t count ) <span class="keywordflow">throw</span> ( ); 00389 00392 <span class="keywordtype">void</span> *rllocMem( <span class="keyword">const</span> <span class="keywordtype">char</span> *szFile, size_t uLine, <span class="keywordtype">void</span> *ptr , size_t count ) <span class="keywordflow">throw</span> ( ); 00393 00396 <span class="keywordtype">void</span> *cllocMem( <span class="keyword">const</span> <span class="keywordtype">char</span> *szFile, size_t uLine, size_t num, size_t size ) <span class="keywordflow">throw</span> ( ); 00397 00400 <span class="keywordtype">void</span> dllocMem( <span class="keyword">const</span> <span class="keywordtype">char</span> *szFile, size_t uLine, <span class="keywordtype">void</span> *ptr ) <span class="keywordflow">throw</span> ( ); 00401 }; 00402 00403 } 00404 00405 <span class="comment">//-----------------------------------------------------------------------------</span> 00406 <span class="comment">// Overridden global new([])/delete([]) functions</span> 00407 <span class="comment">//</span> <a name="l00408"></a><a class="code" href="OgreMemoryManager_8h.html#a0">00408</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> *<a class="code" href="OgreMemoryManager_8h.html#a0">operator new</a>( size_t count ) 00409 { 00410 <span class="keywordflow">return</span> Ogre::MemoryManager::sMemManager.allocMem( <span class="stringliteral">""</span>, 0, count ); 00411 } 00412 <a name="l00413"></a><a class="code" href="OgreMemoryManager_8h.html#a1">00413</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> *<a class="code" href="OgreMemoryManager_8h.html#a1">operator new[]</a>( size_t count ) 00414 { 00415 <span class="keywordflow">return</span> Ogre::MemoryManager::sMemManager.allocMem( <span class="stringliteral">""</span>, 0, count ); 00416 } 00417 <a name="l00418"></a><a class="code" href="OgreMemoryManager_8h.html#a2">00418</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="OgreMemoryManager_8h.html#a2">operator delete</a>( <span class="keywordtype">void</span>* ptr ) 00419 { 00420 Ogre::MemoryManager::sMemManager.dllocMem( <span class="stringliteral">""</span>, 0, ptr ); 00421 } 00422 <a name="l00423"></a><a class="code" href="OgreMemoryManager_8h.html#a3">00423</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="OgreMemoryManager_8h.html#a3">operator delete[]</a>( <span class="keywordtype">void</span>* ptr ) 00424 { 00425 Ogre::MemoryManager::sMemManager.dllocMem( <span class="stringliteral">""</span>, 0, ptr ); 00426 } 00427 <span class="comment">//-----------------------------------------------------------------------------</span> 00428 00429 <span class="comment">//-----------------------------------------------------------------------------</span> 00430 <span class="comment">// This header adds the *alloc/free macros, wrapping the C functions</span> 00431 <span class="preprocessor">#include "<a class="code" href="OgreMemoryMacros_8h.html">OgreMemoryMacros.h</a>"</span> 00432 <span class="comment">//-----------------------------------------------------------------------------</span> 00433 00434 <span class="preprocessor">#endif</span> 00435 <span class="preprocessor"></span> 00436 <span class="preprocessor">#endif</span> 00437 <span class="preprocessor"></span> </pre></div><p> Copyright © 2000-2005 by The OGRE Team<br /> Last modified Wed Feb 23 00:19:09 2005 </p> </body> </html>