Commit 51085af7 authored by Mat's avatar Mat
Browse files

Added support for python 2.7

parent 2a0b0fdf
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
#!/usr/bin/env python3
#!/usr/bin/env python
##
##      Project: SharedArray
## 
@@ -14,5 +14,16 @@

from distutils.core import setup, Extension
from glob import glob
import os

setup(ext_modules = [ Extension("SharedArray", glob("src/*.c")) ])
setup(name         = 'SharedArray',
      description  = 'Share numpy arrays between processes',
      author       = 'Mathieu Mirmont',
      author_email = 'mat@parad0x.org',
      url          = 'http://parad0x.org/git/python/shared-array/',
      version      = '0.0',
      license      = "GPL 2",
      platforms    = "POSIX",
      ext_modules = [ Extension('SharedArray',
                                glob(os.path.join('src', '*.c')),
                                libraries = [ 'rt' ]) ])
+60 −22
Original line number Diff line number Diff line
@@ -19,54 +19,92 @@
#include "shared_array.h"
#include "shared_array_leon.h"

/* Module name */
static const char module_name[] = "SharedArray";

/* Module documentation string */
static const char module_docstring[] =
	"This module lets you share numpy arrays "
	"between several python interpreters";

/*
 * Module functions
 */
static PyMethodDef module_functions[] = {
	{ "create", (PyCFunction) shared_array_create,
	  METH_VARARGS | METH_KEYWORDS, "Create a numpy array in shared memory" },
	  METH_VARARGS | METH_KEYWORDS,
	  "Create a numpy array in shared memory" },

	{ "attach", (PyCFunction) shared_array_attach,
	  METH_VARARGS, "Attach a numpy array from shared memory" },
	  METH_VARARGS,
	  "Attach an existing numpy array from shared memory" },

	{ "delete", (PyCFunction) shared_array_delete,
	  METH_VARARGS, "Delete a numpy array from shared memory" },
	  METH_VARARGS,
	  "Delete an existing numpy array from shared memory" },

	{ NULL, NULL, 0, NULL }
};

#if PY_MAJOR_VERSION >= 3

/*
 * Module definition
 */
static struct PyModuleDef module_def = {
        PyModuleDef_HEAD_INIT,
	"SharedArray",
	"This module lets you share numpy arrays between several python interpreters",
        -1,
        module_functions,
        NULL,
        NULL,
        NULL,
        NULL,
	module_name,		/* m_name	*/
	module_docstring,	/* m_doc	*/
        -1,			/* m_size	*/
        module_functions,	/* m_methods	*/
        NULL,			/* m_reload	*/
        NULL,			/* m_traverse	*/
        NULL,			/* m_clear	*/
        NULL,			/* m_free	*/
};

/* Module creation function for python 3 */
#define CREATE_MODULE(NAME, FUNCTIONS, DOCSTRING)	\
	PyModule_Create(&module_def)
#else
/* Module creation function for python 2 */
#define CREATE_MODULE(NAME, FUNCTIONS, DOCSTRING)	\
	Py_InitModule3(NAME, FUNCTIONS, DOCSTRING)
#endif

/*
 * Module initialisation
 */
PyMODINIT_FUNC PyInit_SharedArray(void)
static PyObject *module_init(void)
{
	PyObject *m;

	/* Ready our type */
	if (PyType_Ready(&PyLeonObject_Type) < 0)
		return NULL;
	/* Import numpy arrays */
	import_array();

	/* Register our module */
	if (!(m = PyModule_Create(&module_def)))
	/* Register the module */
	if (!(m = CREATE_MODULE(module_name, module_functions, module_docstring)))
		return NULL;

	/* Register our type */
	/* Register the Leon type */
	PyType_Ready(&PyLeonObject_Type);
	Py_INCREF(&PyLeonObject_Type);
	PyModule_AddObject(m, "SharedArray", (PyObject *) &PyLeonObject_Type);
	PyModule_AddObject(m, module_name, (PyObject *) &PyLeonObject_Type);

	/* Import numpy arrays */
	import_array();
	return m;
}

/*
 * Python 2.7 compatibility blob
 */
#if PY_MAJOR_VERSION >= 3
PyMODINIT_FUNC PyInit_SharedArray(void)
{
	return module_init();
}
#else
PyMODINIT_FUNC initSharedArray(void)
{
	module_init();
}
#endif
+6 −3
Original line number Diff line number Diff line
@@ -48,14 +48,16 @@ static PyObject *do_attach(const char *name)
	/* Check the meta data */
	if (strncmp(meta.magic, SHARED_ARRAY_MAGIC, sizeof (meta.magic))) {
		close(fd);
		PyErr_SetString(PyExc_RuntimeError, "No SharedArray at this address");
		PyErr_SetString(PyExc_RuntimeError,
				"No SharedArray at this address");
		return NULL;
	}

	/* Check the number of dimensions */
	if (meta.ndims > SHARED_ARRAY_NDIMS_MAX) {
		close(fd);
		PyErr_SetString(PyExc_RuntimeError, "Too many dimensions, recompile SharedArray!");
		PyErr_SetString(PyExc_RuntimeError,
				"Too many dimensions, recompile SharedArray!");
		return NULL;
	}
	
@@ -72,7 +74,8 @@ static PyObject *do_attach(const char *name)
	leon->size = meta.size;

	/* Create the array object */
	ret = PyArray_SimpleNewFromData(meta.ndims, meta.dims, meta.typenum, data + sizeof (meta));
	ret = PyArray_SimpleNewFromData(meta.ndims, meta.dims, meta.typenum,
					data + sizeof (meta));

	/* Attach Leon to the array */
	PyArray_SetBaseObject((PyArrayObject *) ret, (PyObject *) leon);
+2 −1
Original line number Diff line number Diff line
@@ -39,7 +39,8 @@ static PyObject *do_create(const char *name, int ndims, npy_intp *dims, PyArray_

	/* Internal limitation */
	if (ndims > SHARED_ARRAY_NDIMS_MAX) {
		PyErr_SetString(PyExc_RuntimeError, "Too many dimensions, recompile SharedArray!");
		PyErr_SetString(PyExc_RuntimeError,
				"Too many dimensions, recompile SharedArray!");
		return NULL;
	}

+2 −1
Original line number Diff line number Diff line
@@ -45,7 +45,8 @@ static PyObject *do_delete(const char *name)

	/* Check the meta data */
	if (strncmp(meta.magic, SHARED_ARRAY_MAGIC, sizeof (meta.magic))) {
		PyErr_SetString(PyExc_RuntimeError, "No SharedArray at this address");
		PyErr_SetString(PyExc_RuntimeError,
				"No SharedArray at this address");
		return NULL;
	}