reduce code duplication

This commit is contained in:
Alexander 2017-09-18 03:57:43 +03:00
parent 2ab19bbe44
commit 3bfdfcd48a
3 changed files with 5 additions and 11 deletions

View File

@ -3476,7 +3476,7 @@ _clear_cache(PyObject* self, PyObject* args)
if (!PyArg_ParseTuple(args, ":_clear_cache")) if (!PyArg_ParseTuple(args, ":_clear_cache"))
return NULL; return NULL;
ImagingMemoryClearCache(&ImagingDefaultArena); ImagingMemoryClearCache(&ImagingDefaultArena, 0);
Py_INCREF(Py_None); Py_INCREF(Py_None);
return Py_None; return Py_None;

View File

@ -172,7 +172,7 @@ typedef struct ImagingMemoryArena {
extern struct ImagingMemoryArena ImagingDefaultArena; extern struct ImagingMemoryArena ImagingDefaultArena;
extern int ImagingMemorySetBlocksMax(ImagingMemoryArena arena, int blocks_max); extern int ImagingMemorySetBlocksMax(ImagingMemoryArena arena, int blocks_max);
extern void ImagingMemoryClearCache(ImagingMemoryArena arena); extern void ImagingMemoryClearCache(ImagingMemoryArena arena, int new_size);
extern Imaging ImagingNew(const char* mode, int xsize, int ysize); extern Imaging ImagingNew(const char* mode, int xsize, int ysize);
extern Imaging ImagingNewDirty(const char* mode, int xsize, int ysize); extern Imaging ImagingNewDirty(const char* mode, int xsize, int ysize);

View File

@ -278,11 +278,7 @@ ImagingMemorySetBlocksMax(ImagingMemoryArena arena, int blocks_max)
{ {
void *p; void *p;
/* Free already cached blocks */ /* Free already cached blocks */
while (arena->blocks_cached > blocks_max) { ImagingMemoryClearCache(arena, blocks_max);
arena->blocks_cached -= 1;
free(arena->blocks[arena->blocks_cached]);
arena->stats_freed_blocks += 1;
}
if (blocks_max == 0 && arena->blocks != NULL) { if (blocks_max == 0 && arena->blocks != NULL) {
free(arena->blocks); free(arena->blocks);
@ -297,8 +293,6 @@ ImagingMemorySetBlocksMax(ImagingMemoryArena arena, int blocks_max)
} else { } else {
arena->blocks = calloc(sizeof(void*), blocks_max); arena->blocks = calloc(sizeof(void*), blocks_max);
if ( ! arena->blocks) { if ( ! arena->blocks) {
// Fallback to 0
arena->blocks_max = 0;
return 0; return 0;
} }
} }
@ -308,9 +302,9 @@ ImagingMemorySetBlocksMax(ImagingMemoryArena arena, int blocks_max)
} }
void void
ImagingMemoryClearCache(ImagingMemoryArena arena) ImagingMemoryClearCache(ImagingMemoryArena arena, int new_size)
{ {
while (arena->blocks_cached > 0) { while (arena->blocks_cached > new_size) {
arena->blocks_cached -= 1; arena->blocks_cached -= 1;
free(arena->blocks[arena->blocks_cached]); free(arena->blocks[arena->blocks_cached]);
arena->stats_freed_blocks += 1; arena->stats_freed_blocks += 1;