[PATCH wayland v3 03/10] connection: Refactor out closure allocation
Derek Foreman
derekf at osg.samsung.com
Wed Dec 6 17:22:18 UTC 2017
Moves the common/similar bits into one place.
This has a minor functional change - count and message are now initialized
immediately, previously they'd only be set if (de)marshal was successful.
Signed-off-by: Derek Foreman <derekf at osg.samsung.com>
---
src/connection.c | 71 +++++++++++++++++++++++++++++++++-----------------------
1 file changed, 42 insertions(+), 29 deletions(-)
diff --git a/src/connection.c b/src/connection.c
index d029914..8d8eb60 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -524,16 +524,12 @@ wl_argument_from_va_list(const char *signature, union wl_argument *args,
}
}
-struct wl_closure *
-wl_closure_marshal(struct wl_object *sender, uint32_t opcode,
- union wl_argument *args,
- const struct wl_message *message)
+static struct wl_closure *
+wl_closure_init(const struct wl_message *message, uint32_t size,
+ int *num_arrays, union wl_argument *args)
{
struct wl_closure *closure;
- struct wl_object *object;
- int i, count, fd, dup_fd;
- const char *signature;
- struct argument_details arg;
+ int count;
count = arg_count_for_signature(message->signature);
if (count > WL_CLOSURE_MAX_ARGS) {
@@ -542,13 +538,44 @@ wl_closure_marshal(struct wl_object *sender, uint32_t opcode,
return NULL;
}
- closure = malloc(sizeof *closure);
- if (closure == NULL) {
+ if (size) {
+ *num_arrays = wl_message_count_arrays(message);
+ closure = malloc(sizeof *closure + size +
+ *num_arrays * sizeof(struct wl_array));
+ } else {
+ closure = malloc(sizeof *closure);
+ }
+
+ if (!closure) {
errno = ENOMEM;
return NULL;
}
- memcpy(closure->args, args, count * sizeof *args);
+ if (args)
+ memcpy(closure->args, args, count * sizeof *args);
+
+ closure->message = message;
+ closure->count = count;
+
+ return closure;
+}
+
+struct wl_closure *
+wl_closure_marshal(struct wl_object *sender, uint32_t opcode,
+ union wl_argument *args,
+ const struct wl_message *message)
+{
+ struct wl_closure *closure;
+ struct wl_object *object;
+ int i, count, fd, dup_fd;
+ const char *signature;
+ struct argument_details arg;
+
+ closure = wl_closure_init(message, 0, NULL, args);
+ if (closure == NULL)
+ return NULL;
+
+ count = closure->count;
signature = message->signature;
for (i = 0; i < count; i++) {
@@ -593,8 +620,6 @@ wl_closure_marshal(struct wl_object *sender, uint32_t opcode,
closure->sender_id = sender->id;
closure->opcode = opcode;
- closure->message = message;
- closure->count = count;
return closure;
@@ -628,29 +653,20 @@ wl_connection_demarshal(struct wl_connection *connection,
uint32_t *p, *next, *end, length, id;
int fd;
char *s;
- unsigned int i, count, num_arrays;
+ int i, count, num_arrays;
const char *signature;
struct argument_details arg;
struct wl_closure *closure;
struct wl_array *array_extra;
- count = arg_count_for_signature(message->signature);
- if (count > WL_CLOSURE_MAX_ARGS) {
- wl_log("too many args (%d)\n", count);
- errno = EINVAL;
- wl_connection_consume(connection, size);
- return NULL;
- }
-
- num_arrays = wl_message_count_arrays(message);
- closure = malloc(sizeof *closure + size +
- num_arrays * sizeof(struct wl_array));
+ closure = wl_closure_init(message, size, &num_arrays, NULL);
if (closure == NULL) {
- errno = ENOMEM;
wl_connection_consume(connection, size);
return NULL;
}
+ count = closure->count;
+
array_extra = closure->extra;
p = (uint32_t *)(closure->extra + num_arrays);
end = p + size / sizeof *p;
@@ -785,9 +801,6 @@ wl_connection_demarshal(struct wl_connection *connection,
}
}
- closure->count = count;
- closure->message = message;
-
wl_connection_consume(connection, size);
return closure;
--
2.15.0
More information about the wayland-devel
mailing list