@ -433,12 +433,11 @@ static void cs_join_timeout_cb(void* arg) {
/* ── helper: find active ETCP_CONN for node ── */
/* ── helper: find active ETCP_CONN for node ── */
struct CHAT_CONN_ENTRY { uint64_t node_id ; struct ETCP_CONN * conn ; } ;
static struct ETCP_CONN * cs_find_conn_for_node ( struct UTUN_INSTANCE * inst , uint64_t node_id ) {
static struct ETCP_CONN * cs_find_conn_for_node ( struct UTUN_INSTANCE * inst , uint64_t node_id ) {
struct ETCP_CONN * c = inst - > connections ;
struct ll_entry * e = queue_find_data_by_index ( inst - > chat_connections , ( const uint8_t * ) & node_id ) ;
while ( c ) {
if ( e ) { struct CHAT_CONN_ENTRY * ce = ( struct CHAT_CONN_ENTRY * ) e - > data ; if ( ce - > conn - > initialized & & ce - > conn - > links_up ) return ce - > conn ; }
if ( c - > peer_node_id = = node_id & & c - > initialized & & c - > links_up ) return c ;
c = c - > next ;
}
return NULL ;
return NULL ;
}
}
@ -510,6 +509,10 @@ static void cs_on_conn_down(struct ETCP_CONN* conn, void* arg) {
( void ) arg ;
( void ) arg ;
if ( ! conn | | ! g_cs ) return ;
if ( ! conn | | ! g_cs ) return ;
uint64_t peer = conn - > peer_node_id ;
uint64_t peer = conn - > peer_node_id ;
if ( g_cs - > inst - > chat_connections ) {
struct ll_entry * e = queue_find_data_by_index ( g_cs - > inst - > chat_connections , ( const uint8_t * ) & peer ) ;
if ( e ) { queue_remove_data ( g_cs - > inst - > chat_connections , e ) ; queue_entry_free ( e ) ; }
}
uint16_t rtt = conn - > rtt_avg_100 ;
uint16_t rtt = conn - > rtt_avg_100 ;
if ( rtt > 0 & & peer ! = 0 & & g_cs - > inst - > topo_groups & & g_cs - > inst - > topo_groups - > topo_sqlite_db ) {
if ( rtt > 0 & & peer ! = 0 & & g_cs - > inst - > topo_groups & & g_cs - > inst - > topo_groups - > topo_sqlite_db ) {
sqlite3 * db = g_cs - > inst - > topo_groups - > topo_sqlite_db ;
sqlite3 * db = g_cs - > inst - > topo_groups - > topo_sqlite_db ;
@ -614,6 +617,8 @@ int chat_sync_init(struct UTUN_INSTANCE* inst,
etcp_bind ( inst , ETCP_RT_ID_CHAT_SYNC , chat_sync_recv_cb ) ;
etcp_bind ( inst , ETCP_RT_ID_CHAT_SYNC , chat_sync_recv_cb ) ;
etcp_add_new_conn_cbk ( inst , cs_on_new_conn , NULL ) ;
etcp_add_new_conn_cbk ( inst , cs_on_new_conn , NULL ) ;
inst - > chat_connections = queue_new ( inst - > ua , 16 , 0 , 8 , " chat_conns " ) ;
struct ETCP_CONN * c = inst - > connections ;
struct ETCP_CONN * c = inst - > connections ;
while ( c ) {
while ( c ) {
etcp_conn_add_up_cbk ( c , cs_on_conn_up , NULL ) ;
etcp_conn_add_up_cbk ( c , cs_on_conn_up , NULL ) ;
@ -641,6 +646,8 @@ void chat_sync_destroy(struct UTUN_INSTANCE* inst) {
member_sync_destroy ( inst ) ;
member_sync_destroy ( inst ) ;
cs - > initialized = 0 ; g_cs = NULL ;
cs - > initialized = 0 ; g_cs = NULL ;
queue_free ( inst - > chat_connections ) ; inst - > chat_connections = NULL ;
etcp_unbind ( inst , ETCP_RT_ID_CHAT_SYNC ) ;
etcp_unbind ( inst , ETCP_RT_ID_CHAT_SYNC ) ;
if ( cs - > refresh_timer ) { uasync_cancel_timeout ( inst - > ua , cs - > refresh_timer ) ; cs - > refresh_timer = NULL ; }
if ( cs - > refresh_timer ) { uasync_cancel_timeout ( inst - > ua , cs - > refresh_timer ) ; cs - > refresh_timer = NULL ; }
cs_cancel_proto_timers ( cs ) ;
cs_cancel_proto_timers ( cs ) ;