* Python-only fallback for thread-local callback pointers */
| 35 | * Python-only fallback for thread-local callback pointers |
| 36 | */ |
| 37 | void * |
| 38 | F2PySwapThreadLocalCallbackPtr(char *key, void *ptr) |
| 39 | { |
| 40 | PyObject *local_dict, *value; |
| 41 | void *prev; |
| 42 | |
| 43 | local_dict = PyThreadState_GetDict(); |
| 44 | if (local_dict == NULL) { |
| 45 | Py_FatalError( |
| 46 | "F2PySwapThreadLocalCallbackPtr: PyThreadState_GetDict " |
| 47 | "failed"); |
| 48 | } |
| 49 | |
| 50 | value = PyDict_GetItemString(local_dict, key); |
| 51 | if (value != NULL) { |
| 52 | prev = PyLong_AsVoidPtr(value); |
| 53 | if (PyErr_Occurred()) { |
| 54 | Py_FatalError( |
| 55 | "F2PySwapThreadLocalCallbackPtr: PyLong_AsVoidPtr failed"); |
| 56 | } |
| 57 | } |
| 58 | else { |
| 59 | prev = NULL; |
| 60 | } |
| 61 | |
| 62 | value = PyLong_FromVoidPtr((void *)ptr); |
| 63 | if (value == NULL) { |
| 64 | Py_FatalError( |
| 65 | "F2PySwapThreadLocalCallbackPtr: PyLong_FromVoidPtr failed"); |
| 66 | } |
| 67 | |
| 68 | if (PyDict_SetItemString(local_dict, key, value) != 0) { |
| 69 | Py_FatalError( |
| 70 | "F2PySwapThreadLocalCallbackPtr: PyDict_SetItemString failed"); |
| 71 | } |
| 72 | |
| 73 | Py_DECREF(value); |
| 74 | |
| 75 | return prev; |
| 76 | } |
| 77 | |
| 78 | void * |
| 79 | F2PyGetThreadLocalCallbackPtr(char *key) |
nothing calls this directly
no outgoing calls
no test coverage detected