From a6aed0c8d38a8bd8a12b560162d214e4a16d92b2 Mon Sep 17 00:00:00 2001
From: Roman Khlopkov <roman.khlopkov@demlabs.net>
Date: Thu, 7 May 2020 08:46:21 +0000
Subject: [PATCH] bugs-3757

---
 dap-sdk/core/libdap.pri             |  1 +
 dap-sdk/core/src/core.pri           |  1 +
 modules/net/dap_chain_net.c         | 14 ++++++++++----
 modules/net/dap_chain_node_cli.c    |  4 ++--
 modules/net/include/dap_chain_net.h |  3 ++-
 modules/type/dag/dap_chain_cs_dag.c |  6 ++----
 6 files changed, 18 insertions(+), 11 deletions(-)

diff --git a/dap-sdk/core/libdap.pri b/dap-sdk/core/libdap.pri
index b290a6c1ec..3556d8828e 100755
--- a/dap-sdk/core/libdap.pri
+++ b/dap-sdk/core/libdap.pri
@@ -2,6 +2,7 @@ QMAKE_CFLAGS_DEBUG = -std=gnu11
 QMAKE_CFLAGS_RELEASE = -std=gnu11
 unix {
     include(src/unix/unix.pri)
+    LIBS += -lrt
 }
 darwin {
     include(src/darwin/darwin.pri)
diff --git a/dap-sdk/core/src/core.pri b/dap-sdk/core/src/core.pri
index 14172b607b..81ce43173e 100755
--- a/dap-sdk/core/src/core.pri
+++ b/dap-sdk/core/src/core.pri
@@ -1,5 +1,6 @@
 unix {
     include(unix/unix.pri)
+    LIBS += -lrt
 }
 darwin {
     include(darwin/darwin.pri)
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 82c303ddcd..c84b3c4f9b 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -189,7 +189,7 @@ void s_net_set_go_sync(dap_chain_net_t * a_net)
 {
     if(!a_net)
         return;
-    dap_chain_net_start(a_net);
+    dap_chain_net_state_go_to(a_net, NET_STATE_SYNC_REQUESTED);
 }
 
 /**
@@ -209,10 +209,16 @@ inline static const char * s_net_state_to_str(dap_chain_net_state_t l_state)
  */
 int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_new_state)
 {
-    if (PVT(a_net)->state_target == a_new_state){
-        log_it(L_WARNING,"Already going to state %s",s_net_state_to_str(a_new_state));
+    if (a_new_state == NET_STATE_SYNC_REQUESTED) {
+        if (PVT(a_net)->state_target != NET_STATE_OFFLINE) {
+            PVT(a_net)->state_target = NET_STATE_ONLINE;
+        }
+    } else {
+        if (PVT(a_net)->state_target == a_new_state){
+            log_it(L_WARNING,"Already going to state %s",s_net_state_to_str(a_new_state));
+        }
+        PVT(a_net)->state_target = a_new_state;
     }
-    PVT(a_net)->state_target = a_new_state;
     pthread_mutex_lock( &PVT(a_net)->state_mutex_cond);
     // set flag for sync
     PVT(a_net)->flags |= F_DAP_CHAIN_NET_GO_SYNC;
diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c
index abd8b8ccc3..1a993b797d 100644
--- a/modules/net/dap_chain_node_cli.c
+++ b/modules/net/dap_chain_node_cli.c
@@ -1013,8 +1013,8 @@ int dap_chain_node_cli_init(dap_config_t * g_config)
 
 #ifndef _WIN32
     // News
-    dap_chain_node_cli_cmd_item_create("news", com_news, NULL, "Add News for VPN clients. Language code is a text code like \"en\", \"ru\", \"fr\"",
-            "news [-text <news text> | -file <filename with news>] -lang <language code> \n");
+    //dap_chain_node_cli_cmd_item_create("news", com_news, NULL, "Add News for VPN clients. Language code is a text code like \"en\", \"ru\", \"fr\"",
+     //       "news [-text <news text> | -file <filename with news>] -lang <language code> \n");
 
 #endif
     // create thread for waiting of clients
diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h
index 174cfb3387..b11b20a150 100644
--- a/modules/net/include/dap_chain_net.h
+++ b/modules/net/include/dap_chain_net.h
@@ -61,7 +61,8 @@ typedef  enum dap_chain_net_state{
     NET_STATE_ADDR_REQUEST, // Waiting for address assign
     NET_STATE_SYNC_GDB,
     NET_STATE_SYNC_CHAINS,
-    NET_STATE_ONLINE
+    NET_STATE_ONLINE,
+    NET_STATE_SYNC_REQUESTED
 } dap_chain_net_state_t;
 
 typedef struct dap_chain_net{
diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c
index eb12e8dda3..1e6acf8751 100644
--- a/modules/type/dag/dap_chain_cs_dag.c
+++ b/modules/type/dag/dap_chain_cs_dag.c
@@ -338,7 +338,9 @@ static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t
         l_tx_event->ts_added = l_event_item->ts_added;
         l_tx_event->event = l_event;
         memcpy(&l_tx_event->hash, &l_event_item->hash, sizeof (l_tx_event->hash) );
+        pthread_rwlock_wrlock(&PVT(l_dag)->events_rwlock);
         HASH_ADD(hh,PVT(l_dag)->tx_events,hash,sizeof (l_tx_event->hash),l_tx_event);
+        pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock);
 
         //if ( !l_gdb_priv->is_load_mode ) // If its not load module but mempool proc
         //    l_tx->header.ts_created = time(NULL);
@@ -346,7 +348,6 @@ static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t
 
         // don't save bad transactions to base
         if(dap_chain_ledger_tx_add(a_chain->ledger, l_tx) != 1) {
-            pthread_rwlock_unlock(l_events_rwlock);
             return -1;
         }
         //}else
@@ -354,11 +355,8 @@ static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t
     }
         break;
     default:
-        pthread_rwlock_unlock(l_events_rwlock);
         return -1;
     }
-
-    pthread_rwlock_unlock( l_events_rwlock );
     // Now check the treshold if some events now are ready to move to the main table
     dap_chain_cs_dag_proc_treshold(l_dag);
     return 0;
-- 
GitLab