ctdb-common: Simplify async computation for sock_socket_write_send/recv
authorAmitay Isaacs <amitay@gmail.com>
Wed, 4 Jan 2017 05:20:17 +0000 (16:20 +1100)
committerMartin Schwenke <martins@samba.org>
Fri, 6 Jan 2017 07:37:28 +0000 (08:37 +0100)
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 <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
ctdb/common/sock_daemon.c

index dc5dba0b429779634f772018be4e2ee8304c69cc..ca4086dd90dc5767e35938a0d409dcc92630de98 100644 (file)
@@ -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
  */