diff --git a/src/ssb.c b/src/ssb.c index 1178a792..c29489f4 100644 --- a/src/ssb.c +++ b/src/ssb.c @@ -145,19 +145,28 @@ typedef struct _tf_ssb_t { uint8_t pub[crypto_sign_PUBLICKEYBYTES]; uint8_t priv[crypto_sign_SECRETKEYBYTES]; - int connections_changed_count; - tf_ssb_connection_t* connections; + int connections_count; tf_ssb_connections_t* connections_tracker; tf_ssb_broadcast_t* broadcasts; + int broadcasts_count; tf_ssb_rpc_callback_node_t* rpc; + int rpc_count; + tf_ssb_connections_changed_callback_node_t* connections_changed; + int connections_changed_count; + tf_ssb_message_added_callback_node_t* message_added; + int message_added_count; + tf_ssb_blob_want_added_callback_node_t* blob_want_added; + int blob_want_added_count; + tf_ssb_broadcasts_changed_callback_node_t* broadcasts_changed; + int broadcasts_changed_count; } tf_ssb_t; typedef struct _tf_ssb_connection_t { @@ -1201,6 +1210,7 @@ static void _tf_ssb_connection_on_close(uv_handle_t* handle) { *it = connection->next; connection->next = NULL; + ssb->connections_count--; break; } } @@ -1484,29 +1494,6 @@ static bool _tf_ssb_save_keys(tf_ssb_t* ssb) static void _tf_ssb_trace_timer(uv_timer_t* timer) { tf_ssb_t* ssb = timer->data; - int connections = 0; - int broadcasts = 0; - int rpc = 0; - int connections_changed = 0; - int message_added = 0; - int blob_want_added = 0; - int broadcasts_changed = 0; - -#define COUNT(type, name) \ - for (type* it = ssb->name; it; it = it->next) \ - { \ - name++; \ - } - - COUNT(tf_ssb_connection_t, connections); - COUNT(tf_ssb_broadcast_t, broadcasts); - COUNT(tf_ssb_rpc_callback_node_t, rpc); - COUNT(tf_ssb_connections_changed_callback_node_t, connections_changed); - COUNT(tf_ssb_message_added_callback_node_t, message_added); - COUNT(tf_ssb_blob_want_added_callback_node_t, blob_want_added); - COUNT(tf_ssb_broadcasts_changed_callback_node_t, broadcasts_changed); - -#undef COUNT const char* names[] = { @@ -1520,13 +1507,13 @@ static void _tf_ssb_trace_timer(uv_timer_t* timer) }; int64_t values[] = { - connections, - broadcasts, - rpc, - connections_changed, - message_added, - blob_want_added, - broadcasts_changed, + ssb->connections_count, + ssb->broadcasts_count, + ssb->rpc_count, + ssb->connections_changed_count, + ssb->message_added_count, + ssb->blob_want_added_count, + ssb->broadcasts_changed_count, }; tf_trace_counter(ssb->trace, "lists", _countof(values), names, values); @@ -1692,6 +1679,7 @@ void tf_ssb_destroy(tf_ssb_t* ssb) { tf_ssb_rpc_callback_node_t* node = ssb->rpc; ssb->rpc = node->next; + ssb->rpc_count--; if (node->cleanup) { node->cleanup(ssb, node->user_data); @@ -1703,6 +1691,7 @@ void tf_ssb_destroy(tf_ssb_t* ssb) { tf_ssb_connections_changed_callback_node_t* node = ssb->connections_changed; ssb->connections_changed = node->next; + ssb->connections_changed_count--; if (node->cleanup) { node->cleanup(ssb, node->user_data); @@ -1713,6 +1702,7 @@ void tf_ssb_destroy(tf_ssb_t* ssb) { tf_ssb_message_added_callback_node_t* node = ssb->message_added; ssb->message_added = node->next; + ssb->message_added_count--; if (node->cleanup) { node->cleanup(ssb, node->user_data); @@ -1723,6 +1713,7 @@ void tf_ssb_destroy(tf_ssb_t* ssb) { tf_ssb_blob_want_added_callback_node_t* node = ssb->blob_want_added; ssb->blob_want_added = node->next; + ssb->blob_want_added_count--; if (node->cleanup) { node->cleanup(ssb, node->user_data); @@ -1733,6 +1724,7 @@ void tf_ssb_destroy(tf_ssb_t* ssb) { tf_ssb_broadcasts_changed_callback_node_t* node = ssb->broadcasts_changed; ssb->broadcasts_changed = node->next; + ssb->broadcasts_changed_count--; if (node->cleanup) { node->cleanup(ssb, node->user_data); @@ -1752,6 +1744,7 @@ void tf_ssb_destroy(tf_ssb_t* ssb) { tf_ssb_broadcast_t* broadcast = ssb->broadcasts; ssb->broadcasts = broadcast->next; + ssb->broadcasts_count--; free(broadcast); } free(ssb); @@ -1835,6 +1828,7 @@ tf_ssb_connection_t* tf_ssb_connection_create(tf_ssb_t* ssb, const char* host, c connection->next = ssb->connections; ssb->connections = connection; + ssb->connections_count++; _tf_ssb_notify_connections_changed(ssb, k_tf_ssb_change_create, connection); return connection; } @@ -1930,6 +1924,7 @@ static void _tf_ssb_on_connection(uv_stream_t* stream, int status) connection->next = ssb->connections; ssb->connections = connection; + ssb->connections_count++; _tf_ssb_notify_connections_changed(ssb, k_tf_ssb_change_create, connection); connection->state = k_tf_ssb_state_server_wait_hello; @@ -2133,6 +2128,7 @@ static void _tf_ssb_add_broadcast(tf_ssb_t* ssb, const tf_ssb_broadcast_t* broad node->ctime = time(NULL); node->mtime = node->ctime; ssb->broadcasts = node; + ssb->broadcasts_count++; _tf_ssb_notify_broadcasts_changed(ssb); } @@ -2269,6 +2265,7 @@ void tf_ssb_add_broadcasts_changed_callback(tf_ssb_t* ssb, tf_ssb_broadcasts_cha .next = ssb->broadcasts_changed, }; ssb->broadcasts_changed = node; + ssb->broadcasts_changed_count++; } void tf_ssb_remove_broadcasts_changed_callback(tf_ssb_t* ssb, tf_ssb_broadcasts_changed_callback_t* callback, void* user_data) @@ -2281,6 +2278,7 @@ void tf_ssb_remove_broadcasts_changed_callback(tf_ssb_t* ssb, tf_ssb_broadcasts_ { tf_ssb_broadcasts_changed_callback_node_t* node = *it; *it = node->next; + ssb->broadcasts_changed_count--; if (node->cleanup) { node->cleanup(ssb, node->user_data); @@ -2305,6 +2303,7 @@ void tf_ssb_add_connections_changed_callback(tf_ssb_t* ssb, tf_ssb_connections_c .next = ssb->connections_changed, }; ssb->connections_changed = node; + ssb->connections_changed_count++; } void tf_ssb_remove_connections_changed_callback(tf_ssb_t* ssb, tf_ssb_connections_changed_callback_t* callback, void* user_data) @@ -2317,6 +2316,7 @@ void tf_ssb_remove_connections_changed_callback(tf_ssb_t* ssb, tf_ssb_connection { tf_ssb_connections_changed_callback_node_t* node = *it; *it = node->next; + ssb->connections_changed_count--; if (node->cleanup) { node->cleanup(ssb, node->user_data); @@ -2358,6 +2358,7 @@ void tf_ssb_add_rpc_callback(tf_ssb_t* ssb, const char** name, tf_ssb_rpc_callba } node->name[name_count] = NULL; ssb->rpc = node; + ssb->rpc_count++; } JSContext* tf_ssb_connection_get_context(tf_ssb_connection_t* connection) @@ -2396,6 +2397,7 @@ void tf_ssb_add_message_added_callback(tf_ssb_t* ssb, void (*callback)(tf_ssb_t* .next = ssb->message_added, }; ssb->message_added = node; + ssb->message_added_count++; } void tf_ssb_remove_message_added_callback(tf_ssb_t* ssb, tf_ssb_message_added_callback_t* callback, void* user_data) @@ -2408,6 +2410,7 @@ void tf_ssb_remove_message_added_callback(tf_ssb_t* ssb, tf_ssb_message_added_ca { tf_ssb_message_added_callback_node_t* node = *it; *it = node->next; + ssb->message_added_count--; if (node->cleanup) { node->cleanup(ssb, node->user_data); @@ -2442,6 +2445,7 @@ void tf_ssb_add_blob_want_added_callback(tf_ssb_t* ssb, void (*callback)(tf_ssb_ .next = ssb->blob_want_added, }; ssb->blob_want_added = node; + ssb->blob_want_added_count++; } void tf_ssb_remove_blob_want_added_callback(tf_ssb_t* ssb, tf_ssb_blob_want_added_callback_t* callback, void* user_data) @@ -2454,6 +2458,7 @@ void tf_ssb_remove_blob_want_added_callback(tf_ssb_t* ssb, tf_ssb_blob_want_adde { tf_ssb_blob_want_added_callback_node_t* node = *it; *it = node->next; + ssb->blob_want_added_count--; if (node->cleanup) { node->cleanup(ssb, node->user_data);