diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index 29a16d42cc8ca07834c2cca782c8a3aad8df4646..fa5d5b1a7118ad69ebb8054ed21e4d2203cc9c06 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -245,7 +245,7 @@ void dap_chain_cs_dag_delete(dap_chain_t * a_chain) DAP_DELETE(l_dag->_pvt); } -int dap_chain_add_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a_ledger, dap_chain_cs_dag_event_item_t * a_event_item){ +static int s_dap_chain_add_atom_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a_ledger, dap_chain_cs_dag_event_item_t * a_event_item){ dap_chain_datum_t *l_datum = (dap_chain_datum_t*) dap_chain_cs_dag_event_get_datum(a_event_item->event); switch (l_datum->header.type_id) { @@ -280,6 +280,18 @@ int dap_chain_add_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a_ledger, return 0; } +static int s_dap_chain_add_atom_to_events_table(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a_ledger, dap_chain_cs_dag_event_item_t * a_event_item ){ + HASH_ADD(hh, PVT(a_dag)->events,hash,sizeof (a_event_item->hash), a_event_item); + s_dag_events_lasts_process_new_last_event(a_dag, a_event_item); + + int res = a_dag->callback_cs_verify(a_dag,a_event_item->event); + + if(res == 0) + res = s_dap_chain_add_atom_to_ledger(a_dag, a_ledger, a_event_item); + + return res; +} + /** * @brief s_chain_callback_atom_add Accept new event in dag * @param a_chain DAG object @@ -319,37 +331,18 @@ static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t DAP_DELETE(l_hash_str); return -3; } - HASH_ADD(hh, l_events,hash,sizeof (l_event_item->hash), l_event_item); - // save l_events to dag_pvt - if(l_add_to_threshold) - PVT(l_dag)->events_treshold = l_events; - else - PVT(l_dag)->events = l_events; - pthread_rwlock_unlock( l_events_rwlock ); - - if(!l_add_to_threshold){ - int ret_cs = l_dag->callback_cs_verify(l_dag,l_event); - if ( ret_cs != 0 ){ - log_it(L_WARNING,"Consensus can't accept the event, verification returned %d",ret_cs); - return -2; - } - pthread_rwlock_wrlock(&PVT(l_dag)->events_rwlock); - int res_ledger = dap_chain_add_to_ledger(l_dag, a_chain->ledger, l_event_item); - if(res_ledger >= 0) - s_dag_events_lasts_process_new_last_event(l_dag, l_event_item); - pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock); - - if(res_ledger < 0) - return res_ledger; + int res = 0; + if(l_add_to_threshold){ + HASH_ADD(hh, PVT(l_dag)->events_treshold,hash,sizeof (l_event_item->hash), l_event_item); + }else{ + res = s_dap_chain_add_atom_to_events_table(l_dag, a_chain->ledger, l_event_item); } - // Now check the treshold if some events now are ready to move to the main table - pthread_rwlock_wrlock(&PVT(l_dag)->events_rwlock); while(dap_chain_cs_dag_proc_treshold(l_dag, a_chain->ledger)); - pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock); + pthread_rwlock_unlock( l_events_rwlock ); - return 0; + return res; } /** @@ -705,9 +698,7 @@ bool dap_chain_cs_dag_proc_treshold(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a HASH_DEL(PVT(a_dag)->events_treshold,l_event_item); if(ret == DAP_THRESHOLD_OK){ - HASH_ADD(hh, PVT(a_dag)->events, hash,sizeof (l_event_item->hash), l_event_item); - int l_ledger_ret = dap_chain_add_to_ledger(a_dag, a_ledger, l_event_item); - s_dag_events_lasts_process_new_last_event(a_dag, l_event_item); + s_dap_chain_add_atom_to_events_table(a_dag, a_ledger, l_event_item); res = true; }else if(ret == DAP_THRESHOLD_CONFLICTING) HASH_ADD(hh, PVT(a_dag)->events_treshold_conflicted, hash,sizeof (l_event_item->hash), l_event_item);