Skip to content

Commit

Permalink
Use simple PyList to implement list of PyObject pointers
Browse files Browse the repository at this point in the history
  • Loading branch information
jeremyhylton committed Feb 28, 2006
1 parent 400cbc3 commit 99b4ee6
Showing 1 changed file with 20 additions and 44 deletions.
64 changes: 20 additions & 44 deletions Python/pyarena.c
Original file line number Diff line number Diff line change
@@ -1,13 +1,6 @@
#include "Python.h"
#include "pyarena.h"

/* An arena list is a linked list that can store PyObjects. */

typedef struct _arena_list {
struct _arena_list *al_next;
void *al_pointer;
} PyArenaList;

/* A simple arena block structure */
/* TODO(jhylton): Measurement to justify block size. */

Expand All @@ -19,38 +12,17 @@ typedef struct _block {
void *ab_mem;
} block;

/* The arena manages two kinds of memory, blocks of raw memory
and a list of PyObject* pointers. PyObjects are decrefed
when the arena is freed.
*/

struct _arena {
block *a_head;
block *a_cur;
PyArenaList *a_object_head;
PyArenaList *a_object_tail;
PyObject *a_objects;
};

static PyArenaList*
PyArenaList_New(void)
{
PyArenaList *alist = (PyArenaList *)malloc(sizeof(PyArenaList));
if (!alist)
return NULL;

alist->al_next = NULL;
alist->al_pointer = NULL;
return alist;
}

static void
PyArenaList_FreeObject(PyArenaList *alist)
{
while (alist) {
PyArenaList *prev;
Py_XDECREF((PyObject *)alist->al_pointer);
alist->al_pointer = NULL;
prev = alist;
alist = alist->al_next;
free(prev);
}
}

static block *
block_new(size_t size)
{
Expand Down Expand Up @@ -110,8 +82,16 @@ PyArena_New()

arena->a_head = block_new(DEFAULT_BLOCK_SIZE);
arena->a_cur = arena->a_head;
arena->a_object_head = PyArenaList_New();
arena->a_object_tail = arena->a_object_head;
if (!arena->a_head) {
free((void *)arena);
return NULL;
}
arena->a_objects = PyList_New(16);
if (!arena->a_objects) {
block_free(arena->a_head);
free((void *)arena);
return NULL;
}
return arena;
}

Expand All @@ -120,7 +100,8 @@ PyArena_Free(PyArena *arena)
{
assert(arena);
block_free(arena->a_head);
PyArenaList_FreeObject(arena->a_object_head);
assert(arena->a_objects->ob_refcnt == 1);
Py_DECREF(arena->a_objects);
free(arena);
}

Expand All @@ -138,12 +119,7 @@ PyArena_Malloc(PyArena *arena, size_t size)
}

int
PyArena_AddPyObject(PyArena *arena, PyObject *pointer)
PyArena_AddPyObject(PyArena *arena, PyObject *obj)
{
PyArenaList *tail = arena->a_object_tail;
assert(pointer);
tail->al_next = PyArenaList_New();
tail->al_pointer = pointer;
arena->a_object_tail = tail->al_next;
return 1;
return PyList_Append(arena->a_objects, obj) >= 0;
}

0 comments on commit 99b4ee6

Please sign in to comment.