From 7c55c44049eeb51ca10a5cd7062d5bc4887f994f Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Mon, 8 Dec 2014 15:17:52 +0200 Subject: [PATCH] shared/mgmt: Add mgmt_send_nowait() API --- src/shared/mgmt.c | 79 ++++++++++++++++++++++++++++++++++------------- src/shared/mgmt.h | 4 +++ 2 files changed, 61 insertions(+), 22 deletions(-) diff --git a/src/shared/mgmt.c b/src/shared/mgmt.c index e57699096..8d4e0385f 100644 --- a/src/shared/mgmt.c +++ b/src/shared/mgmt.c @@ -159,34 +159,15 @@ static void write_watch_destroy(void *user_data) mgmt->writer_active = false; } -static bool can_write_data(struct io *io, void *user_data) +static bool send_request(struct mgmt *mgmt, struct mgmt_request *request) { - struct mgmt *mgmt = user_data; - struct mgmt_request *request; struct iovec iov; ssize_t ret; - bool can_write; - - request = queue_pop_head(mgmt->reply_queue); - if (!request) { - /* only reply commands can jump the queue */ - if (!queue_isempty(mgmt->pending_list)) - return false; - - request = queue_pop_head(mgmt->request_queue); - if (!request) - return false; - - can_write = false; - } else { - /* allow multiple replies to jump the queue */ - can_write = !queue_isempty(mgmt->reply_queue); - } iov.iov_base = request->buf; iov.iov_len = request->len; - ret = io_send(io, &iov, 1); + ret = io_send(mgmt->io, &iov, 1); if (ret < 0) { util_debug(mgmt->debug_callback, mgmt->debug_data, "write failed: %s", strerror(-ret)); @@ -194,7 +175,7 @@ static bool can_write_data(struct io *io, void *user_data) request->callback(MGMT_STATUS_FAILED, 0, NULL, request->user_data); destroy_request(request); - return true; + return false; } util_debug(mgmt->debug_callback, mgmt->debug_data, @@ -206,6 +187,34 @@ static bool can_write_data(struct io *io, void *user_data) queue_push_tail(mgmt->pending_list, request); + return true; +} + +static bool can_write_data(struct io *io, void *user_data) +{ + struct mgmt *mgmt = user_data; + struct mgmt_request *request; + bool can_write; + + request = queue_pop_head(mgmt->reply_queue); + if (!request) { + /* only reply commands can jump the queue */ + if (!queue_isempty(mgmt->pending_list)) + return false; + + request = queue_pop_head(mgmt->request_queue); + if (!request) + return false; + + can_write = false; + } else { + /* allow multiple replies to jump the queue */ + can_write = !queue_isempty(mgmt->reply_queue); + } + + if (!send_request(mgmt, request)) + return true; + return can_write; } @@ -663,6 +672,32 @@ unsigned int mgmt_send(struct mgmt *mgmt, uint16_t opcode, uint16_t index, return request->id; } +unsigned int mgmt_send_nowait(struct mgmt *mgmt, uint16_t opcode, uint16_t index, + uint16_t length, const void *param, + mgmt_request_func_t callback, + void *user_data, mgmt_destroy_func_t destroy) +{ + struct mgmt_request *request; + + if (!mgmt) + return 0; + + request = create_request(opcode, index, length, param, + callback, user_data, destroy); + if (!request) + return 0; + + if (mgmt->next_request_id < 1) + mgmt->next_request_id = 1; + + request->id = mgmt->next_request_id++; + + if (!send_request(mgmt, request)) + return 0; + + return request->id; +} + unsigned int mgmt_reply(struct mgmt *mgmt, uint16_t opcode, uint16_t index, uint16_t length, const void *param, mgmt_request_func_t callback, diff --git a/src/shared/mgmt.h b/src/shared/mgmt.h index 49c8c9981..b57eefc42 100644 --- a/src/shared/mgmt.h +++ b/src/shared/mgmt.h @@ -52,6 +52,10 @@ unsigned int mgmt_send(struct mgmt *mgmt, uint16_t opcode, uint16_t index, uint16_t length, const void *param, mgmt_request_func_t callback, void *user_data, mgmt_destroy_func_t destroy); +unsigned int mgmt_send_nowait(struct mgmt *mgmt, uint16_t opcode, uint16_t index, + uint16_t length, const void *param, + mgmt_request_func_t callback, + void *user_data, mgmt_destroy_func_t destroy); unsigned int mgmt_reply(struct mgmt *mgmt, uint16_t opcode, uint16_t index, uint16_t length, const void *param, mgmt_request_func_t callback, -- 2.47.3