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.
pull/211/merge
Roger A. Light 11 years ago
parent 1e64bb171a
commit db3c016fdd

@ -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
};

@ -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);
}

@ -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; i<db->bridge_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;
}

@ -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;

@ -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; i<db->bridge_count; i++){
if(!db->bridges[i]) continue;
context = db->bridges[i];
if(context->sock == INVALID_SOCKET){
if(time_count > 0){
time_count--;

@ -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<int_db.bridge_count; i++){
if(int_db.bridges[i]){
mqtt3_context_cleanup(&int_db, int_db.bridges[i], true);
}
}
if(int_db.bridges){
_mosquitto_free(int_db.bridges);
}
#endif
mosquitto__free_disused_contexts(&int_db);

@ -224,10 +224,15 @@ struct mosquitto_db{
struct mosquitto *contexts_by_id;
struct mosquitto *contexts_by_sock;
struct mosquitto *contexts_for_free;
struct mosquitto *contexts_bridge;
#ifdef WITH_BRIDGE
struct mosquitto **bridges;
#endif
struct _clientid_index_hash *clientid_index_hash;
struct mosquitto_msg_store *msg_store;
struct mosquitto_msg_store_load *msg_store_load;
#ifdef WITH_BRIDGE
int bridge_count;
#endif
int msg_store_count;
struct mqtt3_config *config;
int persistence_changes;

Loading…
Cancel
Save