Chris@87: /* An arena-like memory interface for the compiler. Chris@87: */ Chris@87: Chris@87: #ifndef Py_PYARENA_H Chris@87: #define Py_PYARENA_H Chris@87: Chris@87: #ifdef __cplusplus Chris@87: extern "C" { Chris@87: #endif Chris@87: Chris@87: typedef struct _arena PyArena; Chris@87: Chris@87: /* PyArena_New() and PyArena_Free() create a new arena and free it, Chris@87: respectively. Once an arena has been created, it can be used Chris@87: to allocate memory via PyArena_Malloc(). Pointers to PyObject can Chris@87: also be registered with the arena via PyArena_AddPyObject(), and the Chris@87: arena will ensure that the PyObjects stay alive at least until Chris@87: PyArena_Free() is called. When an arena is freed, all the memory it Chris@87: allocated is freed, the arena releases internal references to registered Chris@87: PyObject*, and none of its pointers are valid. Chris@87: XXX (tim) What does "none of its pointers are valid" mean? Does it Chris@87: XXX mean that pointers previously obtained via PyArena_Malloc() are Chris@87: XXX no longer valid? (That's clearly true, but not sure that's what Chris@87: XXX the text is trying to say.) Chris@87: Chris@87: PyArena_New() returns an arena pointer. On error, it Chris@87: returns a negative number and sets an exception. Chris@87: XXX (tim): Not true. On error, PyArena_New() actually returns NULL, Chris@87: XXX and looks like it may or may not set an exception (e.g., if the Chris@87: XXX internal PyList_New(0) returns NULL, PyArena_New() passes that on Chris@87: XXX and an exception is set; OTOH, if the internal Chris@87: XXX block_new(DEFAULT_BLOCK_SIZE) returns NULL, that's passed on but Chris@87: XXX an exception is not set in that case). Chris@87: */ Chris@87: PyAPI_FUNC(PyArena *) PyArena_New(void); Chris@87: PyAPI_FUNC(void) PyArena_Free(PyArena *); Chris@87: Chris@87: /* Mostly like malloc(), return the address of a block of memory spanning Chris@87: * `size` bytes, or return NULL (without setting an exception) if enough Chris@87: * new memory can't be obtained. Unlike malloc(0), PyArena_Malloc() with Chris@87: * size=0 does not guarantee to return a unique pointer (the pointer Chris@87: * returned may equal one or more other pointers obtained from Chris@87: * PyArena_Malloc()). Chris@87: * Note that pointers obtained via PyArena_Malloc() must never be passed to Chris@87: * the system free() or realloc(), or to any of Python's similar memory- Chris@87: * management functions. PyArena_Malloc()-obtained pointers remain valid Chris@87: * until PyArena_Free(ar) is called, at which point all pointers obtained Chris@87: * from the arena `ar` become invalid simultaneously. Chris@87: */ Chris@87: PyAPI_FUNC(void *) PyArena_Malloc(PyArena *, size_t size); Chris@87: Chris@87: /* This routine isn't a proper arena allocation routine. It takes Chris@87: * a PyObject* and records it so that it can be DECREFed when the Chris@87: * arena is freed. Chris@87: */ Chris@87: PyAPI_FUNC(int) PyArena_AddPyObject(PyArena *, PyObject *); Chris@87: Chris@87: #ifdef __cplusplus Chris@87: } Chris@87: #endif Chris@87: Chris@87: #endif /* !Py_PYARENA_H */