connection: Move closure object out of wl_connection

This commit is contained in:
Kristian Høgsberg 2012-04-22 13:49:35 -04:00
parent 0d6dea17b4
commit 1901d66ffc
6 changed files with 96 additions and 94 deletions

View file

@ -102,54 +102,54 @@ destroy_client(void *data)
WL_EXPORT void
wl_resource_post_event(struct wl_resource *resource, uint32_t opcode, ...)
{
struct wl_closure *closure;
struct wl_closure closure;
struct wl_object *object = &resource->object;
va_list ap;
int ret;
va_start(ap, opcode);
closure = wl_connection_vmarshal(resource->client->connection,
object, opcode, ap,
&object->interface->events[opcode]);
ret = wl_closure_vmarshal(&closure, object, opcode, ap,
&object->interface->events[opcode]);
va_end(ap);
if (closure == NULL)
if (ret)
return;
if (wl_closure_send(closure, resource->client->connection))
if (wl_closure_send(&closure, resource->client->connection))
wl_event_loop_add_idle(resource->client->display->loop,
destroy_client, resource->client);
if (wl_debug)
wl_closure_print(closure, object, true);
wl_closure_print(&closure, object, true);
wl_closure_destroy(closure);
wl_closure_destroy(&closure);
}
WL_EXPORT void
wl_resource_queue_event(struct wl_resource *resource, uint32_t opcode, ...)
{
struct wl_closure *closure;
struct wl_closure closure;
struct wl_object *object = &resource->object;
va_list ap;
int ret;
va_start(ap, opcode);
closure = wl_connection_vmarshal(resource->client->connection,
object, opcode, ap,
&object->interface->events[opcode]);
ret = wl_closure_vmarshal(&closure, object, opcode, ap,
&object->interface->events[opcode]);
va_end(ap);
if (closure == NULL)
if (ret)
return;
if (wl_closure_queue(closure, resource->client->connection))
if (wl_closure_queue(&closure, resource->client->connection))
wl_event_loop_add_idle(resource->client->display->loop,
destroy_client, resource->client);
if (wl_debug)
wl_closure_print(closure, object, true);
wl_closure_print(&closure, object, true);
wl_closure_destroy(closure);
wl_closure_destroy(&closure);
}
WL_EXPORT void
@ -187,12 +187,12 @@ wl_client_connection_data(int fd, uint32_t mask, void *data)
struct wl_connection *connection = client->connection;
struct wl_resource *resource;
struct wl_object *object;
struct wl_closure *closure;
struct wl_closure closure;
const struct wl_message *message;
uint32_t p[2];
int opcode, size;
uint32_t cmask = 0;
int len;
int len, ret;
if (mask & WL_EVENT_READABLE)
cmask |= WL_CONNECTION_READABLE;
@ -232,11 +232,11 @@ wl_client_connection_data(int fd, uint32_t mask, void *data)
}
message = &object->interface->methods[opcode];
closure = wl_connection_demarshal(client->connection, size,
&client->objects, message);
ret = wl_connection_demarshal(client->connection, &closure,
size, &client->objects, message);
len -= size;
if (closure == NULL && errno == EINVAL) {
if (ret && errno == EINVAL) {
wl_resource_post_error(client->display_resource,
WL_DISPLAY_ERROR_INVALID_METHOD,
"invalid arguments for %s@%d.%s",
@ -244,18 +244,18 @@ wl_client_connection_data(int fd, uint32_t mask, void *data)
object->id,
message->name);
break;
} else if (closure == NULL && errno == ENOMEM) {
} else if (ret && errno == ENOMEM) {
wl_resource_post_no_memory(resource);
break;
}
if (wl_debug)
wl_closure_print(closure, object, false);
wl_closure_print(&closure, object, false);
wl_closure_invoke(closure, object,
wl_closure_invoke(&closure, object,
object->implementation[opcode], client);
wl_closure_destroy(closure);
wl_closure_destroy(&closure);
if (client->error)
break;