| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | /* GATE PROJECT LICENSE: | ||
| 2 | +----------------------------------------------------------------------------+ | ||
| 3 | | Copyright(c) 2018-2025, Stefan Meislinger <sm@opengate.at> | | ||
| 4 | | All rights reserved. | | ||
| 5 | | | | ||
| 6 | | Redistribution and use in source and binary forms, with or without | | ||
| 7 | | modification, are permitted provided that the following conditions are met:| | ||
| 8 | | | | ||
| 9 | | 1. Redistributions of source code must retain the above copyright notice, | | ||
| 10 | | this list of conditions and the following disclaimer. | | ||
| 11 | | 2. Redistributions in binary form must reproduce the above copyright | | ||
| 12 | | notice, this list of conditions and the following disclaimer in the | | ||
| 13 | | documentation and/or other materials provided with the distribution. | | ||
| 14 | | | | ||
| 15 | | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"| | ||
| 16 | | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | | ||
| 17 | | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | | ||
| 18 | | ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | | ||
| 19 | | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | | ||
| 20 | | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | | ||
| 21 | | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | | ||
| 22 | | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | | ||
| 23 | | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | | ||
| 24 | | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF | | ||
| 25 | | THE POSSIBILITY OF SUCH DAMAGE. | | ||
| 26 | +----------------------------------------------------------------------------+ | ||
| 27 | */ | ||
| 28 | |||
| 29 | #include "gate/scripting/pythonscripts.h" | ||
| 30 | #include "gate/libraries.h" | ||
| 31 | #include "gate/atomics.h" | ||
| 32 | #include "gate/results.h" | ||
| 33 | |||
| 34 | static gate_atomic_flag_t gate_python_init_done = GATE_ATOMIC_FLAG_INIT; | ||
| 35 | static gate_library_t gate_python_library; | ||
| 36 | static gate_python_t gate_py; | ||
| 37 | static gate_string_t const python3_libname = { "python3", 7, NULL }; | ||
| 38 | |||
| 39 | ✗ | gate_result_t gate_python_init(gate_python_t* python) | |
| 40 | { | ||
| 41 | ✗ | gate_result_t ret = GATE_RESULT_FAILED; | |
| 42 | ✗ | gate_bool_t close_library = false; | |
| 43 | |||
| 44 | do | ||
| 45 | { | ||
| 46 | ✗ | if (gate_atomic_flag_set(&gate_python_init_done)) | |
| 47 | { | ||
| 48 | /* already initialized */ | ||
| 49 | ✗ | ret = GATE_RESULT_OK; | |
| 50 | ✗ | break; | |
| 51 | } | ||
| 52 | |||
| 53 | ✗ | GATE_BREAK_IF_FAILED( | |
| 54 | ret = gate_library_open(&python3_libname, &gate_python_library, GATE_LIBRARY_FLAG_DEFAULT) | ||
| 55 | ); | ||
| 56 | ✗ | close_library = true; | |
| 57 | |||
| 58 | #define GATE_PYTHON_LOAD_FUNC(name, func) \ | ||
| 59 | GATE_BREAK_IF_FAILED(gate_library_get_function_name(gate_python_library, name, &gate_py. func )) | ||
| 60 | |||
| 61 | ✗ | GATE_PYTHON_LOAD_FUNC("Py_Initialize", Initialize); | |
| 62 | ✗ | GATE_PYTHON_LOAD_FUNC("Py_InitializeEx", InitializeEx); | |
| 63 | ✗ | GATE_PYTHON_LOAD_FUNC("Py_IsInitialized", IsInitialized); | |
| 64 | ✗ | GATE_PYTHON_LOAD_FUNC("Py_Finalize", Finalize); | |
| 65 | |||
| 66 | ✗ | GATE_PYTHON_LOAD_FUNC("Py_SetProgramName", SetProgramName); | |
| 67 | ✗ | GATE_PYTHON_LOAD_FUNC("Py_GetProgramName", GetProgramName); | |
| 68 | ✗ | GATE_PYTHON_LOAD_FUNC("Py_GetPrefix", GetPrefix); | |
| 69 | ✗ | GATE_PYTHON_LOAD_FUNC("Py_GetExecPrefix", GetExecPrefix); | |
| 70 | ✗ | GATE_PYTHON_LOAD_FUNC("Py_GetProgramFullPath", GetProgramFullPath); | |
| 71 | ✗ | GATE_PYTHON_LOAD_FUNC("Py_GetPath", GetPath); | |
| 72 | ✗ | GATE_PYTHON_LOAD_FUNC("Py_GetVersion", GetVersion); | |
| 73 | ✗ | GATE_PYTHON_LOAD_FUNC("Py_GetPlatform", GetPlatform); | |
| 74 | ✗ | GATE_PYTHON_LOAD_FUNC("Py_GetCopyright", GetCopyright); | |
| 75 | ✗ | GATE_PYTHON_LOAD_FUNC("Py_GetCompiler", GetCompiler); | |
| 76 | ✗ | GATE_PYTHON_LOAD_FUNC("Py_GetBuildInfo", GetBuildInfo); | |
| 77 | ✗ | GATE_PYTHON_LOAD_FUNC("PySys_SetArgvEx", Sys_SetArgvEx); | |
| 78 | ✗ | GATE_PYTHON_LOAD_FUNC("PySys_SetArgv", Sys_SetArgv); | |
| 79 | ✗ | GATE_PYTHON_LOAD_FUNC("Py_SetPythonHome", SetPythonHome); | |
| 80 | ✗ | GATE_PYTHON_LOAD_FUNC("Py_GetPythonHome", GetPythonHome); | |
| 81 | ✗ | GATE_PYTHON_LOAD_FUNC("PyEval_InitThreads", Eval_InitThreads); | |
| 82 | ✗ | GATE_PYTHON_LOAD_FUNC("PyEval_ThreadsInitialized", Eval_ThreadsInitialized); | |
| 83 | ✗ | GATE_PYTHON_LOAD_FUNC("PyEval_SaveThread", Eval_SaveThread); | |
| 84 | ✗ | GATE_PYTHON_LOAD_FUNC("PyEval_RestoreThread", Eval_RestoreThread); | |
| 85 | ✗ | GATE_PYTHON_LOAD_FUNC("PyThreadState_Get", ThreadState_Get); | |
| 86 | ✗ | GATE_PYTHON_LOAD_FUNC("PyThreadState_Swap", ThreadState_Swap); | |
| 87 | ✗ | GATE_PYTHON_LOAD_FUNC("PyEval_ReInitThreads", Eval_ReInitThreads); | |
| 88 | ✗ | GATE_PYTHON_LOAD_FUNC("PyGILState_Ensure", GILState_Ensure); | |
| 89 | ✗ | GATE_PYTHON_LOAD_FUNC("PyGILState_Release", GILState_Release); | |
| 90 | ✗ | GATE_PYTHON_LOAD_FUNC("PyGILState_GetThisThreadState", GILState_GetThisThreadState); | |
| 91 | ✗ | GATE_PYTHON_LOAD_FUNC("PyInterpreterState_New", InterpreterState_New); | |
| 92 | ✗ | GATE_PYTHON_LOAD_FUNC("PyInterpreterState_Clear", InterpreterState_Clear); | |
| 93 | ✗ | GATE_PYTHON_LOAD_FUNC("PyInterpreterState_Delete", InterpreterState_Delete); | |
| 94 | ✗ | GATE_PYTHON_LOAD_FUNC("PyThreadState_New", ThreadState_New); | |
| 95 | ✗ | GATE_PYTHON_LOAD_FUNC("PyThreadState_Clear", ThreadState_Clear); | |
| 96 | ✗ | GATE_PYTHON_LOAD_FUNC("PyThreadState_Delete", ThreadState_Delete); | |
| 97 | ✗ | GATE_PYTHON_LOAD_FUNC("PyThreadState_GetDict", ThreadState_GetDict); | |
| 98 | ✗ | GATE_PYTHON_LOAD_FUNC("PyThreadState_SetAsyncExc", ThreadState_SetAsyncExc); | |
| 99 | ✗ | GATE_PYTHON_LOAD_FUNC("PyEval_AcquireThread", Eval_AcquireThread); | |
| 100 | ✗ | GATE_PYTHON_LOAD_FUNC("PyEval_ReleaseThread", Eval_ReleaseThread); | |
| 101 | ✗ | GATE_PYTHON_LOAD_FUNC("PyEval_AcquireLock", Eval_AcquireLock); | |
| 102 | ✗ | GATE_PYTHON_LOAD_FUNC("PyEval_ReleaseLock", Eval_ReleaseLock); | |
| 103 | ✗ | GATE_PYTHON_LOAD_FUNC("Py_NewInterpreter", NewInterpreter); | |
| 104 | ✗ | GATE_PYTHON_LOAD_FUNC("Py_EndInterpreter", EndInterpreter); | |
| 105 | ✗ | GATE_PYTHON_LOAD_FUNC("Py_AddPendingCall", AddPendingCall); | |
| 106 | ✗ | GATE_PYTHON_LOAD_FUNC("PyEval_SetProfile", Eval_SetProfile); | |
| 107 | ✗ | GATE_PYTHON_LOAD_FUNC("PyEval_SetTrace", Eval_SetTrace); | |
| 108 | ✗ | GATE_PYTHON_LOAD_FUNC("PyEval_GetCallStats", Eval_GetCallStats); | |
| 109 | |||
| 110 | ✗ | GATE_PYTHON_LOAD_FUNC("PyInterpreterState_Head", InterpreterState_Head); | |
| 111 | ✗ | GATE_PYTHON_LOAD_FUNC("PyInterpreterState_Next", InterpreterState_Next); | |
| 112 | ✗ | GATE_PYTHON_LOAD_FUNC("PyInterpreterState_ThreadHead", InterpreterState_ThreadHead); | |
| 113 | ✗ | GATE_PYTHON_LOAD_FUNC("PyThreadState_Next", ThreadState_Next); | |
| 114 | |||
| 115 | ✗ | close_library = false; | |
| 116 | ✗ | ret = GATE_RESULT_OK; | |
| 117 | } while (0); | ||
| 118 | |||
| 119 | ✗ | if (GATE_FAILED(ret)) | |
| 120 | { | ||
| 121 | ✗ | gate_atomic_flag_clear(&gate_python_init_done); | |
| 122 | } | ||
| 123 | |||
| 124 | ✗ | if (close_library) | |
| 125 | { | ||
| 126 | ✗ | gate_library_close(gate_python_library); | |
| 127 | } | ||
| 128 | ✗ | gate_python_library = NULL; | |
| 129 | |||
| 130 | ✗ | return ret; | |
| 131 | } | ||
| 132 | |||
| 133 |