From 8b0a8c644f19e97606dfb06a865f56dbad15f95e Mon Sep 17 00:00:00 2001
From: wangzhengquan <wangzhengquan85@126.com>
Date: 星期一, 21 十二月 2020 14:44:45 +0800
Subject: [PATCH] update

---
 src/socket/shm_mod_socket.c |  312 ---------------------------------------------------
 1 files changed, 5 insertions(+), 307 deletions(-)

diff --git a/src/socket/shm_mod_socket.c b/src/socket/shm_mod_socket.c
index 9563e6b..6685087 100644
--- a/src/socket/shm_mod_socket.c
+++ b/src/socket/shm_mod_socket.c
@@ -1,65 +1,10 @@
 #include "shm_mod_socket.h"
-
+#include "bus_server_socket.h"
 static Logger *logger = LoggerFactory::getLogger();
 
 
-void ShmModSocket::foreach_subscripters(std::function<void(SHMKeySet *, int)>  cb) {
-	SHMTopicSubMap *topic_sub_map = mem_pool_attach<SHMTopicSubMap>(BUS_MAP_KEY);
-	SHMKeySet *subscripter_set;
-	SHMKeySet::iterator set_iter;
-	SHMTopicSubMap::iterator map_iter;
-
-	if(topic_sub_map != NULL) {
-		for (map_iter = topic_sub_map->begin(); map_iter != topic_sub_map->end(); map_iter++) {
-			subscripter_set = map_iter->second;
-			if(subscripter_set != NULL) {
-				for(set_iter = subscripter_set->begin(); set_iter != subscripter_set->end(); set_iter++) {
-					cb(subscripter_set, *set_iter);
-				}
-			}
-		}
-	}
-}
-
-bool ShmModSocket::include_in_keys(int key, int keys[], size_t length) {
-	if(length == 0) {
-		return false;
-	}
-	for(int i = 0; i < length; i++) {
-		if(keys[i] == key) 
-			return true;
-	}
-	return false;
-}
-
-size_t ShmModSocket::remove_subscripters(int keys[], size_t length) {
-	size_t count = 0;
-	int key;
-	for(int i = 0; i < length; i++) {
-		key = keys[i];
-		SHMTopicSubMap *topic_sub_map = mem_pool_attach<SHMTopicSubMap>(BUS_MAP_KEY);
-		SHMKeySet *subscripter_set;
-		SHMKeySet::iterator set_iter;
-		SHMTopicSubMap::iterator map_iter;
-
-		if(topic_sub_map != NULL) {
-			for (map_iter = topic_sub_map->begin(); map_iter != topic_sub_map->end(); map_iter++) {
-				subscripter_set = map_iter->second;
-				if(subscripter_set != NULL && (set_iter = subscripter_set->find(key) ) != subscripter_set->end()) {
-					subscripter_set->erase(set_iter);
-// printf("remove_subscripter %s, %d\n", map_iter->first, key);
-					count++;
-				}
-			}
-		}
-	}
-	return count;
-	
-}
-
-
 size_t ShmModSocket::remove_keys(int keys[], size_t length) {
-	remove_subscripters(keys, length);
+	BusServerSocket::remove_subscripters(keys, length);
 	return shm_socket_remove_keys(keys, length);
 }
 
@@ -67,42 +12,18 @@
 	mod = (socket_mod_t)0;
 	shm_socket = shm_open_socket(SHM_SOCKET_DGRAM);
 	bus_set = new std::set<int>;
-	topic_sub_map = NULL;
 }
 
 ShmModSocket::~ShmModSocket() {
-// printf("ShmModSocket  destory 1\n");
-	SHMKeySet *subscripter_set;
-	SHMTopicSubMap::iterator map_iter;
+  logger->debug("Destory ShmModSocket...\n");
 	struct timespec timeout = {1, 0};
 	if(bus_set != NULL) {
 		for(auto bus_iter = bus_set->begin(); bus_iter != bus_set->end(); bus_iter++) {
-// printf("ShmModSocket  desub_timeout before");
 			desub_timeout(NULL, 0, *bus_iter, &timeout);
-// printf("ShmModSocket  desub_timeout after %d\n", *bus_iter);
 		}
 		delete bus_set;
 	}
 
-// printf("ShmModSocket  destory 2\n");	
-	if(topic_sub_map != NULL) {
-		for (map_iter = topic_sub_map->begin(); map_iter != topic_sub_map->end(); map_iter++) {
-			subscripter_set = map_iter->second;
-// printf("ShmModSocket  destory 2-1\n");	
-			if(subscripter_set != NULL) {
-// printf("ShmModSocket  destory 2-2\n");	
-				subscripter_set->clear();
-// printf("ShmModSocket  destory 2-3\n");	
-				mm_free((void *)subscripter_set);
-// printf("ShmModSocket  destory 2-4\n");	
-			}
-
-		}
-		topic_sub_map->clear();
-		mem_pool_free_by_key(BUS_MAP_KEY);
-	}
-// printf("ShmModSocket  destory 3\n");	
-	// printf("=============close socket\n");
 	shm_close_socket(shm_socket);
 // printf("ShmModSocket  destory 4\n");	
 }
@@ -110,8 +31,6 @@
 int ShmModSocket::bind(int key) {
 	return  shm_socket_bind(shm_socket, key);
 } 
-
-
 
 /**
  * 寮哄埗缁戝畾绔彛鍒皊ocket, 閫傜敤浜庣▼搴忛潪姝e父鍏抽棴鐨勬儏鍐典笅锛岄噸鍚▼搴忕粦瀹氬師鏉ヨ繕娌¢噴鏀剧殑key
@@ -198,20 +117,6 @@
 
 
 
-/**
- * 鍚姩bus
- * 
- * @return 0 鎴愬姛锛� 鍏朵粬鍊� 澶辫触鐨勯敊璇爜
-*/
-int  ShmModSocket::start_bus(){
-	mod = BUS;
-	topic_sub_map =	mem_pool_attach<SHMTopicSubMap>(BUS_MAP_KEY);
- 
-	run_pubsub_proxy();
-	// pthread_t tid;
-	// pthread_create(&tid, NULL, run_accept_sub_request, _socket);
-	return 0;
-}
 
 /**
  * 璁㈤槄鎸囧畾涓婚
@@ -310,7 +215,9 @@
 
 /**
  * @key 鎬荤嚎绔彛
+ * @str "<**pub**>{缁忔祹}"
  */
+ 
 int  ShmModSocket::_pub_(char *topic, int topic_size, void *content, int content_size, int key,  
 	struct timespec *timeout, int flags) {
 	int head_len;
@@ -321,216 +228,7 @@
 	return shm_sendto(shm_socket, buf, head_len+content_size, key, timeout, flags);
 
 }
-/*
- * 澶勭悊璁㈤槄
-*/
-void ShmModSocket::_proxy_sub( char *topic, int key) {
-	SHMKeySet *subscripter_set;
-
-	SHMTopicSubMap::iterator map_iter;
-	SHMKeySet::iterator set_iter;
-//printf("_proxy_sub topic = %s\n", topic);
-	if( (map_iter = topic_sub_map->find(topic) ) != topic_sub_map->end()) {
-		subscripter_set = map_iter->second;
-	} else {
-		void *set_ptr = mm_malloc(sizeof(SHMKeySet));
-		subscripter_set = new(set_ptr) SHMKeySet;
-		topic_sub_map->insert({topic, subscripter_set});
-	}
-	subscripter_set->insert(key);
-}
-
-/*
- * 澶勭悊鍙栨秷璁㈤槄
-*/
-void ShmModSocket::_proxy_desub( char *topic, int key) {
-	SHMKeySet *subscripter_set;
-
-	SHMTopicSubMap::iterator map_iter;
-	// SHMKeySet::iterator set_iter;
-
-	if( (map_iter = topic_sub_map->find(topic) ) != topic_sub_map->end()) {
-		subscripter_set = map_iter->second;
-
-		subscripter_set->erase(key);
-	}
-}
-
-/*
- * 澶勭悊鍙栨秷鎵�鏈夎闃�
-*/
-void ShmModSocket::_proxy_desub_all(int key) {
-	SHMKeySet *subscripter_set;
-
-	SHMTopicSubMap::iterator map_iter;
-	// SHMKeySet::iterator set_iter;
-	for (auto map_iter = topic_sub_map->begin(); map_iter != topic_sub_map->end(); map_iter++) {
-			subscripter_set = map_iter->second;
-			subscripter_set->erase(key);
-	}
-}
-
-/*
- * 澶勭悊鍙戝竷锛屼唬鐞嗚浆鍙�
-*/
-void ShmModSocket::_proxy_pub( char *topic, size_t head_len, void *buf, size_t size, int key) {
-	SHMKeySet *subscripter_set;
-
-	SHMTopicSubMap::iterator map_iter;
-	SHMKeySet::iterator set_iter;
-
-	std::vector<int> subscripter_to_del;
-	std::vector<int>::iterator vector_iter;
-
-	int send_key;
-	struct timespec timeout = {1,0};
-
-	if( (map_iter = topic_sub_map->find(topic) ) != topic_sub_map->end()) {
-		subscripter_set = map_iter->second;
-		for(set_iter = subscripter_set->begin(); set_iter != subscripter_set->end(); set_iter++) {
-			send_key = *set_iter;
- // printf("_proxy_pub send before %d \n", send_key);
-			if (shm_sendto(shm_socket, buf+head_len, size-head_len, send_key, &timeout) == SHM_SOCKET_ECONNFAILED ) {
-				//瀵规柟宸插叧闂殑杩炴帴鏀惧埌寰呭垹闄ら槦鍒楅噷銆傚鏋滅洿鎺ュ垹闄や細璁﹊ter鎸囬拡鍑虹幇閿欎贡
-				subscripter_to_del.push_back(send_key);
-			} else {
-// printf("_proxy_pub send after: %d \n", send_key);
-			}
-
-			
-		}
-
-		// 鍒犻櫎宸插叧闂殑绔�
-		for(vector_iter = subscripter_to_del.begin(); vector_iter != subscripter_to_del.end(); vector_iter++) {
-			if((set_iter = subscripter_set->find(*vector_iter)) != subscripter_set->end()) {
-				subscripter_set->erase(set_iter);
-				logger->debug("remove closed subscripter %d \n", send_key);
-			}
-		}
-		subscripter_to_del.clear();
-
-	}
-}
-
-void * ShmModSocket::run_pubsub_proxy() {
-	// pthread_detach(pthread_self());
-	int size;
-	int key;
-	char * action, *topic, *topics, *buf;
-	size_t head_len;
-
-	const char *topic_delim = ",";
-// printf("run_pubsub_proxy server receive before\n");
-	while(shm_recvfrom(shm_socket, (void **)&buf, &size, &key) == 0) {
-//printf("run_pubsub_proxy server recv after: %s \n", buf);
-		if(parse_pubsub_topic(buf, size, &action, &topics, &head_len)) {
-// printf("run_pubsub_proxy  %s %s \n", action, topics);
-			if(strcmp(action, "sub") == 0) {
-				// 璁㈤槄鏀寔澶氫富棰樿闃�
-				topic = strtok(topics, topic_delim);
-//printf("run_pubsub_proxy topic = %s\n", topic);
-			  while(topic) {
-	       _proxy_sub(trim(topic, 0), key);
-	        topic =  strtok(NULL, topic_delim);
-			  }
-
-			} else if(strcmp(action, "desub") == 0) {
-// printf("desub topic=%s,%s,%d\n", topics, trim(topics, 0), strcmp(trim(topics, 0), ""));
-				if(strcmp(trim(topics, 0), "") == 0) {
-					// 鍙栨秷鎵�鏈夎闃�
-					_proxy_desub_all(key);
-				} else {
-				 
-					topic = strtok(topics, topic_delim);
-				  while(topic) {
-		       _proxy_desub(trim(topic, 0), key);
-		        topic =  strtok(NULL, topic_delim);
-				  }
-				}
-				
-				
-
-			} else if(strcmp(action, "pub") == 0) {
-				_proxy_pub(topics, head_len, buf, size, key);
-			}  
-			
-			free(action);
-			free(topics);
-		} else {
-			logger->error( "ShmModSocket::run_pubsub_proxy : incorrect format msg");
-		}
-		free(buf);
-	}
-	return NULL;
-}
 
 
-/**
- * @str "<**sub**>{缁忔祹}"
- */
-
-int ShmModSocket::parse_pubsub_topic(char *str, size_t size, char **_action, char **_topic, size_t *head_len ) {
- char *ptr = str;
- char *str_end_ptr = str + size;
- char *action_start_ptr;
- char *action_end_ptr;
- size_t action_len = 0;
-
- char *topic_start_ptr;
- char *topic_end_ptr;
- size_t topic_len = 0;
-
- // if (strlen(identifier) > strlen(str)) {
- //  return 0;
- // }
-
- if (strncmp(ptr, ACTION_LIDENTIFIER, strlen(ACTION_LIDENTIFIER)) == 0) {
-  ptr += strlen(ACTION_LIDENTIFIER);
-  action_start_ptr = ptr;
-  while(strncmp(++ptr, ACTION_RIDENTIFIER, strlen(ACTION_RIDENTIFIER)) != 0) {
-    if(ptr >= str_end_ptr) {
-      return 0;
-    }
-  }
-// printf("%s\n", ptr);
-  action_end_ptr = ptr;
-  action_len = action_end_ptr - action_start_ptr;
-  ptr += strlen(ACTION_RIDENTIFIER);
-// printf("%s\n", ptr);
-// printf("%s\n", str_end_ptr-1);
-  if(strncmp(ptr, TOPIC_LIDENTIFIER, strlen(TOPIC_LIDENTIFIER)) == 0 ) {
-    topic_start_ptr = ptr+strlen(TOPIC_LIDENTIFIER);
-   
-
-    while(strncmp(++ptr, TOPIC_RIDENTIFIER, strlen(TOPIC_RIDENTIFIER)) != 0) {
-      if(ptr >= str_end_ptr) {
-        return 0;
-      }
-    }
-    topic_end_ptr = ptr;
-    topic_len = topic_end_ptr - topic_start_ptr;
-    
-    ptr += strlen(TOPIC_RIDENTIFIER);
-   
-  } else {
-    return 0;
-  }
- } else {
-  return 0;
- }
-
- char *topic = (char *)malloc(topic_len+1);
- strncpy(topic, topic_start_ptr, topic_len);
- *(topic+topic_len) = '\0';
- *_topic = topic;
-
- char *action = (char *)malloc(action_len+1);
- strncpy(action, action_start_ptr, action_len);
- *(action+action_len) = '\0';
- *_action = action;
- *head_len = ptr-str;
-
- return 1;
-}
 
  

--
Gitblit v1.8.0