home *** CD-ROM | disk | FTP | other *** search
- /*
- File: MemHooks.cpp
-
- Contains: Memory manager hook classes for debugging
-
- Owned by: Michael Burbidge
- Owned by: Jens Alfke
-
- Copyright: © 1993 - 1995 by Apple Computer, Inc., all rights reserved.
-
- Change History (most recent first):
-
- <9> 8/4/95 DM Leak checking [1267956]
- <8> 5/4/95 jpa Added AboutToAllocate.
- <7> 10/24/94 jpa Constness [1194286]
- <6> 9/29/94 RA 1189812: Mods for 68K build.
- <5> 9/14/94 jpa Eliminated dependencies on rest of OpenDoc.
- [1186692]
- <4> 8/8/94 jpa DidAllocate doesn't offset ptr if it's NULL
- [1179564]
- <3> 8/8/94 jpa Fixed realloc hooks.
- <2> 8/2/94 jpa Now supports realloc. Also optimized some
- code, and fed different zap values into the
- cushion blocks when deleting.
- <1> 7/26/94 jpa first checked in
-
- To Do:
- In Progress:
-
- */
-
-
- #ifndef _MEMCNFIG_
- #include "MemCnfig.h"
- #endif
-
-
- #if MM_DEBUG
-
-
- #ifndef _MEMHOOKS_
- #include "MemHooks.h"
- #endif
-
- #ifndef _PLATFMEM_
- #include "PlatfMem.h"
- #endif
-
- #ifndef _CRAWL_
- #include <Crawl.h>
- #endif
-
-
- //==============================================================================
- // CBlockCushionHook
- //==============================================================================
-
- //------------------------------------------------------------------------------
- // CBlockCushionHook::CBlockCushionHook
- //------------------------------------------------------------------------------
-
- CBlockCushionHook::CBlockCushionHook()
- {
- }
-
- //------------------------------------------------------------------------------
- // CBlockCushionHook::~CBlockCushionHook
- //------------------------------------------------------------------------------
-
- CBlockCushionHook::~CBlockCushionHook()
- {
- }
-
- //------------------------------------------------------------------------------
- // CBlockCushionHook::GetHeaderSize
- //------------------------------------------------------------------------------
-
- ODBlockSize CBlockCushionHook::GetHeaderSize()
- {
- return kPrefixCushionLength;
- }
-
- //------------------------------------------------------------------------------
- // CBlockCushionHook::AboutToAllocate
- //------------------------------------------------------------------------------
-
- ODBlockSize CBlockCushionHook::AboutToAllocate(ODBlockSize size) const
- {
- return size + kPrefixCushionLength + kSuffixCushionLength;
- }
-
- //------------------------------------------------------------------------------
- // CBlockCushionHook::DidAllocate
- //------------------------------------------------------------------------------
-
- void* CBlockCushionHook::DidAllocate(void* blk, ODBlockSize size)
- {
- if( blk == kMMNULL )
- return kMMNULL;
- else {
- unsigned long *prefix
- = (unsigned long *) blk;
- unsigned long *suffix
- = (unsigned long *) ((char *) blk + size - kSuffixCushionLength);
-
- *prefix++ = kPrefixCushionMagicNumber;
- *prefix++ = size;
- *prefix++ = kPrefixCushionMagicNumber;
-
- *suffix = kSuffixCushionMagicNumber;
-
- return (char *) blk + kPrefixCushionLength;
- }
- }
-
- //------------------------------------------------------------------------------
- // CBlockCushionHook::AboutToBlockSize
- //------------------------------------------------------------------------------
-
- const void* CBlockCushionHook::AboutToBlockSize(const void* blk)
- {
- unsigned long *prefix = (unsigned long *) ((char*)blk - kPrefixCushionLength);
-
- if( prefix[0]!=kPrefixCushionMagicNumber || prefix[2]!=kPrefixCushionMagicNumber )
- MM_WARN("Block %p's prefix is invalid",blk);
-
- unsigned long *suffix = (unsigned long *)
- ((char*)prefix + prefix[1] - kSuffixCushionLength);
-
- if( *suffix != kSuffixCushionMagicNumber )
- MM_WARN("Block %p's suffix is invalid",blk);
-
- return prefix;
- }
-
- //------------------------------------------------------------------------------
- // CBlockCushionHook::BasicAboutToFree
- //------------------------------------------------------------------------------
-
- unsigned long* CBlockCushionHook::BasicAboutToFree(void* blk, MMBoolean zap)
- {
- unsigned long *prefix = (unsigned long *) ((char*)blk - kPrefixCushionLength);
-
- if( prefix[0]!=kPrefixCushionMagicNumber || prefix[2]!=kPrefixCushionMagicNumber )
- MM_WARN("Block %p's prefix is invalid",blk);
-
- unsigned long *suffix = (unsigned long *)
- ((char*)prefix + prefix[1] - kSuffixCushionLength);
-
- if( *suffix != kSuffixCushionMagicNumber )
- MM_WARN("Block %p's suffix is invalid",blk);
-
- if( zap )
- prefix[0] = prefix[2] = *suffix = 0xDDDDDDDD; // Zap on free
-
- return prefix;
- }
-
- //------------------------------------------------------------------------------
- // CBlockCushionHook::AboutToFree
- //------------------------------------------------------------------------------
-
- void* CBlockCushionHook::AboutToFree(void* blk)
- {
- return this->BasicAboutToFree(blk,kMMTrue);
- }
-
- //------------------------------------------------------------------------------
- // CBlockCushionHook::AboutToRealloc
- //------------------------------------------------------------------------------
-
- void CBlockCushionHook::AboutToRealloc(void* &blk , ODBlockSize &size)
- {
- // The current block will be freed, and a new one allocated.
- blk = this->BasicAboutToFree(blk,kMMFalse); // Don't zap it, it might not get freed
- size += kPrefixCushionLength + kSuffixCushionLength;
- }
-
- //------------------------------------------------------------------------------
- // CBlockCushionHook::DidRealloc
- //------------------------------------------------------------------------------
-
- void* CBlockCushionHook::DidRealloc(void* oldBlk, void* blk, ODBlockSize size)
- {
- return this->DidAllocate(blk,size);
- }
-
-
-
-
- //==============================================================================
- // CBlockStackCrawlHook
- //==============================================================================\
-
-
- MMBoolean CBlockStackCrawlHook::gTrack;
-
- // Global operator new/delete for StackCrawl objects
- void* operator new( size_t size )
- {
- return MMAllocate(size);
- }
-
- void operator delete( void* block )
- {
- MMFree(block);
- }
-
-
- //------------------------------------------------------------------------------
- // CBlockStackCrawlHook::GetHeaderSize
- //------------------------------------------------------------------------------
-
- ODBlockSize CBlockStackCrawlHook::GetHeaderSize()
- {
- return sizeof(StackCrawl*);
- }
-
- //------------------------------------------------------------------------------
- // CBlockStackCrawlHook::AboutToAllocate
- //------------------------------------------------------------------------------
-
- ODBlockSize CBlockStackCrawlHook::AboutToAllocate(ODBlockSize size) const
- {
- return size + sizeof(StackCrawl*);
- }
-
- //------------------------------------------------------------------------------
- // CBlockStackCrawlHook::DidAllocate
- //------------------------------------------------------------------------------
-
- void* CBlockStackCrawlHook::DidAllocate(void* blk, ODBlockSize size)
- {
- if( blk == kMMNULL )
- return kMMNULL;
- else {
- StackCrawl**stackCrawl = (StackCrawl**)blk; // Points to where it's stored
- if( gTrack ) {
- gTrack = kMMFalse; // Disable to prevent recursion!
- *stackCrawl = StackCrawl::New(3,-5);
- gTrack = kMMTrue;
- } else
- *stackCrawl = 0;
- return stackCrawl + 1;
- }
- }
-
- //------------------------------------------------------------------------------
- // CBlockStackCrawlHook::AboutToBlockSize
- //------------------------------------------------------------------------------
-
- const void* CBlockStackCrawlHook::AboutToBlockSize(const void* blk)
- {
- return ((StackCrawl**)blk) - 1;
- }
-
- //------------------------------------------------------------------------------
- // CBlockStackCrawlHook::BasicAboutToFree
- //------------------------------------------------------------------------------
-
- void* CBlockStackCrawlHook::BasicAboutToFree(void* blk, MMBoolean zap)
- {
- StackCrawl** s = (StackCrawl**)blk - 1;
- if( zap ) {
- delete (StackCrawl*) ((size_t)(*s) & ~3); // Delete crawl, mask lo bits
- *s = (StackCrawl*) 0xDDDDDDDD; // Zap on free
- }
- return s;
- }
-
- //------------------------------------------------------------------------------
- // CBlockStackCrawlHook::AboutToFree
- //------------------------------------------------------------------------------
-
- void* CBlockStackCrawlHook::AboutToFree(void* blk)
- {
- return this->BasicAboutToFree(blk,kMMTrue);
- }
-
- //------------------------------------------------------------------------------
- // CBlockStackCrawlHook::AboutToRealloc
- //------------------------------------------------------------------------------
-
- void CBlockStackCrawlHook::AboutToRealloc(void* &blk , ODBlockSize &size)
- {
- // The current block will be freed, and a new one allocated.
- blk = this->BasicAboutToFree(blk,kMMFalse); // Don't zap it, it might not get freed
- size += sizeof(StackCrawl*);
- }
-
- //------------------------------------------------------------------------------
- // CBlockStackCrawlHook::DidRealloc
- //------------------------------------------------------------------------------
-
- void* CBlockStackCrawlHook::DidRealloc(void* oldBlk, void* blk, ODBlockSize size)
- {
- return this->DidAllocate(blk,size);
- }
-
- //------------------------------------------------------------------------------
- // CBlockStackCrawlHook::GetType
- //------------------------------------------------------------------------------
-
- long CBlockStackCrawlHook::GetType( ) const
- {
- return kBlockStackCrawlHookType;
- }
-
- //------------------------------------------------------------------------------
- // CBlockStackCrawlHook::GetStackCrawl
- //------------------------------------------------------------------------------
-
- StackCrawl* CBlockStackCrawlHook::GetStackCrawl(const void* blk) const
- {
- return * (StackCrawl**) blk;
- }
-
- //------------------------------------------------------------------------------
- // CBlockStackCrawlHook::SetStackCrawl
- //------------------------------------------------------------------------------
-
- void CBlockStackCrawlHook::SetStackCrawl(const void* blk, StackCrawl* s)
- {
- * (StackCrawl**) blk = s;
- }
-
-
-
-
- #endif /*MM_DEBUG*/