From cc471a66eb83c70f072aa911817ad9f33bad94fb Mon Sep 17 00:00:00 2001
From: Dmitriy Gerasimov <naeper@demlabs.net>
Date: Sat, 6 Mar 2021 18:35:38 +0700
Subject: [PATCH] [*] in CuttDB changed default lock type from spinlock to
 mutex [*] Darwin-specific updates [*] Some minor fixes in different places

---
 3rdparty/cuttdb/src/cdb_core.c                | 14 ++++-----
 3rdparty/cuttdb/src/cdb_lock.c                | 31 ++++++++++++++-----
 3rdparty/cuttdb/src/cdb_lock.h                |  2 ++
 CMakeLists.txt                                |  5 +--
 cmake/OS_Detection.cmake                      | 14 +++++++--
 dap-sdk/CMakeLists.txt                        |  9 ++----
 dap-sdk/core/CMakeLists.txt                   |  6 +++-
 dap-sdk/net/client/CMakeLists.txt             |  2 +-
 dap-sdk/net/core/CMakeLists.txt               |  2 +-
 dap-sdk/net/server/http_server/CMakeLists.txt |  4 +++
 dap-sdk/net/server/http_server/dap_http.c     |  1 +
 modules/net/CMakeLists.txt                    |  6 ++--
 modules/net/dap_chain_net.c                   |  2 ++
 modules/net/dap_chain_node_client.c           |  2 ++
 modules/net/dap_chain_node_ping.c             |  2 +-
 15 files changed, 70 insertions(+), 32 deletions(-)

diff --git a/3rdparty/cuttdb/src/cdb_core.c b/3rdparty/cuttdb/src/cdb_core.c
index 177def87f7..62c35371b3 100644
--- a/3rdparty/cuttdb/src/cdb_core.c
+++ b/3rdparty/cuttdb/src/cdb_core.c
@@ -296,13 +296,13 @@ CDB *cdb_new()
     db = (CDB *)malloc(sizeof(CDB));
     /* I assume all operation in this layer is 'fast', so no mutex used here */
     for(int i = 0; i < MLOCKNUM; i++) 
-        db->mlock[i] = cdb_lock_new(CDB_LOCKSPIN);
-    db->dpclock = cdb_lock_new(CDB_LOCKSPIN);
-    db->pclock = cdb_lock_new(CDB_LOCKSPIN);
-    db->rclock = cdb_lock_new(CDB_LOCKSPIN);
-    db->stlock = cdb_lock_new(CDB_LOCKSPIN);
-    db->oidlock = cdb_lock_new(CDB_LOCKSPIN);
-    db->bflock = cdb_lock_new(CDB_LOCKSPIN);
+        db->mlock[i] = cdb_lock_new(CDB_LOCKMUTEX);
+    db->dpclock = cdb_lock_new(CDB_LOCKMUTEX);
+    db->pclock = cdb_lock_new(CDB_LOCKMUTEX);
+    db->rclock = cdb_lock_new(CDB_LOCKMUTEX);
+    db->stlock = cdb_lock_new(CDB_LOCKMUTEX);
+    db->oidlock = cdb_lock_new(CDB_LOCKMUTEX);
+    db->bflock = cdb_lock_new(CDB_LOCKMUTEX);
     db->bgtask = cdb_bgtask_new();
     /* every thread should has its own errno */
     db->errkey = (pthread_key_t *)malloc(sizeof(pthread_key_t));
diff --git a/3rdparty/cuttdb/src/cdb_lock.c b/3rdparty/cuttdb/src/cdb_lock.c
index d30b46a87e..92aab58be4 100644
--- a/3rdparty/cuttdb/src/cdb_lock.c
+++ b/3rdparty/cuttdb/src/cdb_lock.c
@@ -22,10 +22,13 @@
 CDBLOCK *cdb_lock_new(int ltype)
 {
     CDBLOCK *lock = NULL;
+#ifndef DAP_OS_DARWIN
     if (ltype == CDB_LOCKSPIN) {
         lock = (CDBLOCK *)malloc(sizeof(CDBLOCK) + sizeof(pthread_spinlock_t));
         pthread_spin_init((pthread_spinlock_t*)&lock->lock, PTHREAD_PROCESS_PRIVATE);
-    } else if (ltype == CDB_LOCKMUTEX) {
+    } else
+#endif
+    if (ltype == CDB_LOCKMUTEX) {
         lock = (CDBLOCK *)malloc(sizeof(CDBLOCK) + sizeof(pthread_mutex_t));
         pthread_mutex_init((pthread_mutex_t*)&lock->lock, NULL);
     }
@@ -38,28 +41,37 @@ CDBLOCK *cdb_lock_new(int ltype)
 
 void cdb_lock_lock(CDBLOCK *lock)
 {
+#ifndef DAP_OS_DARWIN
     if (lock->ltype == CDB_LOCKSPIN)
         pthread_spin_lock((pthread_spinlock_t*)&lock->lock);
-    else if (lock->ltype == CDB_LOCKMUTEX)
-        pthread_mutex_lock((pthread_mutex_t*)&lock->lock);
+    else
+#endif
+        if (lock->ltype == CDB_LOCKMUTEX)
+            pthread_mutex_lock((pthread_mutex_t*)&lock->lock);
 }
 
 
 void cdb_lock_unlock(CDBLOCK *lock)
 {
+#ifndef DAP_OS_DARWIN
     if (lock->ltype == CDB_LOCKSPIN)
         pthread_spin_unlock((pthread_spinlock_t*)&lock->lock);
-    else if (lock->ltype == CDB_LOCKMUTEX)
+    else
+#endif
+        if (lock->ltype == CDB_LOCKMUTEX)
         pthread_mutex_unlock((pthread_mutex_t*)&lock->lock);
 }
 
 
 void cdb_lock_destory(CDBLOCK *lock)
 {
+#ifndef DAP_OS_DARWIN
     if (lock->ltype == CDB_LOCKSPIN)
         pthread_spin_destroy((pthread_spinlock_t*)&lock->lock);
-    else if (lock->ltype == CDB_LOCKMUTEX)
-        pthread_mutex_destroy((pthread_mutex_t*)&lock->lock);
+    else
+#endif
+        if (lock->ltype == CDB_LOCKMUTEX)
+            pthread_mutex_destroy((pthread_mutex_t*)&lock->lock);
 
     free(lock);
 }
@@ -67,10 +79,13 @@ void cdb_lock_destory(CDBLOCK *lock)
 
 int cdb_lock_trylock(CDBLOCK *lock)
 {
+#ifndef DAP_OS_DARWIN
     if (lock->ltype == CDB_LOCKSPIN)
         return pthread_spin_trylock((pthread_spinlock_t*)&lock->lock);
-    else if (lock->ltype == CDB_LOCKMUTEX)
-        return pthread_mutex_trylock((pthread_mutex_t*)&lock->lock);
+    else
+#endif
+        if (lock->ltype == CDB_LOCKMUTEX)
+            return pthread_mutex_trylock((pthread_mutex_t*)&lock->lock);
     return 0;
 }
 
diff --git a/3rdparty/cuttdb/src/cdb_lock.h b/3rdparty/cuttdb/src/cdb_lock.h
index 587fcdb18b..bbd1309860 100644
--- a/3rdparty/cuttdb/src/cdb_lock.h
+++ b/3rdparty/cuttdb/src/cdb_lock.h
@@ -19,7 +19,9 @@
 
 enum {
     /* spinlock */
+#ifndef DAP_OS_DARWIN
     CDB_LOCKSPIN,
+#endif
     /* mutex, which may cause OS context switch, mainly used in where Disk IO happens */
     CDB_LOCKMUTEX,
 };
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 161246a8f4..e9f56d54e6 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,9 +2,10 @@ project(cellframe-sdk C)
 cmake_minimum_required(VERSION 3.0)
 
 set(CMAKE_C_STANDARD 11)
-set(CELLFRAME_SDK_NATIVE_VERSION "2.8-23")
+set(CELLFRAME_SDK_NATIVE_VERSION "2.8-24")
 add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"")
 set(DAPSDK_MODULES "")
+message("Cellframe modules: ${CELLFRAME_MODULES}")
 
 if (CELLFRAME_MODULES MATCHES "core")
     SET(DAPSDK_MODULES "${DAPSDK_MODULES} core crypto")
@@ -47,7 +48,7 @@ set(CELLFRAME_LIBS "")
 # Core libs from dap-sdk
 if (CELLFRAME_MODULES MATCHES "core")
     message("[+] Module 'core'")
-    set(CELLFRAME_LIBS ${CELLFRAME_LIBS} dap_core dap_crypto m pthread)
+    set(CELLFRAME_LIBS ${CELLFRAME_LIBS} dap_core dap_app_cli dap_crypto m pthread)
 endif()
 
 # General chain libs
diff --git a/cmake/OS_Detection.cmake b/cmake/OS_Detection.cmake
index 4176d19195..761dc527d5 100644
--- a/cmake/OS_Detection.cmake
+++ b/cmake/OS_Detection.cmake
@@ -47,6 +47,7 @@ if(UNIX)
     if (APPLE)
         add_definitions ("-DDAP_OS_DARWIN -DDARWIN -DDAP_OS_BSD")
         set(DARWIN ON)
+        set(BSD ON)
     endif()
     
     if (${CMAKE_SYSTEM_NAME} MATCHES "BSD" )
@@ -66,8 +67,17 @@ if(UNIX)
         else()
 	    set(_CCOPT "-Wno-deprecated-declarations -Wno-unused-local-typedefs -Wno-unused-function -Wno-implicit-fallthrough -Wno-unused-variable -Wno-unused-parameter -Wno-unused-but-set-variable -O3 -fPIC -fno-strict-aliasing -fno-ident -ffast-math -ftree-vectorize -fno-asynchronous-unwind-tables -ffunction-sections -Wl,--gc-sections -Wl,--strip-all -std=gnu11")
         endif()
-    endif()
-    if (BSD)
+    elseif (DARWIN)
+        if(DAP_DEBUG)
+          set(_CCOPT "-L/usr/local/lib -I/usr/local/include -DDAP_DEBUG -Wall -Wno-unused-command-line-argument -Wno-deprecated-declarations -Wno-unused-local-typedefs -Wno-unused-function -Wno-implicit-fallthrough -Wno-unused-variable -Wno-unused-parameter -g3 -ggdb -fno-eliminate-unused-debug-symbols -fno-strict-aliasing")
+          set(_LOPT "-L/usr/local/lib ")
+          SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
+        else()
+          set(_CCOPT "-L /usr/local/lib -I/usr/local/include -Wno-deprecated-declarations -Wno-unused-command-line-argument -Wno-unused-local-typedefs -Wno-unused-function -Wno-implicit-fallthrough -Wno-unused-variable -Wno-unused-parameter -O3 -fPIC -fno-strict-aliasing -fno-ident -ffast-math -ftree-vectorize -fno-asynchronous-unwind-tables -ffunction-sections -std=gnu11")
+          set(_LOPT "-L /usr/local/lib ")
+          SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -L/usr/local/lib")
+        endif()
+    elseif(BSD)
         if(DAP_DEBUG)
 	  set(_CCOPT "-L/usr/local/lib -I/usr/local/include -DDAP_DEBUG -Wall -Wno-unused-command-line-argument -Wno-deprecated-declarations -Wno-unused-local-typedefs -Wno-unused-function -Wno-implicit-fallthrough -Wno-unused-variable -Wno-unused-parameter -pg -g3 -ggdb -fno-eliminate-unused-debug-symbols -fno-strict-aliasing")
           set(_LOPT "-pg -L/usr/local/lib ")
diff --git a/dap-sdk/CMakeLists.txt b/dap-sdk/CMakeLists.txt
index 1ebf8ea8c9..b59160cb13 100644
--- a/dap-sdk/CMakeLists.txt
+++ b/dap-sdk/CMakeLists.txt
@@ -1,9 +1,6 @@
-set(DAP_SDK_NATIVE_VERSION "2.0-14")
-# Core 
-if (DAPSDK_MODULES MATCHES "core")
-    # Core
-    add_subdirectory(core)
-endif()
+set(DAP_SDK_NATIVE_VERSION "2.1-0")
+# Core, add it always
+add_subdirectory(core)
 if (DAPSDK_MODULES MATCHES "crypto")
     # Cryptography
     add_subdirectory(crypto)
diff --git a/dap-sdk/core/CMakeLists.txt b/dap-sdk/core/CMakeLists.txt
index 5612789c0e..60cb7dc92b 100755
--- a/dap-sdk/core/CMakeLists.txt
+++ b/dap-sdk/core/CMakeLists.txt
@@ -43,7 +43,11 @@ endif()
 
 if(UNIX)
     add_subdirectory(src/unix)
-    target_link_libraries(${PROJECT_NAME} dap_core_unix rt)
+    if(DARWIN)
+        target_link_libraries(${PROJECT_NAME} dap_core_unix)
+    else()
+        target_link_libraries(${PROJECT_NAME} dap_core_unix rt)
+    endif()
 endif()
 
 if(DARWIN)
diff --git a/dap-sdk/net/client/CMakeLists.txt b/dap-sdk/net/client/CMakeLists.txt
index 4e88cd3c00..febe04a733 100644
--- a/dap-sdk/net/client/CMakeLists.txt
+++ b/dap-sdk/net/client/CMakeLists.txt
@@ -9,7 +9,7 @@ add_library(${PROJECT_NAME} STATIC ${DAP_CLIENT_HEADERS} ${DAP_CLIENT_SOURCES})
 
 target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_server_core dap_http_server dap_enc_server dap_stream dap_session dap_stream_ch json-c)
 
-if(UNIX AND NOT ANDROID)
+if(UNIX AND NOT ANDROID AND NOT DARWIN)
     target_link_libraries(${PROJECT_NAME} rt)
 endif()
 
diff --git a/dap-sdk/net/core/CMakeLists.txt b/dap-sdk/net/core/CMakeLists.txt
index f8e4ce4246..c1176524e4 100644
--- a/dap-sdk/net/core/CMakeLists.txt
+++ b/dap-sdk/net/core/CMakeLists.txt
@@ -24,7 +24,7 @@ if(WIN32)
 endif()
 
 if(UNIX)
-  target_link_libraries(${PROJECT_NAME} dap_core dap_crypto rt)
+  target_link_libraries(${PROJECT_NAME} dap_core dap_crypto)
 
   if(NOT ANDROID)
       target_link_libraries(${PROJECT_NAME} pthread)
diff --git a/dap-sdk/net/server/http_server/CMakeLists.txt b/dap-sdk/net/server/http_server/CMakeLists.txt
index 05eaf454d8..656f8e66cf 100644
--- a/dap-sdk/net/server/http_server/CMakeLists.txt
+++ b/dap-sdk/net/server/http_server/CMakeLists.txt
@@ -21,6 +21,10 @@ target_include_directories(${PROJECT_NAME} INTERFACE . http_client/include/)
 target_include_directories(${PROJECT_NAME} PUBLIC include)
 target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../../../3rdparty/uthash/src)
 
+if(DARWIN)
+    target_include_directories(${PROJECT_NAME} PRIVATE /usr/local/include)
+endif()
+
 if(WIN32)
   target_link_libraries(dap_http_server dap_core dap_crypto dap_server_core magic regex tre intl iconv
   KERNEL32
diff --git a/dap-sdk/net/server/http_server/dap_http.c b/dap-sdk/net/server/http_server/dap_http.c
index 6b27d5449f..b931d229d8 100644
--- a/dap-sdk/net/server/http_server/dap_http.c
+++ b/dap-sdk/net/server/http_server/dap_http.c
@@ -167,5 +167,6 @@ dap_http_url_proc_t * dap_http_add_proc(dap_http_t *a_http, const char *a_url_pa
     HASH_ADD_STR( a_http->url_proc, url, l_url_proc );
 
     log_it( L_DEBUG, "Added URL processor for '%s' path", l_url_proc->url );
+    return l_url_proc;
 }
 
diff --git a/modules/net/CMakeLists.txt b/modules/net/CMakeLists.txt
index 97ab46d7e9..2df24764a7 100644
--- a/modules/net/CMakeLists.txt
+++ b/modules/net/CMakeLists.txt
@@ -37,16 +37,16 @@ endif()
 add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRCS} ${DAP_CHAIN_NET_HEADERS} ${IPUTILS_SRCS} ${IPUTILS_HEADERS})
 
 if(WIN32)
-  target_link_libraries(dap_chain_net dap_core dap_crypto dap_client dap_ dap_stream_ch_chain dap_stream_ch_chain_net dap_stream_ch_chain_net_srv dap_chain dap_chain_crypto dap_chain_wallet dap_chain_net_srv
+  target_link_libraries(dap_core dap_chain_net dap_crypto dap_client dap_server_core dap_stream_ch_chain dap_stream_ch_chain_net dap_stream_ch_chain_net_srv dap_chain dap_chain_crypto dap_chain_wallet dap_chain_net_srv
                             dap_chain_mempool dap_chain_global_db dap_chain_net_srv_stake dap_chain_cs_none)
 endif()
 
 if(LINUX)
-    target_link_libraries(${PROJECT_NAME} dap_core dap_crypto  dap_notify_srv dap_client dap_stream_ch_chain dap_stream_ch_chain_net dap_stream_ch_chain_net_srv dap_chain
+    target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_server_core dap_notify_srv dap_client dap_stream_ch_chain dap_stream_ch_chain_net dap_stream_ch_chain_net_srv dap_chain
       dap_chain_wallet dap_chain_net_srv dap_chain_mempool dap_chain_global_db dap_chain_net_srv_stake dap_chain_cs_none
       resolv )
 elseif(BSD)
-    target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_notify_srv dap_client dap_stream_ch_chain dap_stream_ch_chain_net dap_stream_ch_chain_net_srv dap_chain
+    target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_server_core dap_notify_srv dap_client dap_stream_ch_chain dap_stream_ch_chain_net dap_stream_ch_chain_net_srv dap_chain
       dap_chain_wallet dap_chain_net_srv dap_chain_mempool dap_chain_global_db dap_chain_net_srv_stake dap_chain_cs_none )
 endif()
 
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index c7f56e6332..c8aa4d25e1 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -988,7 +988,9 @@ static dap_chain_net_t *s_net_new(const char * a_id, const char * a_name ,
 #ifndef _WIN32
     pthread_condattr_t l_attr;
     pthread_condattr_init( &l_attr );
+#ifndef DAP_OS_DARWIN
     pthread_condattr_setclock( &l_attr, CLOCK_MONOTONIC );
+#endif
     pthread_cond_init( &PVT(ret)->state_proc_cond, &l_attr );
 #else
     PVT(ret)->state_proc_cond = CreateEventA( NULL, FALSE, FALSE, NULL );
diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c
index 0aef447977..c7154e8221 100644
--- a/modules/net/dap_chain_node_client.c
+++ b/modules/net/dap_chain_node_client.c
@@ -681,7 +681,9 @@ dap_chain_node_client_t* dap_chain_node_client_create_n_connect(dap_chain_net_t
 #ifndef _WIN32
     pthread_condattr_t attr;
     pthread_condattr_init(&attr);
+#ifndef DAP_OS_DARWIN
     pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
+#endif
     pthread_cond_init(&l_node_client->wait_cond, &attr);
 #else
     l_node_client->wait_cond = CreateEventA( NULL, FALSE, FALSE, NULL );
diff --git a/modules/net/dap_chain_node_ping.c b/modules/net/dap_chain_node_ping.c
index 353bf48fe4..bfd102f425 100644
--- a/modules/net/dap_chain_node_ping.c
+++ b/modules/net/dap_chain_node_ping.c
@@ -170,7 +170,7 @@ int wait_node_ping(pthread_t l_thread, int timeout_ms)
     timeout_ms *= 1000;
     l_wait_time.tv_sec += timeout_ms / DAP_USEC_PER_SEC;
     l_wait_time.tv_nsec += 1000 * (timeout_ms % DAP_USEC_PER_SEC);
-#if !defined(_WIN32) && !defined(__ANDROID__)
+#if !defined(_WIN32) && !defined(__ANDROID__) && !defined (DAP_OS_DARWIN)
     int res = pthread_timedjoin_np(l_thread, (void **) &l_ping_time, &l_wait_time);
 #else
     int res = pthread_join(l_thread, (void **) &l_ping_time);
-- 
GitLab