Update Red Hat Copyright Notices
[nbdkit.git] / plugins / python / plugin.h
blobf9b537cc54c797d7922c03cf69ed9c0af32a213a
1 /* nbdkit
2 * Copyright Red Hat
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
11 * * 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.
15 * * Neither the name of Red Hat nor the names of its contributors may be
16 * used to endorse or promote products derived from this software without
17 * specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS ''AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
22 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
26 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
27 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
29 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
33 #ifndef NBDKIT_PYTHON_PLUGIN_H
34 #define NBDKIT_PYTHON_PLUGIN_H
36 /* Include these headers from one place because we have to make sure
37 * we always set these #defines identically before inclusion.
39 #define PY_SSIZE_T_CLEAN 1
40 #include <Python.h>
42 #define NBDKIT_API_VERSION 2
43 #include <nbdkit-plugin.h>
45 /* All callbacks that want to call any Py* function should use this
46 * macro. See
47 * https://docs.python.org/3/c-api/init.html#non-python-created-threads
49 #define ACQUIRE_PYTHON_GIL_FOR_CURRENT_SCOPE \
50 __attribute__ ((cleanup (cleanup_release))) \
51 CLANG_UNUSED_VARIABLE_WORKAROUND \
52 PyGILState_STATE gstate = PyGILState_Ensure ()
53 static inline void
54 cleanup_release (PyGILState_STATE *gstateptr)
56 PyGILState_Release (*gstateptr);
59 extern const char *script;
60 extern PyObject *module;
61 extern int py_api_version;
62 extern __thread int last_error;
64 /* helpers.c */
65 extern int callback_defined (const char *name, PyObject **obj_rtn);
66 extern char *python_to_string (PyObject *str);
68 /* errors.c */
69 extern int check_python_failure (const char *callback);
71 /* modfunctions.c */
72 extern PyMODINIT_FUNC create_nbdkit_module (void);
74 #endif /* NBDKIT_PYTHON_PLUGIN_H */