/*
Copyright (c) 1993 Xerox Corporation. All rights reserved.
*/
/*
$Id$
$Date$
*
* PCR Memory Management public interface
*/
/* Chauser, October 28, 1993 4:22 pm PDT */
#ifndef ←←PCR←MM←h
#define ←←PCR←MM←h 1
#include <config/PCR←StdTypes.h>
#include <stddef.h>
/*
* A simple replace-able memory manager interface
*
* This is not *really* object oriented,
* since the procs in an object must share state covertly.
*
* Implementations are expected to use the POSIX system-provided
* malloc/calloc to allocate their own heap space.
*
* Clients (wizards excepted) are expected *never* to use
* malloc/calloc/realloc/free directly.
*/
typedef void * ((PCR←MM←AllocProc)(
size←t size, PCR←Bool ptrFree, PCR←Bool clear ));
/*
Allocate memory.
The ptrFree flag is a hint that says it's okay for a GC
to not trace through the object.
The clear argument causes the allocated area to be initialized to zeroes.
*/
typedef void * ((PCR←MM←ReallocProc)(void *p, size←t size));
/*
Grow / shrink object p, as in the standard C library routine.
The ptrFree property is preserved.
*/
typedef void ((PCR←MM←FreeProc)(void *p));
/*
Explicit free.
*/
typedef PCR←ERes ((PCR←MM←EnumerateProc)(
PCR←Bool ptrFree,
PCR←ERes (*proc)(void *p, size←t size, PCR←Any data),
PCR←Any data
));
/*
Enumerate all currently allocated pointer-containing
(if ptrFree is false) or pointer-free (if ptrFree is true)
objects.
The ptrFree characterization is just a hint -- a conservative
system is free to ignore it and treat all objects as
pointer-containing.
Enumeration is terminated if proc returns error.
*/
typedef void ((PCR←MM←ShutdownProc)(void));
/*
Terminate any currently running daemons (e.g GC).
Calls to allocate/free and enumeration procs are still legitimate
but will not restart any daemons or cause garbage collections.
This is called automatically by PCR←MM←Install() below.
*/
extern unsigned long PCR←MM←defaultMagic;
struct PCR←MM←ProcsRep {
unsigned long mmp←magic;
PCR←MM←AllocProc *mmp←alloc;
PCR←MM←ReallocProc *mmp←realloc;
PCR←MM←FreeProc *mmp←free;
PCR←MM←FreeProc *mmp←unsafeFree;
PCR←MM←EnumerateProc *mmp←enumerate;
PCR←MM←ShutdownProc *mmp←shutdown;
};
typedef struct PCR←MM←ProcsRep PCR←MM←Procs;
extern PCR←MM←Procs * volatile PCR←MM←installedProcs;
extern void
PCR←MM←Install(PCR←MM←Procs *self, PCR←MM←Procs **prev);
/*
Atomically
call shutdown proc of previous implementation,
store previous implementation into *prev
install self
No calls to new implementation are performed until
previous one has been shut down and copied to *prev.
*/
/*
* C clients may use the following sugared names:
*
* For allocation:
* (*(PCR←MM←installedProcs->mmp←alloc))(sz, ptrFree, clear)
* PCR←MM←Alloc(sz, ptrFree, clear)
*
* malloc(sz) -- renamed in posix hdr file
* PCR←malloc(sz)
* PCR←MM←Malloc(sz)
*
* etc.
*/
extern void * (PCR←MM←Alloc(size←t size, PCR←Bool ptrFree, PCR←Bool clear));
# define PCR←MM←Alloc(sz,pf,cl) \
(*(PCR←MM←installedProcs->mmp←alloc))((sz), (pf), (cl))
extern void * (PCR←MM←New(size←t size));
# define PCR←MM←New(sz) \
(*(PCR←MM←installedProcs->mmp←alloc))( \
(sz), PCR←Bool←false, PCR←Bool←true )
extern void * (PCR←MM←Malloc(size←t size));
# define PCR←MM←Malloc(sz) \
(*(PCR←MM←installedProcs->mmp←alloc))( \
(sz), PCR←Bool←false, PCR←Bool←false )
extern void * (PCR←MM←Realloc(void *p, size←t size));
# define PCR←MM←Realloc(p,sz) \
(*(PCR←MM←installedProcs->mmp←realloc))((p), (sz))
extern void (PCR←MM←Free(void *p));
# define PCR←MM←Free(p) \
(*(PCR←MM←installedProcs->mmp←free))(p)
extern void (PCR←MM←UnsafeFree(void *p));
# define PCR←MM←UnsafeFree(p) \
(*(PCR←MM←installedProcs->mmp←unsafeFree))(p)
extern PCR←ERes (PCR←MM←Enumerate(
PCR←Bool ptrFree,
PCR←ERes (*proc)(void *p, size←t size, PCR←Any data),
PCR←Any data
));
# define PCR←MM←Enumerate(pf,proc,data) \
(*(PCR←MM←installedProcs->mmp←enumerate))((pf), (proc), (data))
#endif /* ! ←←PCR←MM←h */
/*
$Log$
*/