Return the closure from wl_connection_vmarshal()

And provide a function to write it to a connection.
dev
Kristian Høgsberg 15 years ago
parent 50038e4757
commit 6bce89da78
  1. 16
      connection.c
  2. 5
      connection.h
  3. 6
      wayland-client.c
  4. 7
      wayland-server.c

@ -52,6 +52,7 @@ struct wl_closure {
ffi_cif cif; ffi_cif cif;
void *args[20]; void *args[20];
uint32_t buffer[64]; uint32_t buffer[64];
uint32_t *start;
}; };
struct wl_connection { struct wl_connection {
@ -357,7 +358,7 @@ wl_message_size_extra(const struct wl_message *message)
return extra; return extra;
} }
void struct wl_closure *
wl_connection_vmarshal(struct wl_connection *connection, wl_connection_vmarshal(struct wl_connection *connection,
struct wl_object *sender, struct wl_object *sender,
uint32_t opcode, va_list ap, uint32_t opcode, va_list ap,
@ -466,7 +467,9 @@ wl_connection_vmarshal(struct wl_connection *connection,
size = (p - start) * sizeof *p; size = (p - start) * sizeof *p;
start[0] = sender->id; start[0] = sender->id;
start[1] = opcode | (size << 16); start[1] = opcode | (size << 16);
wl_connection_write(connection, start, size); closure->start = start;
return closure;
} }
struct wl_closure * struct wl_closure *
@ -651,6 +654,15 @@ wl_closure_invoke(struct wl_closure *closure,
ffi_call(&closure->cif, func, &result, closure->args); ffi_call(&closure->cif, func, &result, closure->args);
} }
void
wl_closure_send(struct wl_closure *closure, struct wl_connection *connection)
{
uint32_t size;
size = closure->start[1] >> 16;
wl_connection_write(connection, closure->start, size);
}
void void
wl_closure_print(struct wl_closure *closure, struct wl_object *target) wl_closure_print(struct wl_closure *closure, struct wl_object *target)
{ {

@ -44,7 +44,8 @@ void wl_connection_consume(struct wl_connection *connection, size_t size);
int wl_connection_data(struct wl_connection *connection, uint32_t mask); int wl_connection_data(struct wl_connection *connection, uint32_t mask);
void wl_connection_write(struct wl_connection *connection, const void *data, size_t count); void wl_connection_write(struct wl_connection *connection, const void *data, size_t count);
void wl_connection_vmarshal(struct wl_connection *connection, struct wl_closure *
wl_connection_vmarshal(struct wl_connection *connection,
struct wl_object *sender, struct wl_object *sender,
uint32_t opcode, va_list ap, uint32_t opcode, va_list ap,
const struct wl_message *message); const struct wl_message *message);
@ -58,6 +59,8 @@ void
wl_closure_invoke(struct wl_closure *closure, wl_closure_invoke(struct wl_closure *closure,
struct wl_object *target, void (*func)(void), void *data); struct wl_object *target, void (*func)(void), void *data);
void void
wl_closure_send(struct wl_closure *closure, struct wl_connection *connection);
void
wl_closure_print(struct wl_closure *closure, struct wl_object *target); wl_closure_print(struct wl_closure *closure, struct wl_object *target);
void void
wl_closure_destroy(struct wl_closure *closure); wl_closure_destroy(struct wl_closure *closure);

@ -195,13 +195,17 @@ wl_proxy_add_listener(struct wl_proxy *proxy,
WL_EXPORT void WL_EXPORT void
wl_proxy_marshal(struct wl_proxy *proxy, uint32_t opcode, ...) wl_proxy_marshal(struct wl_proxy *proxy, uint32_t opcode, ...)
{ {
struct wl_closure *closure;
va_list ap; va_list ap;
va_start(ap, opcode); va_start(ap, opcode);
wl_connection_vmarshal(proxy->display->connection, closure = wl_connection_vmarshal(proxy->display->connection,
&proxy->base, opcode, ap, &proxy->base, opcode, ap,
&proxy->base.interface->methods[opcode]); &proxy->base.interface->methods[opcode]);
va_end(ap); va_end(ap);
wl_closure_send(closure, proxy->display->connection);
wl_closure_destroy(closure);
} }
static void static void

@ -79,6 +79,7 @@ WL_EXPORT void
wl_client_post_event(struct wl_client *client, struct wl_object *sender, wl_client_post_event(struct wl_client *client, struct wl_object *sender,
uint32_t opcode, ...) uint32_t opcode, ...)
{ {
struct wl_closure *closure;
va_list ap; va_list ap;
if (client == NULL) if (client == NULL)
@ -86,10 +87,13 @@ wl_client_post_event(struct wl_client *client, struct wl_object *sender,
return; return;
va_start(ap, opcode); va_start(ap, opcode);
wl_connection_vmarshal(client->connection, closure = wl_connection_vmarshal(client->connection,
sender, opcode, ap, sender, opcode, ap,
&sender->interface->events[opcode]); &sender->interface->events[opcode]);
va_end(ap); va_end(ap);
wl_closure_send(closure, client->connection);
wl_closure_destroy(closure);
} }
static void static void
@ -163,7 +167,6 @@ wl_client_connection_data(int fd, uint32_t mask, void *data)
object->implementation[opcode], client); object->implementation[opcode], client);
wl_closure_destroy(closure); wl_closure_destroy(closure);
} }
} }

Loading…
Cancel
Save