Mercurial > hg-stable
changeset 16370:28bb4daf070c
parsers: fix a memleak, and add a clearcaches method to the index
This change also fixes a nasty memory leak: previously, self->caches
was not being freed.
The new clearcaches method lets us benchmark with finer granularity,
as it lets us separate the cost of loading a revlog index from those
of populating and accessing the cache data structures.
author | Bryan O'Sullivan <bryano@fb.com> |
---|---|
date | Fri, 06 Apr 2012 00:28:36 -0700 |
parents | 913d1fa61398 |
children | 4417eb761ba8 |
files | mercurial/parsers.c |
diffstat | 1 files changed, 27 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/parsers.c Thu Apr 05 23:52:55 2012 +0900 +++ b/mercurial/parsers.c Fri Apr 06 00:28:36 2012 -0700 @@ -412,6 +412,30 @@ Py_RETURN_NONE; } +static void _index_clearcaches(indexObject *self) +{ + if (self->cache) { + Py_ssize_t i; + + for (i = 0; i < self->raw_length; i++) { + Py_XDECREF(self->cache[i]); + self->cache[i] = NULL; + } + free(self->cache); + self->cache = NULL; + } + if (self->offsets) { + free(self->offsets); + self->offsets = NULL; + } +} + +static PyObject *index_clearcaches(indexObject *self) +{ + _index_clearcaches(self); + Py_RETURN_NONE; +} + static int index_assign_subscript(indexObject *self, PyObject *item, PyObject *value) { @@ -546,15 +570,9 @@ static void index_dealloc(indexObject *self) { + _index_clearcaches(self); Py_DECREF(self->data); - if (self->cache) { - Py_ssize_t i; - - for (i = 0; i < self->raw_length; i++) - Py_XDECREF(self->cache[i]); - } Py_XDECREF(self->added); - free(self->offsets); PyObject_Del(self); } @@ -572,6 +590,8 @@ }; static PyMethodDef index_methods[] = { + {"clearcaches", (PyCFunction)index_clearcaches, METH_NOARGS, + "clear the index caches"}, {"insert", (PyCFunction)index_insert, METH_VARARGS, "insert an index entry"}, {NULL} /* Sentinel */