Skip to content

Revert "bpo-40521: [subinterpreters] Make dtoa bigint free list per-interpreter" #24964

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 22, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 0 additions & 16 deletions Include/internal/pycore_dtoa.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
#ifndef PY_NO_SHORT_FLOAT_REPR
#ifndef Py_INTERNAL_DTOA_H
#define Py_INTERNAL_DTOA_H
#ifdef __cplusplus
extern "C" {
#endif
Expand All @@ -19,21 +17,7 @@ PyAPI_FUNC(void) _Py_dg_freedtoa(char *s);
PyAPI_FUNC(double) _Py_dg_stdnan(int sign);
PyAPI_FUNC(double) _Py_dg_infinity(int sign);

#define _PyDtoa_Kmax 7

typedef uint32_t _PyDtoa_ULong;
typedef int32_t _PyDtoa_Long;
typedef uint64_t _PyDtoa_ULLong;

struct
_PyDtoa_Bigint {
struct _PyDtoa_Bigint *next;
int k, maxwds, sign, wds;
_PyDtoa_ULong x[1];
};

#ifdef __cplusplus
}
#endif
#endif /* !Py_INTERNAL_DTOA_H */
#endif /* !PY_NO_SHORT_FLOAT_REPR */
4 changes: 0 additions & 4 deletions Include/internal/pycore_interp.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ extern "C" {
#include "pycore_gil.h" // struct _gil_runtime_state
#include "pycore_gc.h" // struct _gc_runtime_state
#include "pycore_warnings.h" // struct _warnings_runtime_state
#include "pycore_dtoa.h"

struct _pending_calls {
PyThread_type_lock lock;
Expand Down Expand Up @@ -322,9 +321,6 @@ struct _is {

struct ast_state ast;
struct type_cache type_cache;
#ifndef PY_NO_SHORT_FLOAT_REPR
struct _PyDtoa_Bigint *dtoa_freelist[_PyDtoa_Kmax + 1];
#endif
};

extern void _PyInterpreterState_ClearModules(PyInterpreterState *interp);
Expand Down
36 changes: 17 additions & 19 deletions Python/dtoa.c
Original file line number Diff line number Diff line change
Expand Up @@ -119,16 +119,6 @@

#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 */
Expand Down Expand Up @@ -164,6 +154,11 @@ typedef struct _PyDtoa_Bigint Bigint;
#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
Expand Down Expand Up @@ -302,6 +297,8 @@ 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
Expand All @@ -324,6 +321,14 @@ 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

Expand All @@ -346,13 +351,7 @@ BCinfo {
Bfree to PyMem_Free. Investigate whether this has any significant
performance on impact. */


/* Get Bigint freelist from interpreter */
static Bigint **
get_freelist(void) {
PyInterpreterState *interp = _PyInterpreterState_GET();
return interp->dtoa_freelist;
}
static Bigint *freelist[Kmax+1];

/* Allocate space for a Bigint with up to 1<<k digits */

Expand All @@ -362,7 +361,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 {
Expand Down Expand Up @@ -394,7 +393,6 @@ Bfree(Bigint *v)
if (v->k > Kmax)
FREE((void*)v);
else {
Bigint **freelist = get_freelist();
v->next = freelist[v->k];
freelist[v->k] = v;
}
Expand Down