@@ -1,13 +1,6 @@
11#include"Python.h"
22#include"pyarena.h"
334-/* An arena list is a linked list that can store PyObjects. */
5-6-typedefstruct_arena_list {
7-struct_arena_list*al_next;
8-void*al_pointer;
9-} PyArenaList;
10-114/* A simple arena block structure */
125/* TODO(jhylton): Measurement to justify block size. */
136@@ -19,38 +12,17 @@ typedef struct _block {
1912void*ab_mem;
2013} block;
211415+/* The arena manages two kinds of memory, blocks of raw memory
16+ and a list of PyObject* pointers. PyObjects are decrefed
17+ when the arena is freed.
18+*/
19+2220struct_arena {
2321block*a_head;
2422block*a_cur;
25-PyArenaList*a_object_head;
26-PyArenaList*a_object_tail;
23+PyObject*a_objects;
2724};
282529-staticPyArenaList*
30-PyArenaList_New(void)
31-{
32-PyArenaList*alist= (PyArenaList*)malloc(sizeof(PyArenaList));
33-if (!alist)
34-returnNULL;
35-36-alist->al_next=NULL;
37-alist->al_pointer=NULL;
38-returnalist;
39-}
40-41-staticvoid
42-PyArenaList_FreeObject(PyArenaList*alist)
43-{
44-while (alist) {
45-PyArenaList*prev;
46-Py_XDECREF((PyObject*)alist->al_pointer);
47-alist->al_pointer=NULL;
48-prev=alist;
49-alist=alist->al_next;
50-free(prev);
51- }
52-}
53-5426staticblock*
5527block_new(size_tsize)
5628{
@@ -110,8 +82,16 @@ PyArena_New()
1108211183arena->a_head=block_new(DEFAULT_BLOCK_SIZE);
11284arena->a_cur=arena->a_head;
113-arena->a_object_head=PyArenaList_New();
114-arena->a_object_tail=arena->a_object_head;
85+if (!arena->a_head) {
86+free((void*)arena);
87+returnNULL;
88+ }
89+arena->a_objects=PyList_New(16);
90+if (!arena->a_objects) {
91+block_free(arena->a_head);
92+free((void*)arena);
93+returnNULL;
94+ }
11595returnarena;
11696}
11797@@ -120,7 +100,8 @@ PyArena_Free(PyArena *arena)
120100{
121101assert(arena);
122102block_free(arena->a_head);
123-PyArenaList_FreeObject(arena->a_object_head);
103+assert(arena->a_objects->ob_refcnt==1);
104+Py_DECREF(arena->a_objects);
124105free(arena);
125106}
126107@@ -138,12 +119,7 @@ PyArena_Malloc(PyArena *arena, size_t size)
138119}
139120140121int
141-PyArena_AddPyObject(PyArena*arena, PyObject*pointer)
122+PyArena_AddPyObject(PyArena*arena, PyObject*obj)
142123{
143-PyArenaList*tail=arena->a_object_tail;
144-assert(pointer);
145-tail->al_next=PyArenaList_New();
146-tail->al_pointer=pointer;
147-arena->a_object_tail=tail->al_next;
148-return1;
124+returnPyList_Append(arena->a_objects, obj) >= 0;
149125}