diff options
author | Drew DeVault <sir@cmpwn.com> | 2015-11-18 08:36:08 -0500 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2015-11-18 08:36:08 -0500 |
commit | 9a1e95b7da8aa4aa3b25cd373e76d3e90fc0e52f (patch) | |
tree | 00b8c41be09152db23d8f46499f70421695bccf6 /wayland/buffers.c | |
parent | Support resizing in wayland client implementation (diff) | |
download | sway-9a1e95b7da8aa4aa3b25cd373e76d3e90fc0e52f.tar.gz sway-9a1e95b7da8aa4aa3b25cd373e76d3e90fc0e52f.tar.zst sway-9a1e95b7da8aa4aa3b25cd373e76d3e90fc0e52f.zip |
Clean up memory pool files better
Diffstat (limited to 'wayland/buffers.c')
-rw-r--r-- | wayland/buffers.c | 42 |
1 files changed, 22 insertions, 20 deletions
diff --git a/wayland/buffers.c b/wayland/buffers.c index 13193423..cc8740c4 100644 --- a/wayland/buffers.c +++ b/wayland/buffers.c | |||
@@ -11,34 +11,33 @@ | |||
11 | #include "list.h" | 11 | #include "list.h" |
12 | #include "log.h" | 12 | #include "log.h" |
13 | 13 | ||
14 | static int create_pool_file(size_t size) { | 14 | static int create_pool_file(size_t size, char **name) { |
15 | static const char template[] = "/sway-client-XXXXXX"; | 15 | static const char template[] = "/sway-client-XXXXXX"; |
16 | const char *path = getenv("XDG_RUNTIME_DIR"); | 16 | const char *path = getenv("XDG_RUNTIME_DIR"); |
17 | if (!path) { | 17 | if (!path) { |
18 | return -1; | 18 | return -1; |
19 | } | 19 | } |
20 | 20 | ||
21 | int ts = (path[strlen(path) - 1] == '/'); | 21 | int ts = (path[strlen(path) - 1] == '/'); |
22 | 22 | ||
23 | char *name = malloc( | 23 | *name = malloc( |
24 | strlen(template) + | 24 | strlen(template) + |
25 | strlen(path) + | 25 | strlen(path) + |
26 | (ts ? 1 : 0) + 1); | 26 | (ts ? 1 : 0) + 1); |
27 | sprintf(name, "%s%s%s", path, ts ? "" : "/", template); | 27 | sprintf(*name, "%s%s%s", path, ts ? "" : "/", template); |
28 | 28 | ||
29 | int fd = mkstemp(name); | 29 | int fd = mkstemp(*name); |
30 | free(name); | ||
31 | 30 | ||
32 | if (fd < 0) { | 31 | if (fd < 0) { |
33 | return -1; | 32 | return -1; |
34 | } | 33 | } |
35 | 34 | ||
36 | if (ftruncate(fd, size) < 0) { | 35 | if (ftruncate(fd, size) < 0) { |
37 | close(fd); | 36 | close(fd); |
38 | return -1; | 37 | return -1; |
39 | } | 38 | } |
40 | 39 | ||
41 | return fd; | 40 | return fd; |
42 | } | 41 | } |
43 | 42 | ||
44 | static void buffer_release(void *data, struct wl_buffer *wl_buffer) { | 43 | static void buffer_release(void *data, struct wl_buffer *wl_buffer) { |
@@ -56,12 +55,15 @@ static struct buffer *create_buffer(struct client_state *state, struct buffer *b | |||
56 | uint32_t stride = width * 4; | 55 | uint32_t stride = width * 4; |
57 | uint32_t size = stride * height; | 56 | uint32_t size = stride * height; |
58 | 57 | ||
59 | int fd = create_pool_file(size); | 58 | char *name; |
59 | int fd = create_pool_file(size, &name); | ||
60 | void *data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); | 60 | void *data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); |
61 | struct wl_shm_pool *pool = wl_shm_create_pool(state->shm, fd, size); | 61 | struct wl_shm_pool *pool = wl_shm_create_pool(state->shm, fd, size); |
62 | buf->buffer = wl_shm_pool_create_buffer(pool, 0, width, height, stride, format); | 62 | buf->buffer = wl_shm_pool_create_buffer(pool, 0, width, height, stride, format); |
63 | wl_shm_pool_destroy(pool); | 63 | wl_shm_pool_destroy(pool); |
64 | close(fd); | 64 | close(fd); |
65 | unlink(name); | ||
66 | free(name); | ||
65 | fd = -1; | 67 | fd = -1; |
66 | 68 | ||
67 | buf->surface = cairo_image_surface_create_for_data(data, CAIRO_FORMAT_ARGB32, width, height, stride); | 69 | buf->surface = cairo_image_surface_create_for_data(data, CAIRO_FORMAT_ARGB32, width, height, stride); |