mirror of
https://gitlab.freedesktop.org/wayland/wayland.git
synced 2025-10-31 22:25:25 -04:00
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>
This commit is contained in:
parent
e053a56251
commit
cb73bffed5
6 changed files with 23 additions and 12 deletions
|
|
@ -801,7 +801,8 @@ wl_closure_lookup_objects(struct wl_closure *closure, struct wl_map *objects)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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 count, ffi_type **ffi_types, void** ffi_args)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
@ -834,8 +835,13 @@ convert_arguments_to_ffi(const char *signature, union wl_argument *args,
|
||||||
ffi_args[i] = &args[i].o;
|
ffi_args[i] = &args[i].o;
|
||||||
break;
|
break;
|
||||||
case 'n':
|
case 'n':
|
||||||
ffi_types[i] = &ffi_type_uint32;
|
if (flags & WL_CLOSURE_INVOKE_CLIENT) {
|
||||||
ffi_args[i] = &args[i].n;
|
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;
|
break;
|
||||||
case 'a':
|
case 'a':
|
||||||
ffi_types[i] = &ffi_type_pointer;
|
ffi_types[i] = &ffi_type_pointer;
|
||||||
|
|
@ -855,7 +861,7 @@ convert_arguments_to_ffi(const char *signature, union wl_argument *args,
|
||||||
|
|
||||||
|
|
||||||
void
|
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)
|
struct wl_object *target, void (*func)(void), void *data)
|
||||||
{
|
{
|
||||||
int count;
|
int count;
|
||||||
|
|
@ -870,7 +876,7 @@ wl_closure_invoke(struct wl_closure *closure,
|
||||||
ffi_types[1] = &ffi_type_pointer;
|
ffi_types[1] = &ffi_type_pointer;
|
||||||
ffi_args[1] = ⌖
|
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);
|
count, ffi_types + 2, ffi_args + 2);
|
||||||
|
|
||||||
ffi_prep_cif(&cif, FFI_DEFAULT_ABI,
|
ffi_prep_cif(&cif, FFI_DEFAULT_ABI,
|
||||||
|
|
|
||||||
|
|
@ -836,7 +836,7 @@ dispatch_event(struct wl_display *display, struct wl_event_queue *queue)
|
||||||
if (wl_debug)
|
if (wl_debug)
|
||||||
wl_closure_print(closure, &proxy->object, false);
|
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->object.implementation[opcode],
|
||||||
proxy->user_data);
|
proxy->user_data);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -129,8 +129,13 @@ wl_connection_demarshal(struct wl_connection *connection,
|
||||||
int
|
int
|
||||||
wl_closure_lookup_objects(struct wl_closure *closure, struct wl_map *objects);
|
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
|
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);
|
struct wl_object *target, void (*func)(void), void *data);
|
||||||
int
|
int
|
||||||
wl_closure_send(struct wl_closure *closure, struct wl_connection *connection);
|
wl_closure_send(struct wl_closure *closure, struct wl_connection *connection);
|
||||||
|
|
|
||||||
|
|
@ -277,7 +277,7 @@ wl_client_connection_data(int fd, uint32_t mask, void *data)
|
||||||
if (wl_debug)
|
if (wl_debug)
|
||||||
wl_closure_print(closure, object, false);
|
wl_closure_print(closure, object, false);
|
||||||
|
|
||||||
wl_closure_invoke(closure, object,
|
wl_closure_invoke(closure, WL_CLOSURE_INVOKE_SERVER, object,
|
||||||
object->implementation[opcode], client);
|
object->implementation[opcode], client);
|
||||||
|
|
||||||
wl_closure_destroy(closure);
|
wl_closure_destroy(closure);
|
||||||
|
|
|
||||||
|
|
@ -338,7 +338,7 @@ demarshal(struct marshal_data *data, const char *format,
|
||||||
closure = wl_connection_demarshal(data->read_connection,
|
closure = wl_connection_demarshal(data->read_connection,
|
||||||
size, &objects, &message);
|
size, &objects, &message);
|
||||||
assert(closure);
|
assert(closure);
|
||||||
wl_closure_invoke(closure, &object, func, data);
|
wl_closure_invoke(closure, WL_CLOSURE_INVOKE_SERVER, &object, func, data);
|
||||||
wl_closure_destroy(closure);
|
wl_closure_destroy(closure);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -418,7 +418,7 @@ marshal_demarshal(struct marshal_data *data,
|
||||||
object.id = msg[0];
|
object.id = msg[0];
|
||||||
closure = wl_connection_demarshal(data->read_connection,
|
closure = wl_connection_demarshal(data->read_connection,
|
||||||
size, &objects, &message);
|
size, &objects, &message);
|
||||||
wl_closure_invoke(closure, &object, func, data);
|
wl_closure_invoke(closure, WL_CLOSURE_INVOKE_SERVER, &object, func, data);
|
||||||
wl_closure_destroy(closure);
|
wl_closure_destroy(closure);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -505,7 +505,7 @@ marshal_helper(const char *format, void *handler, ...)
|
||||||
|
|
||||||
assert(closure);
|
assert(closure);
|
||||||
done = 0;
|
done = 0;
|
||||||
wl_closure_invoke(closure, &object, handler, &done);
|
wl_closure_invoke(closure, WL_CLOSURE_INVOKE_SERVER, &object, handler, &done);
|
||||||
wl_closure_destroy(closure);
|
wl_closure_destroy(closure);
|
||||||
assert(done);
|
assert(done);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -252,7 +252,7 @@ marshal_demarshal(struct marshal_data *data,
|
||||||
object.id = msg[0];
|
object.id = msg[0];
|
||||||
closure = wl_connection_demarshal(data->read_connection,
|
closure = wl_connection_demarshal(data->read_connection,
|
||||||
size, &objects, &message);
|
size, &objects, &message);
|
||||||
wl_closure_invoke(closure, &object, func, data);
|
wl_closure_invoke(closure, WL_CLOSURE_INVOKE_SERVER, &object, func, data);
|
||||||
wl_closure_destroy(closure);
|
wl_closure_destroy(closure);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue