TIP #128: Ability to Install a Custom Memory Allocator


TIP:128
Title:Ability to Install a Custom Memory Allocator
Version:$Revision: 1.5 $
Authors: Christophe Cap <udragon at users dot sourceforge dot net>
Mike Jackson <hhyJackson1275 at who-got-mail dot com>
State:Rejected
Type:Project
Tcl-Version:8.6
Vote:Done
Created:Thursday, 13 March 2003

Abstract

This TIP alters Tcl to allow embedded uses of the Tcl library (and any extensions) to either use the Tcl memory allocators as their main allocator (especially in C++) or to set the memory allocator that Tcl uses for itself through ckalloc().

Background

A while ago I was experiencing troubles when allocating images ([image create photo]) while memory was already exhausted, my app crashed (due to known bug item #698571, which is in the HEAD by now!) This shouldn't happen anyway since my application had it's new handler set.

Tracing down the source of the allocators I noticed that Tcl uses HeapAlloc() (on Win32) to allocate its memory. Why not use malloc()?

New/Malloc Handler

It would be nice to be able to catch memory allocation errors with a custom new handler.

A solution could be to replace HeapAlloc() (on Win32) and other platform specific memory handlers should be replaced by malloc().

This way a new handler can by set through set_new_handler().

Note that the Microsoft VC++ compiler has some ANSI incompatibility in that it uses _set_new_handler() rather than set_new_handler(). We would naturally conceal this platform difference.

For example:

#include <new> 

//
// New handler for Microsoft Visual C++ compiler
//

#ifdef _MSC_VER
#include <new.h>

int __cdecl _newHandler(size_t size )
{
   // Do whatever

   return 0;
}

#else

//
// Ansi C/C++ new handler
//

void __cdecl _newHandler( void )
{
   // Do whatever
}
#endif

void sethandlers(void)
{
// Microsoft compiler 
#ifdef _MSC_VER  

   _set_new_handler (_newHandler); // Setup new handler
   _set_new_mode( 1 ); // Re-route malloc failures to new handler !

// Ansi compiler 

#else 

   set_new_handler (_newHandler); // ANSI new handler

#endif
}

Tcl Implementation

The above suggested solution could work for some compilers, but may not for all (some compilers might not support setting a malloc failure callback.) Therefore a Tcl custom new handler functionality could be implemented that handles Tcl specific memory allocation failures.

Something like: Tcl_SetMemHandler()?

Copyright

This document has been placed in the public domain.


Powered by Tcl[Index] [History] [HTML Format] [Source Format] [LaTeX Format] [Text Format] [XML Format] [*roff Format (experimental)] [RTF Format (experimental)]

TIP AutoGenerator - written by Donal K. Fellows