/* Top level Exception; inherits from ArithmeticError */
PyObject *DecimalException;
+
+ /* Template for creating new thread contexts, calling Context() without
+ * arguments and initializing the module_context on first access. */
+ PyObject *default_context_template;
+
+ /* Basic and extended context templates */
+ PyObject *basic_context_template;
+ PyObject *extended_context_template;
} decimal_state;
static decimal_state global_state;
static PyObject *current_context_var = NULL;
#endif
-/* Template for creating new thread contexts, calling Context() without
- * arguments and initializing the module_context on first access. */
-static PyObject *default_context_template = NULL;
-/* Basic and extended context templates */
-static PyObject *basic_context_template = NULL;
-static PyObject *extended_context_template = NULL;
-
-
/* Error codes for functions that return signals or conditions */
#define DEC_INVALID_SIGNALS (MPD_Max_status+1U)
#define DEC_ERR_OCCURRED (DEC_INVALID_SIGNALS<<1)
ctx = CTX(self);
- if (default_context_template) {
- *ctx = *CTX(default_context_template);
+ if (state->default_context_template) {
+ *ctx = *CTX(state->default_context_template);
}
else {
*ctx = dflt_ctx;
}
/* Set up a new thread local context. */
- tl_context = context_copy(default_context_template, NULL);
+ tl_context = context_copy(state->default_context_template, NULL);
if (tl_context == NULL) {
return NULL;
}
/* If the new context is one of the templates, make a copy.
* This is the current behavior of decimal.py. */
- if (v == default_context_template ||
- v == basic_context_template ||
- v == extended_context_template) {
+ if (v == state->default_context_template ||
+ v == state->basic_context_template ||
+ v == state->extended_context_template) {
v = context_copy(v, NULL);
if (v == NULL) {
return NULL;
static PyObject *
init_current_context(void)
{
- PyObject *tl_context = context_copy(default_context_template, NULL);
+ decimal_state *state = GLOBAL_STATE();
+ PyObject *tl_context = context_copy(state->default_context_template, NULL);
if (tl_context == NULL) {
return NULL;
}
/* If the new context is one of the templates, make a copy.
* This is the current behavior of decimal.py. */
- if (v == default_context_template ||
- v == basic_context_template ||
- v == extended_context_template) {
+ if (v == state->default_context_template ||
+ v == state->basic_context_template ||
+ v == state->extended_context_template) {
v = context_copy(v, NULL);
if (v == NULL) {
return NULL;
/* Init default context template first */
- ASSIGN_PTR(default_context_template,
+ ASSIGN_PTR(state->default_context_template,
PyObject_CallObject((PyObject *)state->PyDecContext_Type, NULL));
CHECK_INT(PyModule_AddObject(m, "DefaultContext",
- Py_NewRef(default_context_template)));
+ Py_NewRef(state->default_context_template)));
#ifndef WITH_DECIMAL_CONTEXTVAR
ASSIGN_PTR(tls_context_key, PyUnicode_FromString("___DECIMAL_CTX__"));
CHECK_INT(PyModule_AddObject(m, "HAVE_THREADS", Py_NewRef(Py_True)));
/* Init basic context template */
- ASSIGN_PTR(basic_context_template,
+ ASSIGN_PTR(state->basic_context_template,
PyObject_CallObject((PyObject *)state->PyDecContext_Type, NULL));
- init_basic_context(basic_context_template);
+ init_basic_context(state->basic_context_template);
CHECK_INT(PyModule_AddObject(m, "BasicContext",
- Py_NewRef(basic_context_template)));
+ Py_NewRef(state->basic_context_template)));
/* Init extended context template */
- ASSIGN_PTR(extended_context_template,
+ ASSIGN_PTR(state->extended_context_template,
PyObject_CallObject((PyObject *)state->PyDecContext_Type, NULL));
- init_extended_context(extended_context_template);
+ init_extended_context(state->extended_context_template);
CHECK_INT(PyModule_AddObject(m, "ExtendedContext",
- Py_NewRef(extended_context_template)));
+ Py_NewRef(state->extended_context_template)));
/* Init mpd_ssize_t constants */
Py_CLEAR(MutableMapping); /* GCOV_NOT_REACHED */
Py_CLEAR(SignalTuple); /* GCOV_NOT_REACHED */
Py_CLEAR(state->DecimalTuple); /* GCOV_NOT_REACHED */
- Py_CLEAR(default_context_template); /* GCOV_NOT_REACHED */
+ Py_CLEAR(state->default_context_template); /* GCOV_NOT_REACHED */
#ifndef WITH_DECIMAL_CONTEXTVAR
Py_CLEAR(tls_context_key); /* GCOV_NOT_REACHED */
#else
Py_CLEAR(current_context_var); /* GCOV_NOT_REACHED */
#endif
- Py_CLEAR(basic_context_template); /* GCOV_NOT_REACHED */
- Py_CLEAR(extended_context_template); /* GCOV_NOT_REACHED */
+ Py_CLEAR(state->basic_context_template); /* GCOV_NOT_REACHED */
+ Py_CLEAR(state->extended_context_template); /* GCOV_NOT_REACHED */
Py_CLEAR(m); /* GCOV_NOT_REACHED */
return NULL; /* GCOV_NOT_REACHED */