[Feature][T8TSK-189] fix multi init in one process

Change-Id: If816876232ffa83260e5706173dcd6bfa30ffd4c
diff --git a/src/lynq/lib/liblynq-shm/lynq_urc_socket.cpp b/src/lynq/lib/liblynq-shm/lynq_urc_socket.cpp
index 2ebf85f..acc7459 100755
--- a/src/lynq/lib/liblynq-shm/lynq_urc_socket.cpp
+++ b/src/lynq/lib/liblynq-shm/lynq_urc_socket.cpp
@@ -12,14 +12,15 @@
 #include "lynq_urc_socket.h"

 #include "log/log.h"

 #include <list>

+#include <map>

 

 static int lynq_urc_socket_fd = 0;

-static int registered_urc_socket_port = 0;

-static int registered_urc_socket_fd = 0;

 

 static pthread_mutex_t s_urc_broadcast_mtx = PTHREAD_MUTEX_INITIALIZER;

 static std::list<struct sockaddr*> s_urc_broadcast_clients;

 

+static std::map<int ,int> s_socket_port_map;

+

 static pthread_mutex_t s_urc_register_mtx = PTHREAD_MUTEX_INITIALIZER;

 

 #define LYNQ_URC_SERVER_LISTEN_PORT 8086

@@ -95,6 +96,8 @@
     int ret = 0;

     int len_s;

     struct sockaddr_in addr_serv;

+    int registered_urc_socket_fd = -1;

+    int registered_urc_socket_port = -1;

     //Creating a Socket object

     pthread_mutex_lock(&s_urc_register_mtx);

     registered_urc_socket_fd=socket(AF_INET,SOCK_DGRAM,0);

@@ -128,32 +131,57 @@
     len_s = sendto(registered_urc_socket_fd, &registered_urc_socket_port, sizeof(registered_urc_socket_port), 0, (struct sockaddr *)&addr_serv,sizeof(addr_serv));

     printf("send result %d %d\n", len_s, errno);

 register_socket_exit:

+    s_socket_port_map.insert(registered_urc_socket_fd, registered_urc_socket_port);

     pthread_mutex_unlock(&s_urc_register_mtx);

     printf("init result %d\n", ret);

     return ret ==0 ? registered_urc_socket_fd : -1;

 }

 

-int lynq_recv_urc_msg(void * buffer, int size)

+int lynq_unregister_urc_socket(int fd)

+{

+    pthread_mutex_lock(&s_urc_register_mtx);

+    auto it = s_socket_port_map.find(fd);

+    if (it != s_socket_port_map.end())

+    {

+        s_socket_port_map.erase(it);

+    }

+    pthread_mutex_unlock(&s_urc_register_mtx);

+    close(fd);

+    return 0;

+}

+

+int lynq_recv_urc_msg(int fd, void * buffer, int size)

 {

     int ret = 0;

     struct sockaddr_in addr_serv;

     socklen_t len_addr_serv = sizeof(addr_serv);

+    int registered_urc_socket_port = -1;

     memset(&addr_serv, 0, sizeof(addr_serv));

-    printf("client %ul to recv now\n", pthread_self());

-    pthread_mutex_lock(&s_urc_register_mtx);

-    if (registered_urc_socket_fd <= 0) {

-        pthread_mutex_unlock(&s_urc_register_mtx);

+    if (fd <= 0) {

         return -1;

     }

+    printf("client %ul to recv now\n", pthread_self());

+    pthread_mutex_lock(&s_urc_register_mtx);

+    auto it = s_socket_port_map.find(fd);

+    if (it != s_socket_port_map.end())

+    {

+        registered_urc_socket_port = it->second;

+    }

+    pthread_mutex_unlock(&s_urc_register_mtx);

+    if (registered_urc_socket_port == -1)

+    {

+        return -1;

+    }

+

     while(1)

     {

         memset(buffer, 0, 4);

-        ret = recvfrom(registered_urc_socket_fd, buffer, size,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);

+        ret = recvfrom(fd, buffer, size,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);

         if (ret > 0 && LYNQ_URC_SERVER_LISTEN_PORT == ntohs(addr_serv.sin_port))

         {

-            if (ret == 4 && LYNQ_URC_SERVER_LISTEN_PORT == *((int*)buffer))

+            if (ret == 4 && LYNQ_URC_SERVER_LISTEN_PORT == *((int*)buffer) && registered_urc_socket_port != -1)

             {

-                sendto(registered_urc_socket_fd, &registered_urc_socket_port, sizeof(registered_urc_socket_port), 0, (struct sockaddr *)&addr_serv,sizeof(addr_serv));

+                sendto(fd, &registered_urc_socket_port, sizeof(registered_urc_socket_port), 0, (struct sockaddr *)&addr_serv,sizeof(addr_serv));

                 printf("to send ack of headbeat\n");

                 continue;

             }

@@ -165,7 +193,6 @@
         }

         break;

     }

-    pthread_mutex_unlock(&s_urc_register_mtx);

     printf("client %ul recv %d\n", pthread_self(), ret);

     return ret;

 }