|  | 
| 15 | 15 | #include "scalar_ops.h" | 
| 16 | 16 | #include "dragon4.h" | 
| 17 | 17 | 
 | 
|  | 18 | +#ifdef Py_GIL_DISABLED | 
|  | 19 | +static PyMutex scalar_mutex = {0}; | 
|  | 20 | +#endif | 
|  | 21 | + | 
| 18 | 22 | QuadPrecisionObject * | 
| 19 | 23 | QuadPrecision_raw_new(QuadBackendType backend) | 
| 20 | 24 | { | 
| 21 |  | -    QuadPrecisionObject *new = PyObject_New(QuadPrecisionObject, &QuadPrecision_Type); | 
|  | 25 | +    QuadPrecisionObject *new; | 
|  | 26 | +#ifdef Py_GIL_DISABLED | 
|  | 27 | +    PyMutex_Lock(&scalar_mutex); | 
|  | 28 | +#endif | 
|  | 29 | +    new = PyObject_New(QuadPrecisionObject, &QuadPrecision_Type); | 
|  | 30 | +#ifdef Py_GIL_DISABLED | 
|  | 31 | +    PyMutex_Unlock(&scalar_mutex); | 
|  | 32 | +#endif | 
|  | 33 | + | 
| 22 | 34 |     if (!new) | 
| 23 | 35 |         return NULL; | 
| 24 | 36 |     new->backend = backend; | 
| @@ -184,19 +196,28 @@ QuadPrecision_str(QuadPrecisionObject *self) | 
| 184 | 196 | static PyObject * | 
| 185 | 197 | QuadPrecision_repr(QuadPrecisionObject *self) | 
| 186 | 198 | { | 
|  | 199 | +#ifdef Py_GIL_DISABLED | 
|  | 200 | +    PyMutex_Lock(&scalar_mutex); | 
|  | 201 | +#endif | 
| 187 | 202 |     PyObject *str = QuadPrecision_str(self); | 
| 188 | 203 |     if (str == NULL) { | 
| 189 | 204 |         return NULL; | 
| 190 | 205 |     } | 
| 191 | 206 |     const char *backend_str = (self->backend == BACKEND_SLEEF) ? "sleef" : "longdouble"; | 
| 192 | 207 |     PyObject *res = PyUnicode_FromFormat("QuadPrecision('%S', backend='%s')", str, backend_str); | 
| 193 | 208 |     Py_DECREF(str); | 
|  | 209 | +#ifdef Py_GIL_DISABLED | 
|  | 210 | +    PyMutex_Unlock(&scalar_mutex); | 
|  | 211 | +#endif | 
| 194 | 212 |     return res; | 
| 195 | 213 | } | 
| 196 | 214 | 
 | 
| 197 | 215 | static PyObject * | 
| 198 | 216 | QuadPrecision_repr_dragon4(QuadPrecisionObject *self) | 
| 199 | 217 | { | 
|  | 218 | +#ifdef Py_GIL_DISABLED | 
|  | 219 | +    PyMutex_Lock(&scalar_mutex); | 
|  | 220 | +#endif | 
| 200 | 221 |     Dragon4_Options opt = {.scientific = 1, | 
| 201 | 222 |                            .digit_mode = DigitMode_Unique, | 
| 202 | 223 |                            .cutoff_mode = CutoffMode_TotalLength, | 
| @@ -226,6 +247,9 @@ QuadPrecision_repr_dragon4(QuadPrecisionObject *self) | 
| 226 | 247 |     const char *backend_str = (self->backend == BACKEND_SLEEF) ? "sleef" : "longdouble"; | 
| 227 | 248 |     PyObject *res = PyUnicode_FromFormat("QuadPrecision('%S', backend='%s')", str, backend_str); | 
| 228 | 249 |     Py_DECREF(str); | 
|  | 250 | +#ifdef Py_GIL_DISABLED | 
|  | 251 | +    PyMutex_Unlock(&scalar_mutex); | 
|  | 252 | +#endif | 
| 229 | 253 |     return res; | 
| 230 | 254 | } | 
| 231 | 255 | 
 | 
|  | 
0 commit comments