diff options
author | Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com> | 2012-05-22 15:39:40 +0300 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2012-05-22 15:20:12 -0400 |
commit | ff0d7456742343400b00fa58c77efa51d5ab5d6d (patch) | |
tree | dea2fb178ce86a6492164ec96d28b71f89939a95 | |
parent | 35a92ef83ba24a0cced3c7c6b9fcde377a88f83b (diff) |
shm: Add request for resizing pools
-rw-r--r-- | protocol/wayland.xml | 10 | ||||
-rw-r--r-- | src/wayland-shm.c | 35 |
2 files changed, 40 insertions, 5 deletions
diff --git a/protocol/wayland.xml b/protocol/wayland.xml index d70ced7..8f5f6af 100644 --- a/protocol/wayland.xml +++ b/protocol/wayland.xml @@ -173,6 +173,16 @@ Destroy the pool. </description> </request> + + <request name="resize"> + <description summary="change the size of the pool mapping"> + This request will cause the server to remap the backing memory + for the pool from the fd passed when the pool was creating but + using the new size. + </description> + + <arg name="size" type="int"/> + </request> </interface> <interface name="wl_shm" version="1"> diff --git a/src/wayland-shm.c b/src/wayland-shm.c index 7900ba1..8a8a671 100644 --- a/src/wayland-shm.c +++ b/src/wayland-shm.c @@ -38,13 +38,14 @@ struct wl_shm_pool { int refcount; char *data; int size; + int fd; }; struct wl_shm_buffer { struct wl_buffer buffer; int32_t stride; uint32_t format; - void *data; + int offset; struct wl_shm_pool *pool; }; @@ -56,6 +57,7 @@ shm_pool_unref(struct wl_shm_pool *pool) return; munmap(pool->data, pool->size); + close(pool->fd); free(pool); } @@ -120,7 +122,7 @@ shm_pool_create_buffer(struct wl_client *client, struct wl_resource *resource, buffer->buffer.height = height; buffer->format = format; buffer->stride = stride; - buffer->data = pool->data + offset; + buffer->offset = offset; buffer->pool = pool; pool->refcount++; @@ -150,9 +152,32 @@ shm_pool_destroy(struct wl_client *client, struct wl_resource *resource) wl_resource_destroy(resource); } +static void +shm_pool_resize(struct wl_client *client, struct wl_resource *resource, + int32_t size) +{ + struct wl_shm_pool *pool = resource->data; + void *data; + + data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, + pool->fd, 0); + + if (data == MAP_FAILED) { + wl_resource_post_error(resource, + WL_SHM_ERROR_INVALID_FD, + "failed mmap fd %d", pool->fd); + return; + } + + munmap(pool->data, pool->size); + pool->data = data; + pool->size = size; +} + struct wl_shm_pool_interface shm_pool_interface = { shm_pool_create_buffer, - shm_pool_destroy + shm_pool_destroy, + shm_pool_resize }; static void @@ -177,10 +202,10 @@ shm_create_pool(struct wl_client *client, struct wl_resource *resource, } pool->refcount = 1; + pool->fd = fd; pool->size = size; pool->data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - close(fd); if (pool->data == MAP_FAILED) { wl_resource_post_error(resource, WL_SHM_ERROR_INVALID_FD, @@ -252,7 +277,7 @@ wl_shm_buffer_get_data(struct wl_buffer *buffer_base) if (!wl_buffer_is_shm(buffer_base)) return NULL; - return buffer->data; + return buffer->pool->data + buffer->offset; } WL_EXPORT uint32_t |