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;
|
length = im->xsize * im->lines_per_block;
|
||||||
}
|
}
|
||||||
|
|
||||||
im->arrow_borrow++;
|
MUTEX_LOCK(im->mutex);
|
||||||
|
im->refcount++;
|
||||||
|
MUTEX_UNLOCK(im->mutex);
|
||||||
// Initialize primitive fields
|
// Initialize primitive fields
|
||||||
*array = (struct ArrowArray){// Data description
|
*array = (struct ArrowArray){// Data description
|
||||||
.length = length,
|
.length = length,
|
||||||
|
@ -227,7 +229,9 @@ export_fixed_pixel_array(Imaging im, struct ArrowArray *array) {
|
||||||
length = im->xsize * im->lines_per_block;
|
length = im->xsize * im->lines_per_block;
|
||||||
}
|
}
|
||||||
|
|
||||||
im->arrow_borrow++;
|
MUTEX_LOCK(im->mutex);
|
||||||
|
im->refcount++;
|
||||||
|
MUTEX_UNLOCK(im->mutex);
|
||||||
// Initialize primitive fields
|
// Initialize primitive fields
|
||||||
// Fixed length arrays are 1 buffer of validity, and the length in pixels.
|
// Fixed length arrays are 1 buffer of validity, and the length in pixels.
|
||||||
// Data is in a child array.
|
// 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 = calloc(1, sizeof(struct ArrowArray *));
|
||||||
array->children[0] = (struct ArrowArray *)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
|
*array->children[0] = (struct ArrowArray){// Data description
|
||||||
.length = length * 4,
|
.length = length * 4,
|
||||||
.offset = 0,
|
.offset = 0,
|
||||||
|
|
|
@ -108,7 +108,7 @@ struct ImagingMemoryInstance {
|
||||||
void (*destroy)(Imaging im);
|
void (*destroy)(Imaging im);
|
||||||
|
|
||||||
/* arrow */
|
/* 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 band_names[4][3]; /* names of bands, max 2 char + null terminator */
|
||||||
char arrow_band_format[2]; /* single character + 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 blocks_count; /* Number of blocks that have been allocated */
|
||||||
int lines_per_block; /* Number of lines in a block 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)])
|
#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 */
|
/* Setup image descriptor */
|
||||||
im->xsize = xsize;
|
im->xsize = xsize;
|
||||||
im->ysize = ysize;
|
im->ysize = ysize;
|
||||||
im->arrow_borrow = 1;
|
im->refcount = 1;
|
||||||
im->type = IMAGING_TYPE_UINT8;
|
im->type = IMAGING_TYPE_UINT8;
|
||||||
strcpy(im->arrow_band_format, "C");
|
strcpy(im->arrow_band_format, "C");
|
||||||
|
|
||||||
|
@ -299,11 +299,14 @@ ImagingDelete(Imaging im) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
im->arrow_borrow--;
|
MUTEX_LOCK(im->mutex);
|
||||||
|
im->refcount--;
|
||||||
|
|
||||||
if (im->arrow_borrow > 0) {
|
if (im->refcount > 0) {
|
||||||
return;
|
MUTEX_UNLOCK(im->mutex);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
MUTEX_UNLOCK(im->mutex);
|
||||||
|
|
||||||
if (im->palette) {
|
if (im->palette) {
|
||||||
ImagingPaletteDelete(im->palette);
|
ImagingPaletteDelete(im->palette);
|
||||||
|
@ -697,10 +700,12 @@ ImagingNewArrow(
|
||||||
int64_t pixels = (int64_t)xsize * (int64_t)ysize;
|
int64_t pixels = (int64_t)xsize * (int64_t)ysize;
|
||||||
|
|
||||||
// fmt:off // don't reformat this
|
// fmt:off // don't reformat this
|
||||||
if (((strcmp(schema->format, "I") == 0 && im->pixelsize == 4 && im->bands >= 2
|
if (((strcmp(schema->format, "I") == 0 // int32
|
||||||
) // INT32 into any INT32 Storage mode
|
&& im->pixelsize == 4 // 4xchar* storage
|
||||||
|| (strcmp(schema->format, im->arrow_band_format) == 0 && im->bands == 1)
|
&& im->bands >= 2) // INT32 into any INT32 Storage mode
|
||||||
) // Single band match
|
||
|
||||||
|
(strcmp(schema->format, im->arrow_band_format) == 0 // same mode
|
||||||
|
&& im->bands == 1)) // Single band match
|
||||||
&& pixels == external_array->length) {
|
&& pixels == external_array->length) {
|
||||||
// one arrow element per, and it matches a pixelsize*char
|
// one arrow element per, and it matches a pixelsize*char
|
||||||
if (ImagingBorrowArrow(im, external_array, im->pixelsize)) {
|
if (ImagingBorrowArrow(im, external_array, im->pixelsize)) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user