From f08bcddc94423ff06faf14d5cd37fa8fcfa03c8e Mon Sep 17 00:00:00 2001
From: Sergey Yakubov <sergey.yakubov@desy.de>
Date: Tue, 19 Dec 2017 11:26:54 +0100
Subject: [PATCH] refactor example

---
 common/cpp/CMakeLists.txt                     |  1 +
 examples/worker/process_folder/CMakeLists.txt |  5 ++
 .../worker/process_folder/process_folder.cpp  | 72 +++++++++++++------
 worker/api/cpp/CMakeLists.txt                 |  2 +
 4 files changed, 60 insertions(+), 20 deletions(-)

diff --git a/common/cpp/CMakeLists.txt b/common/cpp/CMakeLists.txt
index 1549c800f..9fef72369 100644
--- a/common/cpp/CMakeLists.txt
+++ b/common/cpp/CMakeLists.txt
@@ -15,6 +15,7 @@ ENDIF(WIN32)
 ################################
 # Library
 ################################
+#add_library(${TARGET_NAME} SHARED STATIC ${SOURCE_FILES})
 add_library(${TARGET_NAME} SHARED ${SOURCE_FILES})
 target_include_directories(${TARGET_NAME} PUBLIC include)
 set_target_properties(${TARGET_NAME} PROPERTIES LINKER_LANGUAGE CXX)
diff --git a/examples/worker/process_folder/CMakeLists.txt b/examples/worker/process_folder/CMakeLists.txt
index 69cf5a904..d7719be06 100644
--- a/examples/worker/process_folder/CMakeLists.txt
+++ b/examples/worker/process_folder/CMakeLists.txt
@@ -5,6 +5,11 @@ set(SOURCE_FILES process_folder.cpp)
 ################################
 # Executable and link
 ################################
+if (CMAKE_BUILD_TYPE STREQUAL "Release")
+set(CMAKE_FIND_STATIC FIRST)
+endif()
 add_executable(${TARGET_NAME} ${SOURCE_FILES})
 target_link_libraries(${TARGET_NAME} common worker-api pthread)
 set_target_properties(${TARGET_NAME} PROPERTIES LINKER_LANGUAGE CXX)
+#set_target_properties(${TARGET_NAME} PROPERTIES LINK_FLAGS "-static-libstdc++")
+
diff --git a/examples/worker/process_folder/process_folder.cpp b/examples/worker/process_folder/process_folder.cpp
index b75d18bfc..6f84a6121 100644
--- a/examples/worker/process_folder/process_folder.cpp
+++ b/examples/worker/process_folder/process_folder.cpp
@@ -6,23 +6,27 @@
 #include <chrono>
 #include <iomanip>
 
-
-
 #include "worker/data_broker.h"
 
 using hidra2::WorkerErrorCode;
 using std::chrono::high_resolution_clock;
 
-
-int main(int argc, char* argv[]) {
-
+struct Statistics {
+    std::chrono::milliseconds duration_scan;
+    std::chrono::milliseconds duration_read;
+    int nfiles;
+    double size_gb;
+    double bandwidth;
+};
+std::string ProcessCommandArguments(int argc, char* argv[]){
     if (argc != 2) {
         std::cout << "Usage: " + std::string{argv[0]} +" <path to folder>" << std::endl;
         abort();
     }
+    return argv[1];
+}
 
-    std::string folder{argv[1]};
-
+std::unique_ptr<hidra2::DataBroker> CreateBroker(const std::string& folder){
     hidra2::WorkerErrorCode err;
     auto broker = hidra2::DataBrokerFactory::Create(folder, &err);
     if (err != WorkerErrorCode::OK) {
@@ -30,35 +34,63 @@ int main(int argc, char* argv[]) {
         abort();
     }
 
+    return broker;
+}
+
+void ConnectToBrocker(std::unique_ptr<hidra2::DataBroker>* broker,Statistics* statistics){
+    hidra2::WorkerErrorCode err;
     high_resolution_clock::time_point t1 = high_resolution_clock::now();
-    err = broker->Connect();
+    err = (*broker)->Connect();
     if (err != WorkerErrorCode::OK) {
         std::cout << "Cannot connect to broker" << std::endl;
         abort();
     }
     high_resolution_clock::time_point t2 = high_resolution_clock::now();
-    auto duration_scan = std::chrono::duration_cast<std::chrono::milliseconds>( t2 - t1 ).count();
-
+    statistics->duration_scan = std::chrono::duration_cast<std::chrono::milliseconds>( t2 - t1 );
+}
 
+void ReadAllData(std::unique_ptr<hidra2::DataBroker>* broker,Statistics* statistics){
+    hidra2::WorkerErrorCode err;
     hidra2::FileInfo file_info;
     hidra2::FileData file_data;
+    high_resolution_clock::time_point t1 = high_resolution_clock::now();
 
     int nfiles = 0;
     uint64_t size = 0;
-    while ((err = broker->GetNext(&file_info, &file_data)) == WorkerErrorCode::OK) {
+    while ((err = (*broker)->GetNext(&file_info, &file_data)) == WorkerErrorCode::OK) {
         nfiles++;
         size += file_info.size;
     }
-    high_resolution_clock::time_point t3 = high_resolution_clock::now();
-    auto duration_read = std::chrono::duration_cast<std::chrono::milliseconds>( t3 - t2 ).count();
+    if (err!=WorkerErrorCode::NO_DATA){
+        std::cout << "Read error" << std::endl;
+        abort();
+    }
+
+    high_resolution_clock::time_point t2 = high_resolution_clock::now();
+    statistics->nfiles = nfiles;
+    statistics->size_gb = double(size) / 1024 / 1024 / 1024;
+    statistics->duration_read=std::chrono::duration_cast<std::chrono::milliseconds>( t2 - t1 );
+    statistics->bandwidth = statistics->size_gb/statistics->duration_read.count()*1000;
+}
+
+
+void PrintStatistics(const Statistics& statistics){
+    std::cout << "Processed " << statistics.nfiles << " files" << std::endl;
+    std::cout << "Total size: " << std::setprecision(2) << statistics.size_gb << "GB" << std::endl;
+    std::cout << "Elapsed scan : " << statistics.duration_scan.count() << "ms" << std::endl;
+    std::cout << "Elapsed read : " << statistics.duration_read.count() << "ms" << std::endl;
+    std::cout << "Bandwidth: " << std::setprecision(2) << statistics.bandwidth << "GB/sec" << std::endl;
+}
+
+
+int main(int argc, char* argv[]) {
+    std::string folder = ProcessCommandArguments(argc,argv);
+    auto broker = CreateBroker(folder);
 
-    double size_gb = double(size) / 1024 / 1024 / 1024;
-    double bandwidth = size_gb/duration_read*1000;
-    std::cout << "Processed " << nfiles << " files" << std::endl;
-    std::cout << "Total size: " << std::setprecision(2) << size_gb << "GB" << std::endl;
-    std::cout << "Elapsed scan : " << duration_scan << "ms" << std::endl;
-    std::cout << "Elapsed read : " << duration_read << "ms" << std::endl;
-    std::cout << "Bandwidth: " << std::setprecision(2) << bandwidth << "GB/sec" << std::endl;
+    Statistics statistics;
+    ConnectToBrocker(&broker,&statistics);
+    ReadAllData(&broker,&statistics);
+    PrintStatistics(statistics);
 
     return 0;
 }
diff --git a/worker/api/cpp/CMakeLists.txt b/worker/api/cpp/CMakeLists.txt
index b999d879c..bb138ff79 100644
--- a/worker/api/cpp/CMakeLists.txt
+++ b/worker/api/cpp/CMakeLists.txt
@@ -7,6 +7,8 @@ set(SOURCE_FILES include/worker/data_broker.h src/data_broker.cpp src/folder_dat
 # Library
 ################################
 add_library(${TARGET_NAME} SHARED ${SOURCE_FILES})
+#add_library(${TARGET_NAME} SHARED STATIC ${SOURCE_FILES})
+
 target_include_directories(${TARGET_NAME} PUBLIC include)
 target_link_libraries(${TARGET_NAME} common)
 set_target_properties(${TARGET_NAME} PROPERTIES LINKER_LANGUAGE CXX)
-- 
GitLab