@@ -3938,34 +3938,49 @@ _get_stats(PyObject *self, PyObject *args) {
39383938 return NULL ;
39393939 }
39403940
3941- MUTEX_LOCK (& ImagingDefaultArena .mutex );
3942- ImagingMemoryArena arena = & ImagingDefaultArena ;
3943-
3944- v = PyLong_FromLong (arena -> stats_new_count );
3941+ long stats_new_count = 0 ;
3942+ long stats_allocated_blocks = 0 ;
3943+ long stats_reused_blocks = 0 ;
3944+ long stats_reallocated_blocks = 0 ;
3945+ long stats_freed_blocks = 0 ;
3946+ long blocks_cached = 0 ;
3947+
3948+ ImagingMemoryArena arena ;
3949+ IMAGING_ARENAS_FOREACH (arena ) {
3950+ MUTEX_LOCK (& arena -> mutex );
3951+ stats_new_count += arena -> stats_new_count ;
3952+ stats_allocated_blocks += arena -> stats_allocated_blocks ;
3953+ stats_reused_blocks += arena -> stats_reused_blocks ;
3954+ stats_reallocated_blocks += arena -> stats_reallocated_blocks ;
3955+ stats_freed_blocks += arena -> stats_freed_blocks ;
3956+ blocks_cached += arena -> blocks_cached ;
3957+ MUTEX_UNLOCK (& arena -> mutex );
3958+ }
3959+
3960+ v = PyLong_FromLong (stats_new_count );
39453961 PyDict_SetItemString (d , "new_count" , v ? v : Py_None );
39463962 Py_XDECREF (v );
39473963
3948- v = PyLong_FromLong (arena -> stats_allocated_blocks );
3964+ v = PyLong_FromLong (stats_allocated_blocks );
39493965 PyDict_SetItemString (d , "allocated_blocks" , v ? v : Py_None );
39503966 Py_XDECREF (v );
39513967
3952- v = PyLong_FromLong (arena -> stats_reused_blocks );
3968+ v = PyLong_FromLong (stats_reused_blocks );
39533969 PyDict_SetItemString (d , "reused_blocks" , v ? v : Py_None );
39543970 Py_XDECREF (v );
39553971
3956- v = PyLong_FromLong (arena -> stats_reallocated_blocks );
3972+ v = PyLong_FromLong (stats_reallocated_blocks );
39573973 PyDict_SetItemString (d , "reallocated_blocks" , v ? v : Py_None );
39583974 Py_XDECREF (v );
39593975
3960- v = PyLong_FromLong (arena -> stats_freed_blocks );
3976+ v = PyLong_FromLong (stats_freed_blocks );
39613977 PyDict_SetItemString (d , "freed_blocks" , v ? v : Py_None );
39623978 Py_XDECREF (v );
39633979
3964- v = PyLong_FromLong (arena -> blocks_cached );
3980+ v = PyLong_FromLong (blocks_cached );
39653981 PyDict_SetItemString (d , "blocks_cached" , v ? v : Py_None );
39663982 Py_XDECREF (v );
39673983
3968- MUTEX_UNLOCK (& ImagingDefaultArena .mutex );
39693984 return d ;
39703985}
39713986
@@ -3975,14 +3990,16 @@ _reset_stats(PyObject *self, PyObject *args) {
39753990 return NULL ;
39763991 }
39773992
3978- MUTEX_LOCK (& ImagingDefaultArena .mutex );
3979- ImagingMemoryArena arena = & ImagingDefaultArena ;
3980- arena -> stats_new_count = 0 ;
3981- arena -> stats_allocated_blocks = 0 ;
3982- arena -> stats_reused_blocks = 0 ;
3983- arena -> stats_reallocated_blocks = 0 ;
3984- arena -> stats_freed_blocks = 0 ;
3985- MUTEX_UNLOCK (& ImagingDefaultArena .mutex );
3993+ ImagingMemoryArena arena ;
3994+ IMAGING_ARENAS_FOREACH (arena ) {
3995+ MUTEX_LOCK (& arena -> mutex );
3996+ arena -> stats_new_count = 0 ;
3997+ arena -> stats_allocated_blocks = 0 ;
3998+ arena -> stats_reused_blocks = 0 ;
3999+ arena -> stats_reallocated_blocks = 0 ;
4000+ arena -> stats_freed_blocks = 0 ;
4001+ MUTEX_UNLOCK (& arena -> mutex );
4002+ }
39864003
39874004 Py_INCREF (Py_None );
39884005 return Py_None ;
@@ -3994,9 +4011,10 @@ _get_alignment(PyObject *self, PyObject *args) {
39944011 return NULL ;
39954012 }
39964013
3997- MUTEX_LOCK (& ImagingDefaultArena .mutex );
3998- int alignment = ImagingDefaultArena .alignment ;
3999- MUTEX_UNLOCK (& ImagingDefaultArena .mutex );
4014+ ImagingMemoryArena arena = ImagingGetArena ();
4015+ MUTEX_LOCK (& arena -> mutex );
4016+ int alignment = arena -> alignment ;
4017+ MUTEX_UNLOCK (& arena -> mutex );
40004018 return PyLong_FromLong (alignment );
40014019}
40024020
@@ -4006,9 +4024,10 @@ _get_block_size(PyObject *self, PyObject *args) {
40064024 return NULL ;
40074025 }
40084026
4009- MUTEX_LOCK (& ImagingDefaultArena .mutex );
4010- int block_size = ImagingDefaultArena .block_size ;
4011- MUTEX_UNLOCK (& ImagingDefaultArena .mutex );
4027+ ImagingMemoryArena arena = ImagingGetArena ();
4028+ MUTEX_LOCK (& arena -> mutex );
4029+ int block_size = arena -> block_size ;
4030+ MUTEX_UNLOCK (& arena -> mutex );
40124031 return PyLong_FromLong (block_size );
40134032}
40144033
@@ -4018,9 +4037,10 @@ _get_blocks_max(PyObject *self, PyObject *args) {
40184037 return NULL ;
40194038 }
40204039
4021- MUTEX_LOCK (& ImagingDefaultArena .mutex );
4022- int blocks_max = ImagingDefaultArena .blocks_max ;
4023- MUTEX_UNLOCK (& ImagingDefaultArena .mutex );
4040+ ImagingMemoryArena arena = ImagingGetArena ();
4041+ MUTEX_LOCK (& arena -> mutex );
4042+ int blocks_max = arena -> blocks_max ;
4043+ MUTEX_UNLOCK (& arena -> mutex );
40244044 return PyLong_FromLong (blocks_max );
40254045}
40264046
@@ -4041,9 +4061,12 @@ _set_alignment(PyObject *self, PyObject *args) {
40414061 return NULL ;
40424062 }
40434063
4044- MUTEX_LOCK (& ImagingDefaultArena .mutex );
4045- ImagingDefaultArena .alignment = alignment ;
4046- MUTEX_UNLOCK (& ImagingDefaultArena .mutex );
4064+ ImagingMemoryArena arena ;
4065+ IMAGING_ARENAS_FOREACH (arena ) {
4066+ MUTEX_LOCK (& arena -> mutex );
4067+ arena -> alignment = alignment ;
4068+ MUTEX_UNLOCK (& arena -> mutex );
4069+ }
40474070
40484071 Py_INCREF (Py_None );
40494072 return Py_None ;
@@ -4066,9 +4089,12 @@ _set_block_size(PyObject *self, PyObject *args) {
40664089 return NULL ;
40674090 }
40684091
4069- MUTEX_LOCK (& ImagingDefaultArena .mutex );
4070- ImagingDefaultArena .block_size = block_size ;
4071- MUTEX_UNLOCK (& ImagingDefaultArena .mutex );
4092+ ImagingMemoryArena arena ;
4093+ IMAGING_ARENAS_FOREACH (arena ) {
4094+ MUTEX_LOCK (& arena -> mutex );
4095+ arena -> block_size = block_size ;
4096+ MUTEX_UNLOCK (& arena -> mutex );
4097+ }
40724098
40734099 Py_INCREF (Py_None );
40744100 return Py_None ;
@@ -4087,15 +4113,20 @@ _set_blocks_max(PyObject *self, PyObject *args) {
40874113 }
40884114
40894115 if ((unsigned long )blocks_max >
4090- SIZE_MAX / sizeof (ImagingDefaultArena . blocks_pool [0 ])) {
4116+ SIZE_MAX / sizeof (ImagingGetArena () -> blocks_pool [0 ])) {
40914117 PyErr_SetString (PyExc_ValueError , "blocks_max is too large" );
40924118 return NULL ;
40934119 }
40944120
4095- MUTEX_LOCK (& ImagingDefaultArena .mutex );
4096- int status = ImagingMemorySetBlocksMax (& ImagingDefaultArena , blocks_max );
4097- MUTEX_UNLOCK (& ImagingDefaultArena .mutex );
4098- if (!status ) {
4121+ int error = 0 ;
4122+ ImagingMemoryArena arena ;
4123+ IMAGING_ARENAS_FOREACH (arena ) {
4124+ MUTEX_LOCK (& arena -> mutex );
4125+ error |= ImagingMemorySetBlocksMax (arena , blocks_max );
4126+ MUTEX_UNLOCK (& arena -> mutex );
4127+ }
4128+
4129+ if (error ) {
40994130 return ImagingError_MemoryError ();
41004131 }
41014132
@@ -4111,9 +4142,12 @@ _clear_cache(PyObject *self, PyObject *args) {
41114142 return NULL ;
41124143 }
41134144
4114- MUTEX_LOCK (& ImagingDefaultArena .mutex );
4115- ImagingMemoryClearCache (& ImagingDefaultArena , i );
4116- MUTEX_UNLOCK (& ImagingDefaultArena .mutex );
4145+ ImagingMemoryArena arena ;
4146+ IMAGING_ARENAS_FOREACH (arena ) {
4147+ MUTEX_LOCK (& arena -> mutex );
4148+ ImagingMemoryClearCache (arena , i );
4149+ MUTEX_UNLOCK (& arena -> mutex );
4150+ }
41174151
41184152 Py_INCREF (Py_None );
41194153 return Py_None ;
0 commit comments