|
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