Alas, Vladimir's patch caused a bus error (probably double

alignment?), and I didn't test it.  Withdrawing it for now.
This commit is contained in:
Guido van Rossum 1999-03-11 01:47:00 +00:00
parent 881928f7ab
commit a060fb2598
1 changed files with 7 additions and 56 deletions

View File

@ -95,27 +95,20 @@ double (*_Py_math_funcs_hack[])() = {
/* Special free list -- see comments for same code in intobject.c. */ /* Special free list -- see comments for same code in intobject.c. */
static PyFloatObject *free_list = NULL; static PyFloatObject *free_list = NULL;
static PyFloatObject *block_list = NULL;
#define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */ #define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
#define N_FLOATOBJECTS ((BLOCK_SIZE - sizeof(PyFloatObject *)) / \ #define N_FLOATOBJECTS (BLOCK_SIZE / sizeof(PyFloatObject))
sizeof(PyFloatObject))
#define PyMem_MALLOC malloc
#define PyMem_FREE free
static PyFloatObject * static PyFloatObject *
fill_free_list() fill_free_list()
{ {
PyFloatObject *p, *q; PyFloatObject *p, *q;
p = (PyFloatObject *)PyMem_MALLOC(BLOCK_SIZE); p = PyMem_NEW(PyFloatObject, N_FLOATOBJECTS);
if (p == NULL) if (p == NULL)
return (PyFloatObject *)PyErr_NoMemory(); return (PyFloatObject *)PyErr_NoMemory();
*(PyFloatObject **)p = block_list;
block_list = p;
p = (PyFloatObject *)((char *)p + sizeof(PyFloatObject *));
q = p + N_FLOATOBJECTS; q = p + N_FLOATOBJECTS;
while (--q > p) while (--q > p)
q->ob_type = (struct _typeobject *)(q-1); *(PyFloatObject **)q = q-1;
q->ob_type = NULL; *(PyFloatObject **)q = NULL;
return p + N_FLOATOBJECTS - 1; return p + N_FLOATOBJECTS - 1;
} }
@ -133,7 +126,7 @@ PyFloat_FromDouble(fval)
return NULL; return NULL;
} }
op = free_list; op = free_list;
free_list = (PyFloatObject *)op->ob_type; free_list = *(PyFloatObject **)free_list;
op->ob_type = &PyFloat_Type; op->ob_type = &PyFloat_Type;
op->ob_fval = fval; op->ob_fval = fval;
_Py_NewReference(op); _Py_NewReference(op);
@ -144,7 +137,7 @@ static void
float_dealloc(op) float_dealloc(op)
PyFloatObject *op; PyFloatObject *op;
{ {
op->ob_type = (struct _typeobject *)free_list; *(PyFloatObject **)op = free_list;
free_list = op; free_list = op;
} }
@ -611,47 +604,5 @@ PyTypeObject PyFloat_Type = {
void void
PyFloat_Fini() PyFloat_Fini()
{ {
PyFloatObject *p, *list; /* XXX Alas, the free list is not easily and safely freeable */
int i;
int bc, bf; /* block count, number of freed blocks */
int frem, fsum; /* remaining unfreed floats per block, total */
bc = 0;
bf = 0;
fsum = 0;
list = block_list;
block_list = NULL;
while (list != NULL) {
p = list;
p = (PyFloatObject *)((char *)p + sizeof(PyFloatObject *));
bc++;
frem = 0;
for (i = 0; i < N_FLOATOBJECTS; i++, p++) {
if (PyFloat_Check(p) && p->ob_refcnt != 0)
frem++;
}
p = list;
list = *(PyFloatObject **)p;
if (frem) {
*(PyFloatObject **)p = block_list;
block_list = p;
}
else {
PyMem_FREE(p);
bf++;
}
fsum += frem;
}
if (Py_VerboseFlag) {
fprintf(stderr, "# cleanup floats");
if (!fsum) {
fprintf(stderr, "\n");
}
else {
fprintf(stderr,
": %d unfreed float%s in %d out of %d block%s\n",
fsum, fsum == 1 ? "" : "s",
bc - bf, bc, bc == 1 ? "" : "s");
}
}
} }