From: Amitay Isaacs Date: Wed, 4 Jan 2017 05:20:17 +0000 (+1100) Subject: ctdb-common: Simplify async computation for sock_socket_write_send/recv X-Git-Tag: talloc-2.1.9~475 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d9370550a7f72ff02c296ef61bd7f86645167378;p=thirdparty%2Fsamba.git ctdb-common: Simplify async computation for sock_socket_write_send/recv This is now just a wrapper around comm_write_send/recv. This avoids the extra tevent_req and fixes a bug in the termination of sock_socket_write computation. BUG: https://bugzilla.samba.org/show_bug.cgi?id=12500 Signed-off-by: Amitay Isaacs Reviewed-by: Martin Schwenke --- diff --git a/ctdb/common/sock_daemon.c b/ctdb/common/sock_daemon.c index dc5dba0b429..ca4086dd90d 100644 --- a/ctdb/common/sock_daemon.c +++ b/ctdb/common/sock_daemon.c @@ -420,77 +420,33 @@ static bool sock_socket_start_recv(struct tevent_req *req, int *perr) * Send message to a client */ -struct sock_socket_write_state { - int status; -}; - -static void sock_socket_write_done(struct tevent_req *subreq); - struct tevent_req *sock_socket_write_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev, struct sock_client_context *client_ctx, uint8_t *buf, size_t buflen) { - struct tevent_req *req, *subreq; - struct sock_socket_write_state *state; - - req = tevent_req_create(mem_ctx, &state, - struct sock_socket_write_state); - if (req == NULL) { - return NULL; - } + struct tevent_req *req; - subreq = comm_write_send(state, ev, client_ctx->comm, buf, buflen); - if (tevent_req_nomem(subreq, req)) { - return tevent_req_post(req, ev); - } - tevent_req_set_callback(subreq, sock_socket_write_done, req); + req = comm_write_send(mem_ctx, ev, client_ctx->comm, buf, buflen); return req; } -static void sock_socket_write_done(struct tevent_req *subreq) +bool sock_socket_write_recv(struct tevent_req *req, int *perr) { - struct tevent_req *req = tevent_req_callback_data( - subreq, struct tevent_req); - struct sock_socket_write_state *state = tevent_req_data( - req, struct sock_socket_write_state); int ret; bool status; - status = comm_write_recv(subreq, &ret); - TALLOC_FREE(subreq); + status = comm_write_recv(req, &ret); if (! status) { - state->status = ret; - return; - } -} - -bool sock_socket_write_recv(struct tevent_req *req, int *perr) -{ - struct sock_socket_write_state *state = tevent_req_data( - req, struct sock_socket_write_state); - int ret; - - if (tevent_req_is_unix_error(req, &ret)) { if (perr != NULL) { *perr = ret; } - return false; } - if (state->status != 0) { - if (perr != NULL) { - *perr = state->status; - } - return false; - } - - if (perr != NULL) { - *perr = 0; - } - return true; + return status; } + /* * Socket daemon */