[PATCH wayland] client: Invoke new_id closure arguments as pointers instead of integers

Scott Moreau oreaus at gmail.com
Sat Mar 16 09:41:04 PDT 2013


Committed in gh next.

- Scott

On Fri, Mar 15, 2013 at 8:47 AM, Michael Hasselmann
<michaelh at 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 <jadahl at 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel


More information about the wayland-devel mailing list