Commit 529c9bf6 authored by Mat's avatar Mat
Browse files

Use more meaningful exceptions

parent 51085af7
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -37,18 +37,18 @@ static PyObject *do_attach(const char *name)

	/* Open the shm block */
	if ((fd = shm_open(name, O_RDWR, 0)) < 0)
		return PyErr_SetFromErrno(PyExc_RuntimeError);
		return PyErr_SetFromErrnoWithFilename(PyExc_OSError, name);

	/* Read the meta data structure */
	if (read(fd, &meta, sizeof (meta)) != sizeof (meta)) {
		close(fd);
		return PyErr_SetFromErrno(PyExc_RuntimeError);
		return PyErr_SetFromErrnoWithFilename(PyExc_OSError, name);
	}

	/* Check the meta data */
	if (strncmp(meta.magic, SHARED_ARRAY_MAGIC, sizeof (meta.magic))) {
		close(fd);
		PyErr_SetString(PyExc_RuntimeError,
		PyErr_SetString(PyExc_IOError,
				"No SharedArray at this address");
		return NULL;
	}
@@ -56,7 +56,7 @@ static PyObject *do_attach(const char *name)
	/* Check the number of dimensions */
	if (meta.ndims > SHARED_ARRAY_NDIMS_MAX) {
		close(fd);
		PyErr_SetString(PyExc_RuntimeError,
		PyErr_SetString(PyExc_ValueError,
				"Too many dimensions, recompile SharedArray!");
		return NULL;
	}
@@ -65,7 +65,7 @@ static PyObject *do_attach(const char *name)
	data = mmap(NULL, meta.size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
	close(fd);
	if (data == MAP_FAILED)
		return PyErr_SetFromErrno(PyExc_RuntimeError);
		return PyErr_SetFromErrnoWithFilename(PyExc_OSError, name);

	/* Summon Leon */
	leon = PyObject_MALLOC(sizeof (*leon));
+4 −4
Original line number Diff line number Diff line
@@ -39,7 +39,7 @@ 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,
		PyErr_SetString(PyExc_ValueError,
				"Too many dimensions, recompile SharedArray!");
		return NULL;
	}
@@ -52,17 +52,17 @@ static PyObject *do_create(const char *name, int ndims, npy_intp *dims, PyArray_

	/* Create the shm block */
	if ((fd = shm_open(name, O_RDWR | O_CREAT | O_EXCL, 0666)) < 0)
		return PyErr_SetFromErrno(PyExc_RuntimeError);
		return PyErr_SetFromErrnoWithFilename(PyExc_OSError, name);

	/* Set the block size */
	if (ftruncate(fd, size) < 0)
		return PyErr_SetFromErrno(PyExc_RuntimeError);
		return PyErr_SetFromErrnoWithFilename(PyExc_OSError, name);

	/* Map it */
	data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
	close(fd);
	if (data == MAP_FAILED)
		return PyErr_SetFromErrno(PyExc_RuntimeError);
		return PyErr_SetFromErrnoWithFilename(PyExc_OSError, name);

	/* Build the meta-data structure in memory */
	meta = (struct array_meta *) data;
+15 −10
Original line number Diff line number Diff line
@@ -29,30 +29,35 @@ static PyObject *do_delete(const char *name)
{
	struct array_meta meta;
	int fd;
	int size;

	/* Open the shm block */
	if ((fd = shm_open(name, O_RDWR, 0)) < 0)
		return PyErr_SetFromErrno(PyExc_RuntimeError);
		return PyErr_SetFromErrnoWithFilename(PyExc_RuntimeError, name);

	/* Read the meta data structure */
	if (read(fd, &meta, sizeof (meta)) != sizeof (meta)) {
	size = read(fd, &meta, sizeof (meta));
	close(fd);
		return PyErr_SetFromErrno(PyExc_RuntimeError);
	}

	/* Close the shm block */
	close(fd);
	/* Catch read errors */
	if (size <= 0)
		return PyErr_SetFromErrnoWithFilename(PyExc_RuntimeError, name);

	/* Catch short reads */
	if (size != sizeof (meta)) {
		PyErr_SetString(PyExc_IOError, "No SharedArray at this address");
		return NULL;
	}

	/* 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_IOError, "No SharedArray at this address");
		return NULL;
	}

	/* Unlink the shm block */
	if (shm_unlink(name) < 0)
		return PyErr_SetFromErrno(PyExc_RuntimeError);
		return PyErr_SetFromErrnoWithFilename(PyExc_OSError, name);

	Py_RETURN_NONE;
}