From 51bbf779ba2c9d5954e2c9470a8eae7c1ddd38a5 Mon Sep 17 00:00:00 2001 From: Phil Jones Date: Tue, 7 Jun 2022 13:47:35 +0100 Subject: Switch from using (E)GL to wl_shm. eglInitialize() is slow (~50-100ms), and uses a fair amount of memory (~100 MB). For such a small, simple program that just wants to launch as quickly as possible, wl_shm performs better. --- src/shm.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/shm.c (limited to 'src/shm.c') diff --git a/src/shm.c b/src/shm.c new file mode 100644 index 0000000..e145d4a --- /dev/null +++ b/src/shm.c @@ -0,0 +1,49 @@ +#include +#include +#include +#include +#include +#include "shm.h" + +static void randname(char *buf) +{ + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + long r = ts.tv_nsec; + for (int i = 0; i < 6; ++i) { + buf[i] = 'A'+(r&15)+(r&16)*2; + r >>= 5; + } +} + +static int create_shm_file(void) +{ + int retries = 100; + do { + char name[] = "/wl_shm-XXXXXX"; + randname(name + sizeof(name) - 7); + --retries; + int fd = shm_open(name, O_RDWR | O_CREAT | O_EXCL, 0600); + if (fd >= 0) { + shm_unlink(name); + return fd; + } + } while (retries > 0 && errno == EEXIST); + return -1; +} + +int shm_allocate_file(size_t size) +{ + int fd = create_shm_file(); + if (fd < 0) + return -1; + int ret; + do { + ret = ftruncate(fd, size); + } while (ret < 0 && errno == EINTR); + if (ret < 0) { + close(fd); + return -1; + } + return fd; +} -- cgit v1.2.3