diff options
author | junyixie <xie.junyi@outlook.com> | 2021-03-13 13:25:14 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-13 13:25:14 (GMT) |
commit | 5bd1059184b154d339f1bd53d23c98b5bcf14c8c (patch) | |
tree | 8c527fe65aec389ebdc7655838292aa59b10fb0f /Python/dtoa.c | |
parent | d0a445490e2c0e1d2aef3005f14211d9a85196bf (diff) | |
download | cpython-5bd1059184b154d339f1bd53d23c98b5bcf14c8c.zip cpython-5bd1059184b154d339f1bd53d23c98b5bcf14c8c.tar.gz cpython-5bd1059184b154d339f1bd53d23c98b5bcf14c8c.tar.bz2 |
bpo-40521: Make dtoa bigint free list per-interpreter (GH-24821)
Diffstat (limited to 'Python/dtoa.c')
-rw-r--r-- | Python/dtoa.c | 36 |
1 files changed, 19 insertions, 17 deletions
diff --git a/Python/dtoa.c b/Python/dtoa.c index e629b29..c7002e5 100644 --- a/Python/dtoa.c +++ b/Python/dtoa.c @@ -119,6 +119,16 @@ #include "Python.h" #include "pycore_dtoa.h" +#include "pycore_interp.h" +#include "pycore_pystate.h" + +#define ULong _PyDtoa_ULong +#define Long _PyDtoa_Long +#define ULLong _PyDtoa_ULLong +#define Kmax _PyDtoa_Kmax + +typedef struct _PyDtoa_Bigint Bigint; + /* if PY_NO_SHORT_FLOAT_REPR is defined, then don't even try to compile the following code */ @@ -154,11 +164,6 @@ #error "doubles and ints have incompatible endianness" #endif - -typedef uint32_t ULong; -typedef int32_t Long; -typedef uint64_t ULLong; - #undef DEBUG #ifdef Py_DEBUG #define DEBUG @@ -297,8 +302,6 @@ BCinfo { #define FFFFFFFF 0xffffffffUL -#define Kmax 7 - /* struct Bigint is used to represent arbitrary-precision integers. These integers are stored in sign-magnitude format, with the magnitude stored as an array of base 2**32 digits. Bigints are always normalized: if x is a @@ -321,14 +324,6 @@ BCinfo { significant (x[0]) to most significant (x[wds-1]). */ -struct -Bigint { - struct Bigint *next; - int k, maxwds, sign, wds; - ULong x[1]; -}; - -typedef struct Bigint Bigint; #ifndef Py_USING_MEMORY_DEBUGGER @@ -351,7 +346,13 @@ typedef struct Bigint Bigint; Bfree to PyMem_Free. Investigate whether this has any significant performance on impact. */ -static Bigint *freelist[Kmax+1]; + +/* Get Bigint freelist from interpreter */ +static Bigint ** +get_freelist(void) { + PyInterpreterState *interp = _PyInterpreterState_GET(); + return interp->dtoa_freelist; +} /* Allocate space for a Bigint with up to 1<<k digits */ @@ -361,7 +362,7 @@ Balloc(int k) int x; Bigint *rv; unsigned int len; - + Bigint **freelist = get_freelist(); if (k <= Kmax && (rv = freelist[k])) freelist[k] = rv->next; else { @@ -393,6 +394,7 @@ Bfree(Bigint *v) if (v->k > Kmax) FREE((void*)v); else { + Bigint **freelist = get_freelist(); v->next = freelist[v->k]; freelist[v->k] = v; } |