From 92b04cda208baf628d9d166b3b330e35a6512b0c Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期二, 13 十二月 2022 17:09:47 +0800
Subject: [PATCH] robust

---
 cbhomeclient.cpp |   60 +++++++++++++++++++++++++++++-------------------------------
 1 files changed, 29 insertions(+), 31 deletions(-)

diff --git a/cbhomeclient.cpp b/cbhomeclient.cpp
index 4de08e7..e4c80aa 100644
--- a/cbhomeclient.cpp
+++ b/cbhomeclient.cpp
@@ -116,7 +116,7 @@
 }
 
 template <class F>
-MsgCR to_topic(client* cli, F&& f, const struct cstrarr topic){
+MsgCR to_topic(client* cli, F&& f, const struct cstrarr& topic){
     MsgCR msg(dummy());
     if (topic.arr && topic.count){
         MsgTopicList tlist;
@@ -165,42 +165,40 @@
     }
 }
 
-static void registered(client* cli, const creg* rinfo, const bool must_reg=true){
+static void registered(client* cli, const creg* rinfo){
 
-    if (must_reg){
-        ProcInfo pinfo;
-        auto tmp = rinfo->pinfo;
-        pinfo.set_name(tmp->name.str, tmp->name.size);
-        pinfo.set_proc_id(tmp->id.str, tmp->id.size);
-        const auto& reg = pinfo.SerializeAsString();
-
-        while (!cli->thrd_quit.load(memory_order_acquire)) {
-            void* replymsg = NULL;
-            int replysize = 0;
-            cli->bus = bus_register(reg.data(), reg.size(), &replymsg, &replysize, sndto);
-            bus_free(replymsg, replysize);
-            if (cli->bus) break;
-        }
-
-        // register success start read request thread
-        cli->thrd_readreq.reset(new thread([cli]{ thread_readreq(cli); }));
+    ProcInfo pinfo;
+    auto tmp = rinfo->pinfo;
+    pinfo.set_name(tmp->name.str, tmp->name.size);
+    pinfo.set_proc_id(tmp->id.str, tmp->id.size);
+    const auto& reg = pinfo.SerializeAsString();
+    while (!cli->thrd_quit.load(memory_order_acquire)) {
+        void* replymsg = NULL;
+        int replysize = 0;
+        cli->bus = bus_register(reg.data(), reg.size(), &replymsg, &replysize, sndto);
+        bus_free(replymsg, replysize);
+        if (cli->bus) break;
     }
+    // register success start read request thread
+    cli->thrd_readreq.reset(new thread([cli]{ thread_readreq(cli); }));
 
     // request/reply鍜宲ub topic涓�璧峰鐞�
-    auto tmparr = cstr_arr_new(rinfo->channel.count + rinfo->topic_pub.count);
-    auto addarr = [&tmparr](size_t& start, const struct cstrarr* arr){
-        for(size_t i = 0; i < arr->count; i++){
-            cstr_arr_add(&tmparr, arr->arr[i].str, arr->arr[i].size, start+i);
-        }
-        start += arr->count;
+    // 鍙渶瑕佸皢瀛楃涓叉寚閽堟嫹璐濆氨琛岋紝涓嶉渶鍒涘缓瀛楃涓插唴瀛�
+    auto shallowMerge = [](const cstrarr& arr1, const cstrarr& arr2){
+        auto tmp = cstr_arr_new(arr1.count + arr2.count);
+        auto dst = tmp.arr;
+        auto cp2dst = [&dst](const cstr* src, const size_t cnt){
+            memcpy(dst, src, cnt * sizeof(cstr));
+            dst += cnt;
+        };
+        cp2dst(arr1.arr, arr1.count);
+        cp2dst(arr2.arr, arr2.count);
+        return tmp;
     };
-    size_t s = 0;
-    addarr(s, &rinfo->channel);
-    addarr(s, &rinfo->topic_pub);
+    auto tmparr = shallowMerge(rinfo->channel, rinfo->topic_pub);
     auto tpcmsg = to_topic(cli, bus_register_topics, tmparr);
-    cstr_arr_free(tmparr);
-    // auto channelmsg = to_topic(cli, bus_register_topics, rinfo->channel);
-    // auto pubmsg = to_topic(cli, bus_register_topics, rinfo->topic_pub);
+    free(tmparr.arr);
+
     // if topic pub/sub[net] exist, register topics
     auto submsg = to_topic(cli, bus_subscribe_topics, rinfo->topic_sub);
     auto subnetmsg = to_topic(cli, bus_subscribe_topics_net, rinfo->topic_sub_net);

--
Gitblit v1.8.0