diff --git a/modules/chain/dap_chain_cell.c b/modules/chain/dap_chain_cell.c index 146a1dc8a09350dd6f2fb8aba0f044331f4c26bc..8412b79e584db73e41f71bb03eb3a902ce7c8cec 100644 --- a/modules/chain/dap_chain_cell.c +++ b/modules/chain/dap_chain_cell.c @@ -494,7 +494,7 @@ int dap_chain_cell_load(dap_chain_t *a_chain, dap_chain_cell_t *a_cell) break; } l_pos += sizeof(uint64_t) + ( l_read = fread((void*)l_element, 1, l_el_size, a_cell->file_storage) ); - a_chain->load_progress = (int)((double)l_pos/l_full_size * 100 + 0.5); + a_chain->load_progress = (int)((float)l_pos/l_full_size * 100 + 0.5); if (l_read != l_el_size) { log_it(L_ERROR, "Read only %lu of %zu bytes, stop cell loading", l_read, l_el_size); DAP_DELETE(l_element); diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index d42f9997a549033e045f6a64bdd54c96a3de5b72..a0265e610a8d9620c9eeda3e32b7649e0a6075c7 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -703,6 +703,28 @@ static dap_chain_net_t *s_net_new(const char *a_net_name, dap_config_t *a_cfg) return l_ret; } +bool s_net_disk_load_notify_callback(UNUSED_ARG void *a_arg) { + json_object *json_obj = json_object_new_object(); + json_object_object_add(json_obj, "class", json_object_new_string("nets_init")); + json_object *l_jobj_nets = json_object_new_object(); + for (dap_chain_net_t *net = s_nets_by_name; net; net = net->hh.next) { + json_object *json_chains = json_object_new_object(); + for (dap_chain_t *l_chain = net->pub.chains; l_chain; l_chain = l_chain->next) { + json_object *l_jobj_chain_info = json_object_new_object(); + json_object_object_add(l_jobj_chain_info, "count_atoms", json_object_new_int(l_chain->callback_count_atom(l_chain))); + json_object_object_add(l_jobj_chain_info, "load_process", json_object_new_int(l_chain->load_progress)); + json_object_object_add(json_chains, l_chain->name, l_jobj_chain_info); + log_it(L_DEBUG, "Loading net \"%s\", chain \"%s\", ID 0x%016"DAP_UINT64_FORMAT_x " [%d%%]", + net->pub.name, l_chain->name, l_chain->id.uint64, l_chain->load_progress); + } + json_object_object_add(l_jobj_nets, net->pub.name, json_chains); + } + json_object_object_add(json_obj, "nets", l_jobj_nets); + dap_notify_server_send_mt(json_object_get_string(json_obj)); + json_object_put(json_obj); + return true; +} + /** * @brief * load network config settings @@ -716,11 +738,13 @@ void dap_chain_net_load_all() pthread_mutex_unlock(&s_net_cond_lock); return; } + dap_timerfd_t *l_load_notify_timer = dap_timerfd_start(5000, (dap_timerfd_callback_t)s_net_disk_load_notify_callback, NULL); for (dap_chain_net_t *net = s_nets_by_name; net; net = net->hh.next) dap_proc_thread_callback_add(NULL, s_net_load, net); while (s_net_loading_count) pthread_cond_wait(&s_net_cond, &s_net_cond_lock); pthread_mutex_unlock(&s_net_cond_lock); + dap_timerfd_delete_mt(l_load_notify_timer->worker, l_load_notify_timer->esocket_uuid); } dap_string_t* dap_cli_list_net()