Diff between 5dd7f0f57d9009b679e19cd29d11e5b4fc0fef7c and 7c55c44049eeb51ca10a5cd7062d5bc4887f994f

Changed Files

File Additions Deletions Status
src/shared/mgmt.c +57 -22 modified
src/shared/mgmt.h +4 -0 modified

Full Patch

diff --git a/src/shared/mgmt.c b/src/shared/mgmt.c
index e576990..8d4e038 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 49c8c99..b57eefc 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,