portability: abstract memfd_create away
This commit is contained in:
parent
4b54d4b3d1
commit
f257340432
@ -42,6 +42,7 @@ extern zwlr_layer_shell_v1* wlrLayerShell;
|
|||||||
void spawn(Monitor&, const Arg& arg);
|
void spawn(Monitor&, const Arg& arg);
|
||||||
void setCloexec(int fd);
|
void setCloexec(int fd);
|
||||||
[[noreturn]] void die(const char* why);
|
[[noreturn]] void die(const char* why);
|
||||||
|
[[noreturn]] void diesys(const char* why);
|
||||||
|
|
||||||
// wayland smart pointers
|
// wayland smart pointers
|
||||||
template<typename T>
|
template<typename T>
|
||||||
|
@ -62,7 +62,6 @@ static void onGlobalRemove(void*, wl_registry* registry, uint32_t name);
|
|||||||
static void requireGlobal(const void* p, const char* name);
|
static void requireGlobal(const void* p, const char* name);
|
||||||
static void waylandFlush();
|
static void waylandFlush();
|
||||||
static void cleanup();
|
static void cleanup();
|
||||||
[[noreturn]] static void diesys(const char* why);
|
|
||||||
|
|
||||||
wl_display* display;
|
wl_display* display;
|
||||||
wl_compositor* compositor;
|
wl_compositor* compositor;
|
||||||
|
@ -1,11 +1,14 @@
|
|||||||
// somebar - dwl bar
|
// somebar - dwl bar
|
||||||
// See LICENSE file for copyright and license details.
|
// See LICENSE file for copyright and license details.
|
||||||
|
|
||||||
|
#include <fcntl.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include "shm_buffer.hpp"
|
#include "shm_buffer.hpp"
|
||||||
#include "common.hpp"
|
#include "common.hpp"
|
||||||
|
|
||||||
|
static int createAnonShm();
|
||||||
constexpr int n = 2;
|
constexpr int n = 2;
|
||||||
|
|
||||||
ShmBuffer::ShmBuffer(int w, int h, wl_shm_format format)
|
ShmBuffer::ShmBuffer(int w, int h, wl_shm_format format)
|
||||||
@ -15,8 +18,13 @@ ShmBuffer::ShmBuffer(int w, int h, wl_shm_format format)
|
|||||||
{
|
{
|
||||||
auto oneSize = stride*size_t(h);
|
auto oneSize = stride*size_t(h);
|
||||||
auto totalSize = oneSize * n;
|
auto totalSize = oneSize * n;
|
||||||
auto fd = memfd_create("wl_shm", MFD_CLOEXEC);
|
auto fd = createAnonShm();
|
||||||
ftruncate(fd, totalSize);
|
if (fd < 0) {
|
||||||
|
diesys("memfd_create");
|
||||||
|
}
|
||||||
|
if (ftruncate(fd, totalSize) < 0) {
|
||||||
|
diesys("ftruncate");
|
||||||
|
}
|
||||||
auto pool = wl_shm_create_pool(shm, fd, totalSize);
|
auto pool = wl_shm_create_pool(shm, fd, totalSize);
|
||||||
auto ptr = reinterpret_cast<uint8_t*>(mmap(nullptr, totalSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0));
|
auto ptr = reinterpret_cast<uint8_t*>(mmap(nullptr, totalSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0));
|
||||||
_mapping = MemoryMapping {ptr, totalSize};
|
_mapping = MemoryMapping {ptr, totalSize};
|
||||||
@ -34,3 +42,30 @@ ShmBuffer::ShmBuffer(int w, int h, wl_shm_format format)
|
|||||||
uint8_t* ShmBuffer::data() { return _buffers[_current].data; }
|
uint8_t* ShmBuffer::data() { return _buffers[_current].data; }
|
||||||
wl_buffer* ShmBuffer::buffer() { return _buffers[_current].buffer.get(); }
|
wl_buffer* ShmBuffer::buffer() { return _buffers[_current].buffer.get(); }
|
||||||
void ShmBuffer::flip() { _current = 1-_current; }
|
void ShmBuffer::flip() { _current = 1-_current; }
|
||||||
|
|
||||||
|
#if defined(__linux__)
|
||||||
|
static int createAnonShm() {
|
||||||
|
return memfd_create("wl_shm", MFD_CLOEXEC);
|
||||||
|
}
|
||||||
|
#elif defined(__FreeBSD__)
|
||||||
|
static int createAnonShm() {
|
||||||
|
auto fd = shm_open(SHM_ANON, O_CREAT | O_RDWR, 0600);
|
||||||
|
setCloexec(fd);
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
#elif defined(__OpenBSD__)
|
||||||
|
static int createAnonShm() {
|
||||||
|
char name[] = "/wl_shm-XXXXXX";
|
||||||
|
auto fd = shm_mkstemp(name);
|
||||||
|
if (fd >= 0) {
|
||||||
|
auto res = shm_unlink(name);
|
||||||
|
if (res < 0) {
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setCloexec(fd);
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#error "your system has no sane method of creating an anonymous shared memory object. no, calling shm_open in a loop is not sane."
|
||||||
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user