From b644d4620ac380212918f52da6e74d2f03babcb3 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 28 Sep 2017 16:29:12 +0530 Subject: [PATCH] OS X does not support write() with shared memory --- kitty/graphics.c | 18 +++++++++++++----- kitty_tests/graphics.py | 4 +--- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/kitty/graphics.c b/kitty/graphics.c index 14c3e652a..478141260 100644 --- a/kitty/graphics.c +++ b/kitty/graphics.c @@ -456,12 +456,20 @@ W(image_for_client_id) { return image_as_dict(img); } -W(shm_open) { - char *name; - PA("s", &name); +W(shm_write) { + const char *name, *data; + Py_ssize_t sz; + PA("ss#", &name, &data, &sz); int fd = shm_open(name, O_CREAT | O_RDWR, S_IROTH | S_IRUSR | S_IRGRP | S_IWUSR); if (fd == -1) { PyErr_SetFromErrnoWithFilename(PyExc_OSError, name); return NULL; } - return PyLong_FromLong(fd); + int ret = ftruncate(fd, sz); + if (ret != 0) { PyErr_SetFromErrnoWithFilename(PyExc_OSError, name); return NULL; } + void *addr = mmap(0, sz, PROT_WRITE, MAP_SHARED, fd, 0); + if (addr == MAP_FAILED) { PyErr_SetFromErrnoWithFilename(PyExc_OSError, name); return NULL; } + memcpy(addr, data, sz); + if (munmap(addr, sz) != 0) { PyErr_SetFromErrnoWithFilename(PyExc_OSError, name); return NULL; } + close(fd); + Py_RETURN_NONE; } W(shm_unlink) { @@ -476,7 +484,7 @@ W(shm_unlink) { static PyMethodDef methods[] = { M(image_for_client_id, METH_O), - M(shm_open, METH_VARARGS), + M(shm_write, METH_VARARGS), M(shm_unlink, METH_VARARGS), {NULL} /* Sentinel */ }; diff --git a/kitty_tests/graphics.py b/kitty_tests/graphics.py index 49f54c01c..d684ebbd7 100644 --- a/kitty_tests/graphics.py +++ b/kitty_tests/graphics.py @@ -89,8 +89,6 @@ class TestGraphics(BaseTest): # Test loading from POSIX SHM name = '/kitty-test-shm' - fd = g.shm_open(name) - f = os.fdopen(fd, 'wb') - f.write(random_data), f.flush(), f.close() + g.shm_write(name, random_data) sl(name, s=24, v=32, t='s', expecting_data=random_data) self.assertRaises(FileNotFoundError, g.shm_unlink, name) # check that file was deleted