From db3c016fdd14be92ed05384d9b9f3f4162db1e64 Mon Sep 17 00:00:00 2001 From: "Roger A. Light" Date: Tue, 18 Nov 2014 23:34:54 +0000 Subject: [PATCH] Don't use bridge hash in each client. Store a DB wide array of bridges. There shouldn't be many of them, so iterating/searching isn't a problem. Saves 56 bytes in the client struct. --- lib/mosquitto_internal.h | 3 --- src/bridge.c | 10 +++++++++- src/context.c | 11 ++++++----- src/database.c | 3 ++- src/loop.c | 8 ++++++-- src/mosquitto.c | 9 +++++++-- src/mosquitto_broker.h | 7 ++++++- 7 files changed, 36 insertions(+), 15 deletions(-) diff --git a/lib/mosquitto_internal.h b/lib/mosquitto_internal.h index cf85ad1a..b8a22586 100644 --- a/lib/mosquitto_internal.h +++ b/lib/mosquitto_internal.h @@ -251,9 +251,6 @@ struct mosquitto { UT_hash_handle hh_id; UT_hash_handle hh_sock; struct mosquitto *for_free_next; -# ifdef WITH_BRIDGE - UT_hash_handle hh_bridge; -# endif #endif }; diff --git a/src/bridge.c b/src/bridge.c index 6bca39c5..9da398c8 100644 --- a/src/bridge.c +++ b/src/bridge.c @@ -45,6 +45,7 @@ Contributors: int mqtt3_bridge_new(struct mosquitto_db *db, struct _mqtt3_bridge *bridge) { struct mosquitto *new_context = NULL; + struct mosquitto **bridges; char hostname[256]; int len; char *id, *local_id; @@ -120,7 +121,14 @@ int mqtt3_bridge_new(struct mosquitto_db *db, struct _mqtt3_bridge *bridge) bridge->try_private_accepted = true; - HASH_ADD_KEYPTR(hh_bridge, db->contexts_bridge, new_context->bridge->local_clientid, strlen(new_context->bridge->local_clientid), new_context); + bridges = _mosquitto_realloc(db->bridges, (db->bridge_count+1)*sizeof(struct mosquitto *)); + if(bridges){ + db->bridges = bridges; + db->bridge_count++; + db->bridges[db->bridge_count-1] = new_context; + }else{ + return MOSQ_ERR_NOMEM; + } return mqtt3_bridge_connect(db, new_context); } diff --git a/src/context.c b/src/context.c index b654ace4..8443eeab 100644 --- a/src/context.c +++ b/src/context.c @@ -93,7 +93,7 @@ void mqtt3_context_cleanup(struct mosquitto_db *db, struct mosquitto *context, b { struct _mosquitto_packet *packet; struct mosquitto_client_msg *msg, *next; - struct mosquitto *ctx_tmp; + int i; if(!context) return; @@ -107,11 +107,12 @@ void mqtt3_context_cleanup(struct mosquitto_db *db, struct mosquitto *context, b } #ifdef WITH_BRIDGE if(context->bridge){ - if(context->bridge->local_clientid){ - HASH_FIND(hh_bridge, db->contexts_bridge, context->bridge->local_clientid, strlen(context->bridge->local_clientid), ctx_tmp); - if(ctx_tmp){ - HASH_DELETE(hh_bridge, db->contexts_bridge, context); + for(i=0; ibridge_count; i++){ + if(db->bridges[i] == context){ + db->bridges[i] = NULL; } + } + if(context->bridge->local_clientid){ _mosquitto_free(context->bridge->local_clientid); context->bridge->local_clientid = NULL; } diff --git a/src/database.c b/src/database.c index 75f083c5..fe168929 100644 --- a/src/database.c +++ b/src/database.c @@ -42,7 +42,8 @@ int mqtt3_db_open(struct mqtt3_config *config, struct mosquitto_db *db) db->contexts_by_id = NULL; db->contexts_by_sock = NULL; db->contexts_for_free = NULL; - db->contexts_bridge = NULL; + db->bridges = NULL; + db->bridge_count = 0; // Initialize the hashtable db->clientid_index_hash = NULL; diff --git a/src/loop.c b/src/loop.c index 0ce10b5c..c9d2b95b 100644 --- a/src/loop.c +++ b/src/loop.c @@ -105,7 +105,7 @@ int mosquitto_main_loop(struct mosquitto_db *db, int *listensock, int listensock context_count = HASH_CNT(hh_sock, db->contexts_by_sock); #ifdef WITH_BRIDGE - context_count += HASH_CNT(hh_bridge, db->contexts_bridge); + context_count += db->bridge_count; #endif if(listensock_count + context_count > pollfd_count || !pollfds){ @@ -185,7 +185,11 @@ int mosquitto_main_loop(struct mosquitto_db *db, int *listensock, int listensock #ifdef WITH_BRIDGE time_count = 0; - HASH_ITER(hh_bridge, db->contexts_bridge, context, ctxt_tmp){ + for(i=0; ibridge_count; i++){ + if(!db->bridges[i]) continue; + + context = db->bridges[i]; + if(context->sock == INVALID_SOCKET){ if(time_count > 0){ time_count--; diff --git a/src/mosquitto.c b/src/mosquitto.c index 75459d0a..186248c6 100644 --- a/src/mosquitto.c +++ b/src/mosquitto.c @@ -363,8 +363,13 @@ int main(int argc, char *argv[]) mqtt3_context_cleanup(&int_db, ctxt, true); } #ifdef WITH_BRIDGE - HASH_ITER(hh_bridge, int_db.contexts_bridge, ctxt, ctxt_tmp){ - mqtt3_context_cleanup(&int_db, ctxt, true); + for(i=0; i