Sophie

Sophie

distrib > Mandriva > 10.2 > i586 > media > contrib > by-pkgid > 04e5d8c10ae76748689b4e7f48e0fa33 > files > 606

libogre5-devel-1.0.0-1mdk.i586.rpm

<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&nbsp;Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical&nbsp;List</a> | <a class="qindex" href="annotated.html">Class&nbsp;List</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="namespacemembers.html">Namespace&nbsp;Members</a> | <a class="qindex" href="functions.html">Class&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;Members</a> | <a class="qindex" href="pages.html">Related&nbsp;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 &amp; 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 &amp;&amp; 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> &amp;breakOnRealloc(<span class="keywordtype">void</span> *reportedAddress);
00231         <span class="keywordtype">bool</span> &amp;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 &amp; 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 &copy; 2000-2005 by The OGRE Team<br />
Last modified Wed Feb 23 00:19:09 2005
</p>
</body>
</html>