Signed-off-by: luzhixing12345 <luzhixing12...@gmail.com>

>On Sun, Aug 04, 2024 at 10:23:53PM GMT, luzhixing12345 wrote:
>>rewrite with if-else instead of goto
>
>Why?
>
>IMHO was better before this patch with a single error path.

I think this if-else version is more clear for me, and it's good to
keep things the way they are.

>
>>
>>and I have a question, in two incorrent cases
>>
>>- need reply but no reply_requested
>>- no need reply but has reply_requested
>>
>>should we call vu_panic or print warning message?
>>
>>---
>> subprojects/libvhost-user/libvhost-user.c | 39 +++++++++++++----------
>> subprojects/libvhost-user/libvhost-user.h |  6 ++--
>> 2 files changed, 27 insertions(+), 18 deletions(-)
>>
>>diff --git a/subprojects/libvhost-user/libvhost-user.c 
>>b/subprojects/libvhost-user/libvhost-user.c
>>index 9c630c2170..187e25f9bb 100644
>>--- a/subprojects/libvhost-user/libvhost-user.c
>>+++ b/subprojects/libvhost-user/libvhost-user.c
>>@@ -2158,32 +2158,39 @@ vu_dispatch(VuDev *dev)
>> {
>>     VhostUserMsg vmsg = { 0, };
>>     int reply_requested;
>>-    bool need_reply, success = false;
>>+    bool need_reply, success = true;
>>
>>     if (!dev->read_msg(dev, dev->sock, &vmsg)) {
>>-        goto end;
>>+        success = false;
>>+        free(vmsg.data);
>>+        return success;
>>     }
>>
>>     need_reply = vmsg.flags & VHOST_USER_NEED_REPLY_MASK;
>>
>>     reply_requested = vu_process_message(dev, &vmsg);
>>-    if (!reply_requested && need_reply) {
>>-        vmsg_set_reply_u64(&vmsg, 0);
>>-        reply_requested = 1;
>>-    }
>>-
>>-    if (!reply_requested) {
>>-        success = true;
>>-        goto end;
>>-    }
>>
>>-    if (!vu_send_reply(dev, dev->sock, &vmsg)) {
>>-        goto end;
>>+    if (need_reply) {
>>+        if (reply_requested) {
>>+            if (!vu_send_reply(dev, dev->sock, &vmsg)) {
>>+                success = false;
>>+            }
>>+        } else {
>>+            // need reply but no reply requested, return 0(u64)
>>+            vmsg_set_reply_u64(&vmsg, 0);
>>+            if (!vu_send_reply(dev, dev->sock, &vmsg)) {
>>+                success = false;
>>+            }
>>+        }
>>+    } else {
>>+        // no need reply but reply requested, send a reply
>>+        if (reply_requested) {
>>+            if (!vu_send_reply(dev, dev->sock, &vmsg)) {
>>+                success = false;
>>+            }
>>+        }
>>     }
>>
>>-    success = true;
>>-
>>-end:
>>     free(vmsg.data);
>>     return success;
>> }
>>diff --git a/subprojects/libvhost-user/libvhost-user.h 
>>b/subprojects/libvhost-user/libvhost-user.h
>>index deb40e77b3..2daf8578f6 100644
>>--- a/subprojects/libvhost-user/libvhost-user.h
>>+++ b/subprojects/libvhost-user/libvhost-user.h
>>@@ -238,6 +238,8 @@ typedef struct VuDev VuDev;
>>
>> typedef uint64_t (*vu_get_features_cb) (VuDev *dev);
>> typedef void (*vu_set_features_cb) (VuDev *dev, uint64_t features);
>>+typedef uint64_t (*vu_get_protocol_features_cb) (VuDev *dev);
>>+typedef void (*vu_set_protocol_features_cb) (VuDev *dev, uint64_t features);
>
>Are these changes related?
>
>Stefano
>
>> typedef int (*vu_process_msg_cb) (VuDev *dev, VhostUserMsg *vmsg,
>>                                   int *do_reply);
>> typedef bool (*vu_read_msg_cb) (VuDev *dev, int sock, VhostUserMsg *vmsg);
>>@@ -256,9 +258,9 @@ typedef struct VuDevIface {
>>     vu_set_features_cb set_features;
>>     /* get the protocol feature bitmask from the underlying vhost
>>      * implementation */
>>-    vu_get_features_cb get_protocol_features;
>>+    vu_get_protocol_features_cb get_protocol_features;
>>     /* enable protocol features in the underlying vhost implementation. */
>>-    vu_set_features_cb set_protocol_features;
>>+    vu_set_protocol_features_cb set_protocol_features;
>>     /* process_msg is called for each vhost-user message received */
>>     /* skip libvhost-user processing if return value != 0 */
>>     vu_process_msg_cb process_msg;
>>-- 
>>2.34.1
>>

Yes, I'm sorry that I forget to message about it.

Although get/set_protocol_features and get/set_protocol_features actually have 
the same type, I think the return type of function pointers should be explicit 
for user interface APIs. So typedef vu_get_protocol_features_cb and 
vu_set_protocol_features_cb

luzhixing

Reply via email to