summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiampaolo Rodola <g.rodola@gmail.com>2011-02-06 23:03:04 +0000
committerGiampaolo Rodola <g.rodola@gmail.com>2011-02-06 23:03:04 +0000
commitd7e7cd6cf5a17aca8b8f8a62df41e34a0649462d (patch)
treed1f7780543c360b789b0fb571c7264f63d338525
parent5fba4be2d8408a752db32d18107fc1450f6e826d (diff)
downloadpysendfile-d7e7cd6cf5a17aca8b8f8a62df41e34a0649462d.tar.gz
port C extension to python 3
-rw-r--r--sendfilemodule.c80
1 files changed, 62 insertions, 18 deletions
diff --git a/sendfilemodule.c b/sendfilemodule.c
index 07a7980..7726fff 100644
--- a/sendfilemodule.c
+++ b/sendfilemodule.c
@@ -266,7 +266,13 @@ method_sendfile(PyObject *self, PyObject *args)
#endif /* --- end Linux --- */
-static PyMethodDef SendfileMethods[] = {
+
+/*
+ * Define the psutil C module methods and initialize the module.
+ */
+static PyMethodDef
+SendfileMethods[] =
+{
{"sendfile", method_sendfile, METH_VARARGS | METH_KEYWORDS,
"sendfile(out_fd, in_fd, offset, count) = [position, sent]\n"
"\n"
@@ -310,28 +316,66 @@ static PyMethodDef SendfileMethods[] = {
{NULL, NULL, 0, NULL} /* Sentinel */
};
-static void
-insint (PyObject *d, char *name, int value)
-{
- PyObject *v = PyInt_FromLong((long) value);
- if (!v || PyDict_SetItemString(d, name, v))
- PyErr_Clear();
+struct module_state {
+ PyObject *error;
+};
+
+#if PY_MAJOR_VERSION >= 3
+#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
+#else
+#define GETSTATE(m) (&_state)
+static struct module_state _state;
+#endif
+
+#if PY_MAJOR_VERSION >= 3
- Py_XDECREF(v);
+static int
+sendfile_traverse(PyObject *m, visitproc visit, void *arg) {
+ Py_VISIT(GETSTATE(m)->error);
+ return 0;
}
-PyMODINIT_FUNC
-initsendfile(void)
-{
- PyObject *m = Py_InitModule("sendfile", SendfileMethods);
+static int
+sendfile_clear(PyObject *m) {
+ Py_CLEAR(GETSTATE(m)->error);
+ return 0;
+}
+
+static struct PyModuleDef
+moduledef = {
+ PyModuleDef_HEAD_INIT,
+ "sendfile",
+ NULL,
+ sizeof(struct module_state),
+ SendfileMethods,
+ NULL,
+ sendfile_traverse,
+ sendfile_clear,
+ NULL
+};
- PyObject *d = PyModule_GetDict (m);
+#define INITERROR return NULL
+
+PyObject *
+PyInit_sendfile(void)
-#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(_AIX)
- insint (d, "has_sf_hdtr", 1);
#else
- insint (d, "has_sf_hdtr", 0);
+#define INITERROR return
+
+void init_sendfile(void)
+#endif
+{
+#if PY_MAJOR_VERSION >= 3
+ PyObject *module = PyModule_Create(&moduledef);
+#else
+ PyObject *module = Py_InitModule("sendfile", SendfileMethods);
+#endif
+ if (module == NULL) {
+ INITERROR;
+ }
+ struct module_state *st = GETSTATE(module);
+#if PY_MAJOR_VERSION >= 3
+ return module;
#endif
- PyModule_AddStringConstant(m, "__doc__", "Direct interface to FreeBSD and Linux sendfile(2), for sending file data to a socket directly via the kernel.");
- PyModule_AddStringConstant(m, "__version__", "1.2.4");
}
+