mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-05-01 14:33:40 +03:00
added mutex around refcount, renamed arrow_borrow to refcount
This commit is contained in:
parent
d02417e411
commit
6fad11a926
|
@ -188,7 +188,9 @@ export_single_channel_array(Imaging im, struct ArrowArray *array) {
|
|||
length = im->xsize * im->lines_per_block;
|
||||
}
|
||||
|
||||
im->arrow_borrow++;
|
||||
MUTEX_LOCK(im->mutex);
|
||||
im->refcount++;
|
||||
MUTEX_UNLOCK(im->mutex);
|
||||
// Initialize primitive fields
|
||||
*array = (struct ArrowArray){// Data description
|
||||
.length = length,
|
||||
|
@ -227,7 +229,9 @@ export_fixed_pixel_array(Imaging im, struct ArrowArray *array) {
|
|||
length = im->xsize * im->lines_per_block;
|
||||
}
|
||||
|
||||
im->arrow_borrow++;
|
||||
MUTEX_LOCK(im->mutex);
|
||||
im->refcount++;
|
||||
MUTEX_UNLOCK(im->mutex);
|
||||
// Initialize primitive fields
|
||||
// Fixed length arrays are 1 buffer of validity, and the length in pixels.
|
||||
// Data is in a child array.
|
||||
|
@ -254,7 +258,9 @@ export_fixed_pixel_array(Imaging im, struct ArrowArray *array) {
|
|||
array->children = calloc(1, sizeof(struct ArrowArray *));
|
||||
array->children[0] = (struct ArrowArray *)calloc(1, sizeof(struct ArrowArray));
|
||||
|
||||
im->arrow_borrow++;
|
||||
MUTEX_LOCK(im->mutex);
|
||||
im->refcount++;
|
||||
MUTEX_UNLOCK(im->mutex);
|
||||
*array->children[0] = (struct ArrowArray){// Data description
|
||||
.length = length * 4,
|
||||
.offset = 0,
|
||||
|
|
|
@ -108,7 +108,7 @@ struct ImagingMemoryInstance {
|
|||
void (*destroy)(Imaging im);
|
||||
|
||||
/* arrow */
|
||||
int arrow_borrow; /* Number of arrow arrays that have been allocated */
|
||||
int refcount; /* Number of arrow arrays that have been allocated */
|
||||
char band_names[4][3]; /* names of bands, max 2 char + null terminator */
|
||||
char arrow_band_format[2]; /* single character + null terminator */
|
||||
|
||||
|
@ -117,6 +117,12 @@ struct ImagingMemoryInstance {
|
|||
|
||||
int blocks_count; /* Number of blocks that have been allocated */
|
||||
int lines_per_block; /* Number of lines in a block have been allocated */
|
||||
|
||||
#ifdef Py_GIL_DISABLED
|
||||
PyMutex mutex;
|
||||
#endif
|
||||
|
||||
|
||||
};
|
||||
|
||||
#define IMAGING_PIXEL_1(im, x, y) ((im)->image8[(y)][(x)])
|
||||
|
|
|
@ -58,7 +58,7 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) {
|
|||
/* Setup image descriptor */
|
||||
im->xsize = xsize;
|
||||
im->ysize = ysize;
|
||||
im->arrow_borrow = 1;
|
||||
im->refcount = 1;
|
||||
im->type = IMAGING_TYPE_UINT8;
|
||||
strcpy(im->arrow_band_format, "C");
|
||||
|
||||
|
@ -299,11 +299,14 @@ ImagingDelete(Imaging im) {
|
|||
return;
|
||||
}
|
||||
|
||||
im->arrow_borrow--;
|
||||
MUTEX_LOCK(im->mutex);
|
||||
im->refcount--;
|
||||
|
||||
if (im->arrow_borrow > 0) {
|
||||
if (im->refcount > 0) {
|
||||
MUTEX_UNLOCK(im->mutex);
|
||||
return;
|
||||
}
|
||||
MUTEX_UNLOCK(im->mutex);
|
||||
|
||||
if (im->palette) {
|
||||
ImagingPaletteDelete(im->palette);
|
||||
|
@ -697,10 +700,12 @@ ImagingNewArrow(
|
|||
int64_t pixels = (int64_t)xsize * (int64_t)ysize;
|
||||
|
||||
// fmt:off // don't reformat this
|
||||
if (((strcmp(schema->format, "I") == 0 && im->pixelsize == 4 && im->bands >= 2
|
||||
) // INT32 into any INT32 Storage mode
|
||||
|| (strcmp(schema->format, im->arrow_band_format) == 0 && im->bands == 1)
|
||||
) // Single band match
|
||||
if (((strcmp(schema->format, "I") == 0 // int32
|
||||
&& im->pixelsize == 4 // 4xchar* storage
|
||||
&& im->bands >= 2) // INT32 into any INT32 Storage mode
|
||||
||
|
||||
(strcmp(schema->format, im->arrow_band_format) == 0 // same mode
|
||||
&& im->bands == 1)) // Single band match
|
||||
&& pixels == external_array->length) {
|
||||
// one arrow element per, and it matches a pixelsize*char
|
||||
if (ImagingBorrowArrow(im, external_array, im->pixelsize)) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user