diff options
author | Jeremy Hylton <jeremy@alum.mit.edu> | 2006-02-28 18:29:00 (GMT) |
---|---|---|
committer | Jeremy Hylton <jeremy@alum.mit.edu> | 2006-02-28 18:29:00 (GMT) |
commit | 08533fdad62197f4724f029c33b88975733f4045 (patch) | |
tree | 812d142a36df89cff8238ec1da2c5b305d915dcb /Python | |
parent | 14ca327f998511da5e89f819204c54fa582dd696 (diff) | |
download | cpython-08533fdad62197f4724f029c33b88975733f4045.zip cpython-08533fdad62197f4724f029c33b88975733f4045.tar.gz cpython-08533fdad62197f4724f029c33b88975733f4045.tar.bz2 |
Tabify
Diffstat (limited to 'Python')
-rw-r--r-- | Python/pyarena.c | 171 |
1 files changed, 87 insertions, 84 deletions
diff --git a/Python/pyarena.c b/Python/pyarena.c index 84c015f..0b865db 100644 --- a/Python/pyarena.c +++ b/Python/pyarena.c @@ -4,8 +4,8 @@ /* An arena list is a linked list that can store PyObjects. */ typedef struct _arena_list { - struct _arena_list *al_next; - void *al_pointer; + struct _arena_list *al_next; + void *al_pointer; } PyArenaList; /* A simple arena block structure */ @@ -13,134 +13,137 @@ typedef struct _arena_list { #define DEFAULT_BLOCK_SIZE 8192 typedef struct _block { - size_t ab_size; - size_t ab_offset; - struct _block *ab_next; - void *ab_mem; + size_t ab_size; + size_t ab_offset; + struct _block *ab_next; + void *ab_mem; } block; struct _arena { - block *a_head; - block *a_cur; - PyArenaList *a_object_head; - PyArenaList *a_object_tail; + block *a_head; + block *a_cur; + PyArenaList *a_object_head; + PyArenaList *a_object_tail; }; static PyArenaList* PyArenaList_New(void) { - PyArenaList *alist = (PyArenaList *)malloc(sizeof(PyArenaList)); - if (!alist) - return NULL; + PyArenaList *alist = (PyArenaList *)malloc(sizeof(PyArenaList)); + if (!alist) + return NULL; - alist->al_next = NULL; - alist->al_pointer = NULL; - return alist; + 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); - } + 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) { - /* Allocate header and block as one unit. ab_mem points just past header. */ - block *b = (block *)malloc(sizeof(block) + size); - if (!b) - return NULL; - b->ab_size = size; - b->ab_mem = (void *)(b + 1); - b->ab_next = NULL; - b->ab_offset = 0; - return b; + /* Allocate header and block as one unit. + ab_mem points just past header. */ + block *b = (block *)malloc(sizeof(block) + size); + if (!b) + return NULL; + b->ab_size = size; + b->ab_mem = (void *)(b + 1); + b->ab_next = NULL; + b->ab_offset = 0; + return b; } static void block_free(block *b) { - while (b) { - block *next = b->ab_next; - free(b); - b = next; - } + while (b) { + block *next = b->ab_next; + free(b); + b = next; + } } static void * block_alloc(block *b, size_t size) { - void *p; - assert(b); - if (b->ab_offset + size > b->ab_size) { - /* If we need to allocate more memory than will fit in the default - block, allocate a one-off block that is exactly the right size. */ - /* TODO(jhylton): Think more about space waste at end of block */ - block *new = block_new( - size < DEFAULT_BLOCK_SIZE ? DEFAULT_BLOCK_SIZE : size); - if (!new) - return NULL; - assert(!b->ab_next); - b->ab_next = new; - b = new; - } - - assert(b->ab_offset + size <= b->ab_size); - p = (void *)(((char *)b->ab_mem) + b->ab_offset); - b->ab_offset += size; - return p; + void *p; + assert(b); + if (b->ab_offset + size > b->ab_size) { + /* If we need to allocate more memory than will fit in + the default block, allocate a one-off block that is + exactly the right size. */ + /* TODO(jhylton): Think about space waste at end of block */ + block *new = block_new( + size < DEFAULT_BLOCK_SIZE ? + DEFAULT_BLOCK_SIZE : size); + if (!new) + return NULL; + assert(!b->ab_next); + b->ab_next = new; + b = new; + } + + assert(b->ab_offset + size <= b->ab_size); + p = (void *)(((char *)b->ab_mem) + b->ab_offset); + b->ab_offset += size; + return p; } PyArena * PyArena_New() { - PyArena* arena = (PyArena *)malloc(sizeof(PyArena)); - if (!arena) - return NULL; - - 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; - return arena; + PyArena* arena = (PyArena *)malloc(sizeof(PyArena)); + if (!arena) + return NULL; + + 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; + return arena; } void PyArena_Free(PyArena *arena) { - assert(arena); - block_free(arena->a_head); - PyArenaList_FreeObject(arena->a_object_head); - free(arena); + assert(arena); + block_free(arena->a_head); + PyArenaList_FreeObject(arena->a_object_head); + free(arena); } void * PyArena_Malloc(PyArena *arena, size_t size) { - void *p = block_alloc(arena->a_cur, size); - if (!p) - return NULL; - /* Reset cur if we allocated a new block. */ - if (arena->a_cur->ab_next) { - arena->a_cur = arena->a_cur->ab_next; - } - return p; + void *p = block_alloc(arena->a_cur, size); + if (!p) + return NULL; + /* Reset cur if we allocated a new block. */ + if (arena->a_cur->ab_next) { + arena->a_cur = arena->a_cur->ab_next; + } + return p; } int PyArena_AddPyObject(PyArena *arena, PyObject *pointer) { - 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; + 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; } |