Explorar o código

dmq: More efficient peer storage

Allocate only 1 hunk of memory for the entire peer's storage needs.
Alex Hermann %!s(int64=11) %!d(string=hai) anos
pai
achega
4abbae4bc5
Modificáronse 1 ficheiros con 6 adicións e 23 borrados
  1. 6 23
      modules/dmq/peer.c

+ 6 - 23
modules/dmq/peer.c

@@ -48,13 +48,10 @@ dmq_peer_list_t* init_peer_list()
 dmq_peer_t* search_peer_list(dmq_peer_list_t* peer_list, dmq_peer_t* peer)
 {
 	dmq_peer_t* crt;
-	int len;
+
 	crt = peer_list->peers;
 	while(crt) {
-		/* len - the minimum length of the two strings */
-		len = (crt->peer_id.len < peer->peer_id.len)
-			? crt->peer_id.len:peer->peer_id.len;
-		if(strncasecmp(crt->peer_id.s, peer->peer_id.s, len) == 0) {
+		if (STR_EQ(crt->peer_id, peer->peer_id)) {
 			return crt;
 		}
 		crt = crt->next;
@@ -68,8 +65,8 @@ dmq_peer_t* search_peer_list(dmq_peer_list_t* peer_list, dmq_peer_t* peer)
 dmq_peer_t* add_peer(dmq_peer_list_t* peer_list, dmq_peer_t* peer)
 {
 	dmq_peer_t* new_peer = NULL;
-	
-	new_peer = shm_malloc(sizeof(dmq_peer_t));
+
+	new_peer = shm_malloc(sizeof(dmq_peer_t) + peer->peer_id.len + peer->description.len);
 	if(new_peer==NULL) {
 		LM_ERR("no more shm\n");
 		return NULL;
@@ -77,25 +74,11 @@ dmq_peer_t* add_peer(dmq_peer_list_t* peer_list, dmq_peer_t* peer)
 	*new_peer = *peer;
 	
 	/* copy the str's */
-	new_peer->peer_id.s = shm_malloc(peer->peer_id.len);
-	if(new_peer->peer_id.s==NULL) {
-		LM_ERR("no more shm\n");
-		shm_free(new_peer);
-		return NULL;
-	}
+	new_peer->peer_id.s = (char*)new_peer + sizeof(dmq_peer_t);
 	memcpy(new_peer->peer_id.s, peer->peer_id.s, peer->peer_id.len);
-	new_peer->peer_id.len = peer->peer_id.len;
 
-	new_peer->description.s = shm_malloc(peer->description.len);
-	if(new_peer->description.s==NULL) {
-		LM_ERR("no more shm\n");
-		shm_free(new_peer->peer_id.s);
-		shm_free(new_peer);
-		return NULL;
-	}
+	new_peer->description.s = new_peer->peer_id.s + new_peer->peer_id.len;
 	memcpy(new_peer->description.s, peer->description.s, peer->description.len);
-	new_peer->description.len = peer->description.len;
-	
 	new_peer->next = peer_list->peers;
 	peer_list->peers = new_peer;
 	return new_peer;