--- /dev/null
+import unittest
+
+from test.support import import_helper, threading_helper
+from test.support.threading_helper import run_concurrently
+
+suggestions = import_helper.import_module("_suggestions")
+
+NTHREADS = 10
+
+
+@threading_helper.requires_working_threading()
+class SuggestionsTests(unittest.TestCase):
+ def test_generate_suggestions(self):
+ candidates = [str(i) for i in range(100)]
+
+ def worker():
+ _ = suggestions._generate_suggestions(candidates, "42")
+ candidates.clear()
+
+ run_concurrently(worker_func=worker, nthreads=NTHREADS)
+
+
+if __name__ == "__main__":
+ unittest.main()
--- /dev/null
+Make _suggestions module thread-safe on the :term:`free threaded <free
+threading>` build.
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=e58d81fafad5637b]*/
/*[clinic input]
+@critical_section candidates
_suggestions._generate_suggestions
candidates: object
item: unicode
static PyObject *
_suggestions__generate_suggestions_impl(PyObject *module,
PyObject *candidates, PyObject *item)
-/*[clinic end generated code: output=79be7b653ae5e7ca input=ba2a8dddc654e33a]*/
+/*[clinic end generated code: output=79be7b653ae5e7ca input=92861a6c9bd8f667]*/
{
// Check if dir is a list
if (!PyList_CheckExact(candidates)) {
// Check if all elements in the list are Unicode
Py_ssize_t size = PyList_Size(candidates);
for (Py_ssize_t i = 0; i < size; ++i) {
- PyObject *elem = PyList_GetItem(candidates, i);
+ PyObject *elem = PyList_GET_ITEM(candidates, i);
if (!PyUnicode_Check(elem)) {
PyErr_SetString(PyExc_TypeError, "all elements in 'candidates' must be strings");
return NULL;
preserve
[clinic start generated code]*/
+#include "pycore_critical_section.h"// Py_BEGIN_CRITICAL_SECTION()
#include "pycore_modsupport.h" // _PyArg_CheckPositional()
PyDoc_STRVAR(_suggestions__generate_suggestions__doc__,
goto exit;
}
item = args[1];
+ Py_BEGIN_CRITICAL_SECTION(candidates);
return_value = _suggestions__generate_suggestions_impl(module, candidates, item);
+ Py_END_CRITICAL_SECTION();
exit:
return return_value;
}
-/*[clinic end generated code: output=1d8e963cdae30b13 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=1690dd15a464d19c input=a9049054013a1b77]*/