mirror of
				https://github.com/python/cpython.git
				synced 2025-10-29 17:38:56 +00:00 
			
		
		
		
	 c2627d6eea
			
		
	
	
		c2627d6eea
		
			
		
	
	
	
	
		
			
			This PR adds the ability to enable the GIL if it was disabled at interpreter startup, and modifies the multi-phase module initialization path to enable the GIL when loading a module, unless that module's spec includes a slot indicating it can run safely without the GIL. PEP 703 called the constant for the slot `Py_mod_gil_not_used`; I went with `Py_MOD_GIL_NOT_USED` for consistency with gh-104148. A warning will be issued up to once per interpreter for the first GIL-using module that is loaded. If `-v` is given, a shorter message will be printed to stderr every time a GIL-using module is loaded (including the first one that issues a warning).
		
			
				
	
	
		
			69 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "Python.h"
 | |
| #include "pycore_pyerrors.h"
 | |
| #include "clinic/_suggestions.c.h"
 | |
| 
 | |
| /*[clinic input]
 | |
| module _suggestions
 | |
| [clinic start generated code]*/
 | |
| /*[clinic end generated code: output=da39a3ee5e6b4b0d input=e58d81fafad5637b]*/
 | |
| 
 | |
| /*[clinic input]
 | |
| _suggestions._generate_suggestions
 | |
|     candidates: object
 | |
|     item: unicode
 | |
|     /
 | |
| Returns the candidate in candidates that's closest to item
 | |
| [clinic start generated code]*/
 | |
| 
 | |
| static PyObject *
 | |
| _suggestions__generate_suggestions_impl(PyObject *module,
 | |
|                                         PyObject *candidates, PyObject *item)
 | |
| /*[clinic end generated code: output=79be7b653ae5e7ca input=ba2a8dddc654e33a]*/
 | |
| {
 | |
|    // Check if dir is a list
 | |
|     if (!PyList_Check(candidates)) {
 | |
|         PyErr_SetString(PyExc_TypeError, "candidates must be a list");
 | |
|         return NULL;
 | |
|     }
 | |
| 
 | |
|     // 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);
 | |
|         if (!PyUnicode_Check(elem)) {
 | |
|             PyErr_SetString(PyExc_TypeError, "all elements in 'candidates' must be strings");
 | |
|             return NULL;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     PyObject* result =  _Py_CalculateSuggestions(candidates, item);
 | |
|     if (!result && !PyErr_Occurred()) {
 | |
|         Py_RETURN_NONE;
 | |
|     }
 | |
|     return result;
 | |
| }
 | |
| 
 | |
| 
 | |
| static PyMethodDef module_methods[] = {
 | |
|     _SUGGESTIONS__GENERATE_SUGGESTIONS_METHODDEF
 | |
|     {NULL, NULL, 0, NULL} // Sentinel
 | |
| };
 | |
| 
 | |
| static PyModuleDef_Slot module_slots[] = {
 | |
|     {Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED},
 | |
|     {Py_mod_gil, Py_MOD_GIL_NOT_USED},
 | |
|     {0, NULL},
 | |
| };
 | |
| 
 | |
| static struct PyModuleDef suggestions_module = {
 | |
|     PyModuleDef_HEAD_INIT,
 | |
|     "_suggestions",
 | |
|     NULL,
 | |
|     0,
 | |
|     module_methods,
 | |
|     module_slots,
 | |
| };
 | |
| 
 | |
| PyMODINIT_FUNC PyInit__suggestions(void) {
 | |
|     return PyModuleDef_Init(&suggestions_module);
 | |
| }
 |