2 * collectd - src/cpython.h
3 * Copyright (C) 2009 Sven Trenkel
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
24 * Sven Trenkel <collectd at semidefinite.de>
27 /* These two macros are basicly Py_BEGIN_ALLOW_THREADS and Py_BEGIN_ALLOW_THREADS
28 * from the other direction. If a Python thread calls a C function
29 * Py_BEGIN_ALLOW_THREADS is used to allow other python threads to run because
30 * we don't intend to call any Python functions.
32 * These two macros are used whenever a C thread intends to call some Python
33 * function, usually because some registered callback was triggered.
34 * Just like Py_BEGIN_ALLOW_THREADS it opens a block so these macros have to be
35 * used in pairs. They aquire the GIL, create a new Python thread state and swap
36 * the current thread state with the new one. This means this thread is now allowed
37 * to execute Python code. */
39 #define CPY_LOCK_THREADS {\
40 PyGILState_STATE gil_state;\
41 gil_state = PyGILState_Ensure();
43 #define CPY_RETURN_FROM_THREADS \
44 PyGILState_Release(gil_state);\
47 #define CPY_RELEASE_THREADS \
48 PyGILState_Release(gil_state);\
51 /* Python 2.4 has this macro, older versions do not. */
53 #define Py_VISIT(o) do {\
56 _vret = visit((o), arg);\
63 /* Python 2.4 has this macro, older versions do not. */
65 #define Py_CLEAR(o) do {\
72 /* Python 2.4 has this macro, older versions do not. */
73 #ifndef Py_RETURN_NONE
74 # define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None
78 /* Python3 compatibility layer. To keep the actual code as clean as possible
79 * do a lot of defines here. */
81 #if PY_MAJOR_VERSION >= 3
87 #define PyInt_FromLong PyLong_FromLong
88 #define CPY_INIT_TYPE PyVarObject_HEAD_INIT(NULL, 0)
89 #define IS_BYTES_OR_UNICODE(o) (PyUnicode_Check(o) || PyBytes_Check(o))
90 #define CPY_STRCAT PyUnicode_Concat
94 #define CPY_INIT_TYPE PyObject_HEAD_INIT(NULL) 0,
95 #define IS_BYTES_OR_UNICODE(o) (PyUnicode_Check(o) || PyString_Check(o))
96 #define CPY_STRCAT PyString_Concat
100 static inline const char *cpy_unicode_or_bytes_to_string(PyObject **o) {
101 if (PyUnicode_Check(*o)) {
103 tmp = PyUnicode_AsEncodedString(*o, NULL, NULL); /* New reference. */
109 return PyBytes_AsString(*o);
112 static inline PyObject *cpy_string_to_unicode_or_bytes(const char *buf) {
114 /* Python3 preferrs unicode */
116 ret = PyUnicode_Decode(buf, strlen(buf), NULL, NULL);
121 return PyBytes_FromString(buf);
124 /* Python object declarations. */
127 PyObject_HEAD /* No semicolon! */
128 PyObject *parent; /* Config */
129 PyObject *key; /* String */
130 PyObject *values; /* Sequence */
131 PyObject *children; /* Sequence */
134 PyTypeObject ConfigType;
137 PyObject_HEAD /* No semicolon! */
139 char host[DATA_MAX_NAME_LEN];
140 char plugin[DATA_MAX_NAME_LEN];
141 char plugin_instance[DATA_MAX_NAME_LEN];
142 char type[DATA_MAX_NAME_LEN];
143 char type_instance[DATA_MAX_NAME_LEN];
146 PyTypeObject PluginDataType;
150 PyObject *values; /* Sequence */
154 PyTypeObject ValuesType;
159 char message[NOTIF_MAX_MSG_LEN];
162 PyTypeObject NotificationType;