4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
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
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
42 #define NBDKIT_API_VERSION 2
43 #include <nbdkit-plugin.h>
45 /* All callbacks that want to call any Py* function should use this
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 ()
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
;
65 extern int callback_defined (const char *name
, PyObject
**obj_rtn
);
66 extern char *python_to_string (PyObject
*str
);
69 extern int check_python_failure (const char *callback
);
72 extern PyMODINIT_FUNC
create_nbdkit_module (void);
74 #endif /* NBDKIT_PYTHON_PLUGIN_H */