diff options
author | Giampaolo Rodola <g.rodola@gmail.com> | 2011-02-06 23:03:04 +0000 |
---|---|---|
committer | Giampaolo Rodola <g.rodola@gmail.com> | 2011-02-06 23:03:04 +0000 |
commit | d7e7cd6cf5a17aca8b8f8a62df41e34a0649462d (patch) | |
tree | d1f7780543c360b789b0fb571c7264f63d338525 | |
parent | 5fba4be2d8408a752db32d18107fc1450f6e826d (diff) | |
download | pysendfile-d7e7cd6cf5a17aca8b8f8a62df41e34a0649462d.tar.gz |
port C extension to python 3
-rw-r--r-- | sendfilemodule.c | 80 |
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"); } + |