view dmd/mem.h @ 1317:4099548c80e0

Allocate objects on the stack if they (a) don't have a destructor, and (b) don't override the delete operator (on top of the regular conditions for stack allocation that also apply to arrays, structs, etc.). The "no destructor" clause is not strictly necessary, but calling them at the right time would be tricky to say the least; it would involve, among other things, "manually" inserting a try-finally block around anything that might throw exceptions not caught in the current function. Note: objects with custom new operators are automatically ignored because they don't use the regular allocation runtime call, so there's no need to pay special attention to them.
author Frits van Bommel <fvbommel wxs.nl>
date Sat, 09 May 2009 00:50:15 +0200
parents c53b6e3fe49a
children
line wrap: on
line source

// Copyright (C) 2000-2001 by Chromium Communications
// All Rights Reserved

#ifndef ROOT_MEM_H
#define ROOT_MEM_H

#include <stddef.h>	// for size_t

typedef void (*FINALIZERPROC)(void* pObj, void* pClientData);

struct GC;			// thread specific allocator

struct Mem
{
    GC *gc;			// pointer to our thread specific allocator
    Mem() { gc = NULL; }

    void init();

    // Derive from Mem to get these storage allocators instead of global new/delete
    void * operator new(size_t m_size);
    void * operator new(size_t m_size, Mem *mem);
    void * operator new(size_t m_size, GC *gc);
    void operator delete(void *p);

    void * operator new[](size_t m_size);
    void operator delete[](void *p);

    char *strdup(const char *s);
    void *malloc(size_t size);
    void *malloc_uncollectable(size_t size);
    void *calloc(size_t size, size_t n);
    void *realloc(void *p, size_t size);
    void free(void *p);
    void free_uncollectable(void *p);
    void *mallocdup(void *o, size_t size);
    void error();
    void check(void *p);	// validate pointer
    void fullcollect();		// do full garbage collection
    void fullcollectNoStack();	// do full garbage collection, no scan stack
    void mark(void *pointer);
    void addroots(char* pStart, char* pEnd);
    void removeroots(char* pStart);
    void setFinalizer(void* pObj, FINALIZERPROC pFn, void* pClientData);
    void setStackBottom(void *bottom);
    GC *getThreadGC();		// get apartment allocator for this thread
};

extern Mem mem;

#endif /* ROOT_MEM_H */