[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, ®istered_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, ®istered_urc_socket_port, sizeof(registered_urc_socket_port), 0, (struct sockaddr *)&addr_serv,sizeof(addr_serv));
+ sendto(fd, ®istered_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;
}