Could we get this merged please? It fixes an annoying crasher bug for us (see FDO#62367).
Thanks, Michael On Fri, 2013-03-08 at 18:44 +0100, Jonas Ådahl wrote: > 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. > > Signed-off-by: Jonas Ådahl <jad...@gmail.com> > --- > src/connection.c | 16 +++++++++++----- > src/wayland-client.c | 2 +- > src/wayland-private.h | 7 ++++++- > src/wayland-server.c | 2 +- > 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] = ⌖ > > - 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); _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel