|
9 | 9 | #include "stdbool.h"
|
10 | 10 | #include "stdint.h"
|
11 | 11 |
|
12 |
| -#if defined(ZLIBNG_VERNUM) && ZLIBNG_VERNUM < 0x02060 |
13 |
| -#error "At least zlib-ng version 2.0.6 is required" |
| 12 | +#if defined(ZLIBNG_VERNUM) && ZLIBNG_VERNUM < 0x02070 |
| 13 | +#error "At least zlib-ng version 2.0.7 is required" |
14 | 14 | #endif
|
15 | 15 |
|
16 | 16 | #define ENTER_ZLIB(obj) do { \
|
@@ -1466,12 +1466,21 @@ zlib_adler32(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
|
1466 | 1466 |
|
1467 | 1467 | Py_ssize_t len = data.len ;
|
1468 | 1468 | uint8_t *buf = data.buf;
|
1469 |
| - while ((size_t)len > UINT32_MAX) { |
1470 |
| - value = zng_adler32(value, buf, UINT32_MAX); |
1471 |
| - buf += (size_t) UINT32_MAX; |
1472 |
| - len -= (size_t) UINT32_MAX; |
| 1469 | + |
| 1470 | + /* Do not drop GIL for small values as it increases overhead */ |
| 1471 | + if (len > 1024 * 5) { |
| 1472 | + Py_BEGIN_ALLOW_THREADS |
| 1473 | + while ((size_t)len > UINT32_MAX) { |
| 1474 | + value = zng_adler32(value, buf, UINT32_MAX); |
| 1475 | + buf += (size_t) UINT32_MAX; |
| 1476 | + len -= (size_t) UINT32_MAX; |
| 1477 | + } |
| 1478 | + value = zng_adler32(value, buf, (uint32_t)len); |
| 1479 | + Py_END_ALLOW_THREADS |
| 1480 | + } else { |
| 1481 | + value = zng_adler32(value, buf, (uint32_t)len); |
1473 | 1482 | }
|
1474 |
| - value = zng_adler32(value, buf, (uint32_t)len); |
| 1483 | + |
1475 | 1484 | return_value = PyLong_FromUnsignedLong(value & 0xffffffffU);
|
1476 | 1485 | PyBuffer_Release(&data);
|
1477 | 1486 | return return_value;
|
@@ -1519,12 +1528,21 @@ zlib_crc32(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
|
1519 | 1528 |
|
1520 | 1529 | Py_ssize_t len = data.len ;
|
1521 | 1530 | uint8_t *buf = data.buf;
|
1522 |
| - while ((size_t)len > UINT32_MAX) { |
1523 |
| - value = zng_crc32(value, buf, UINT32_MAX); |
1524 |
| - buf += (size_t) UINT32_MAX; |
1525 |
| - len -= (size_t) UINT32_MAX; |
| 1531 | + |
| 1532 | + /* Do not drop GIL for small values as it increases overhead */ |
| 1533 | + if (len > 1024 * 5) { |
| 1534 | + Py_BEGIN_ALLOW_THREADS |
| 1535 | + while ((size_t)len > UINT32_MAX) { |
| 1536 | + value = zng_crc32(value, buf, UINT32_MAX); |
| 1537 | + buf += (size_t) UINT32_MAX; |
| 1538 | + len -= (size_t) UINT32_MAX; |
| 1539 | + } |
| 1540 | + value = zng_crc32(value, buf, (uint32_t)len); |
| 1541 | + Py_END_ALLOW_THREADS |
| 1542 | + } else { |
| 1543 | + value = zng_crc32(value, buf, (uint32_t)len); |
1526 | 1544 | }
|
1527 |
| - value = zng_crc32(value, buf, (uint32_t)len); |
| 1545 | + |
1528 | 1546 | return_value = PyLong_FromUnsignedLong(value & 0xffffffffU);
|
1529 | 1547 | PyBuffer_Release(&data);
|
1530 | 1548 | return return_value;
|
|
0 commit comments