Committed in gh next. - Scott
On Fri, Mar 15, 2013 at 8:47 AM, Michael Hasselmann <micha...@openismus.com> wrote: > 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 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel