summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJonas Ådahl <jadahl@gmail.com>2013-03-08 18:44:16 +0100
committerKristian Høgsberg <krh@bitplanet.net>2013-03-21 12:29:03 -0400
commitca53745fb7f23ade648eeb292089a765151687e3 (patch)
treeb5378e84337fb1be2bd18a20372e4666e34aeb02 /src
parentclient: Check reference count only for destroyed proxies (diff)
downloadwayland-ca53745fb7f23ade648eeb292089a765151687e3.tar
wayland-ca53745fb7f23ade648eeb292089a765151687e3.tar.gz
wayland-ca53745fb7f23ade648eeb292089a765151687e3.tar.bz2
wayland-ca53745fb7f23ade648eeb292089a765151687e3.tar.lz
wayland-ca53745fb7f23ade648eeb292089a765151687e3.tar.xz
wayland-ca53745fb7f23ade648eeb292089a765151687e3.tar.zst
wayland-ca53745fb7f23ade648eeb292089a765151687e3.zip
client: Invoke new_id closure arguments as pointers instead of integers
This commit adds a flags parameter to wl_closure_invoke(). The so far added flags are ment to specify if the invokation is client side or server side. When on the server side, closure arguments of type 'new_id' should be invoked as a integer id while on the client side they should be invoked as a pointer to a proxy object. This fixes a bug happening when the address of a client side 'new_id' proxy object did not fit in a 32 bit integer. krh: Squashed test suite compile fix from Jason Ekstrand. Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/connection.c16
-rw-r--r--src/wayland-client.c2
-rw-r--r--src/wayland-private.h7
-rw-r--r--src/wayland-server.c2
4 files changed, 19 insertions, 8 deletions
diff --git a/src/connection.c b/src/connection.c
index e6c2b64..b952da1 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -801,7 +801,8 @@ wl_closure_lookup_objects(struct wl_closure *closure, struct wl_map *objects)
}
static void
-convert_arguments_to_ffi(const char *signature, union wl_argument *args,
+convert_arguments_to_ffi(const char *signature, uint32_t flags,
+ union wl_argument *args,
int count, ffi_type **ffi_types, void** ffi_args)
{
int i;
@@ -834,8 +835,13 @@ convert_arguments_to_ffi(const char *signature, union wl_argument *args,
ffi_args[i] = &args[i].o;
break;
case 'n':
- ffi_types[i] = &ffi_type_uint32;
- ffi_args[i] = &args[i].n;
+ if (flags & WL_CLOSURE_INVOKE_CLIENT) {
+ ffi_types[i] = &ffi_type_pointer;
+ ffi_args[i] = &args[i].o;
+ } else {
+ ffi_types[i] = &ffi_type_uint32;
+ ffi_args[i] = &args[i].n;
+ }
break;
case 'a':
ffi_types[i] = &ffi_type_pointer;
@@ -855,7 +861,7 @@ convert_arguments_to_ffi(const char *signature, union wl_argument *args,
void
-wl_closure_invoke(struct wl_closure *closure,
+wl_closure_invoke(struct wl_closure *closure, uint32_t flags,
struct wl_object *target, void (*func)(void), void *data)
{
int count;
@@ -870,7 +876,7 @@ wl_closure_invoke(struct wl_closure *closure,
ffi_types[1] = &ffi_type_pointer;
ffi_args[1] = &target;
- convert_arguments_to_ffi(closure->message->signature, closure->args,
+ convert_arguments_to_ffi(closure->message->signature, flags, closure->args,
count, ffi_types + 2, ffi_args + 2);
ffi_prep_cif(&cif, FFI_DEFAULT_ABI,
diff --git a/src/wayland-client.c b/src/wayland-client.c
index 3ead2ac..c5ad96d 100644
--- a/src/wayland-client.c
+++ b/src/wayland-client.c
@@ -836,7 +836,7 @@ dispatch_event(struct wl_display *display, struct wl_event_queue *queue)
if (wl_debug)
wl_closure_print(closure, &proxy->object, false);
- wl_closure_invoke(closure, &proxy->object,
+ wl_closure_invoke(closure, WL_CLOSURE_INVOKE_CLIENT, &proxy->object,
proxy->object.implementation[opcode],
proxy->user_data);
}
diff --git a/src/wayland-private.h b/src/wayland-private.h
index f0c9010..4b757a1 100644
--- a/src/wayland-private.h
+++ b/src/wayland-private.h
@@ -129,8 +129,13 @@ wl_connection_demarshal(struct wl_connection *connection,
int
wl_closure_lookup_objects(struct wl_closure *closure, struct wl_map *objects);
+enum wl_closure_invoke_flag {
+ WL_CLOSURE_INVOKE_CLIENT = (1 << 0),
+ WL_CLOSURE_INVOKE_SERVER = (1 << 1)
+};
+
void
-wl_closure_invoke(struct wl_closure *closure,
+wl_closure_invoke(struct wl_closure *closure, uint32_t flags,
struct wl_object *target, void (*func)(void), void *data);
int
wl_closure_send(struct wl_closure *closure, struct wl_connection *connection);
diff --git a/src/wayland-server.c b/src/wayland-server.c
index 2f3ddc9..aaecf29 100644
--- a/src/wayland-server.c
+++ b/src/wayland-server.c
@@ -277,7 +277,7 @@ wl_client_connection_data(int fd, uint32_t mask, void *data)
if (wl_debug)
wl_closure_print(closure, object, false);
- wl_closure_invoke(closure, object,
+ wl_closure_invoke(closure, WL_CLOSURE_INVOKE_SERVER, object,
object->implementation[opcode], client);
wl_closure_destroy(closure);