Revision: 75792
          http://sourceforge.net/p/brlcad/code/75792
Author:   starseeker
Date:     2020-05-14 03:33:03 +0000 (Thu, 14 May 2020)
Log Message:
-----------
Set up to use threads.  About 3x faster than regress-repository.sh at this 
point.

Modified Paths:
--------------
    brlcad/trunk/regress/repository/CMakeLists.txt
    brlcad/trunk/regress/repository/repocheck.cpp

Modified: brlcad/trunk/regress/repository/CMakeLists.txt
===================================================================
--- brlcad/trunk/regress/repository/CMakeLists.txt      2020-05-14 02:36:15 UTC 
(rev 75791)
+++ brlcad/trunk/regress/repository/CMakeLists.txt      2020-05-14 03:33:03 UTC 
(rev 75792)
@@ -1,6 +1,7 @@
 #set(REPOCHECK_TEST 1)
 if (DEFINED REPOCHECK_TEST)
   add_executable(repocheck repocheck.cpp)
+  target_link_libraries(repocheck ${CMAKE_THREAD_LIBS_INIT})
   if (O3_COMPILER_FLAG)
     # This check benefits greatly from optimization. If we have the O3 flag, 
use
     # it - whether or not the standard build settings would add it.

Modified: brlcad/trunk/regress/repository/repocheck.cpp
===================================================================
--- brlcad/trunk/regress/repository/repocheck.cpp       2020-05-14 02:36:15 UTC 
(rev 75791)
+++ brlcad/trunk/regress/repository/repocheck.cpp       2020-05-14 03:33:03 UTC 
(rev 75792)
@@ -50,11 +50,21 @@
 #include <map>
 #include <sstream>
 #include <string>
+#include <thread>
 #define MAX_LINES_CHECK 500
+#define EXPECTED_PLATFORM_SYMBOLS 206
 
 class repo_state_t {
     public:
 
+       // Thread state and result info
+       std::string cfile;
+       int ret = 0;
+       int inc_cnt = 0;
+       int src_cnt = 0;
+       int bld_cnt = 0;
+
+       // Initialize the regex info once per thread
        repo_state_t() {
            int cnt = 0;
            const char *rf;
@@ -545,6 +555,67 @@
     return match_cnt;
 }
 
+
+void
+process_inc_file(repo_state_t &r_t)
+{
+    std::ifstream fs;
+    fs.open(r_t.cfile);
+    if (!fs.is_open()) {
+       return;
+    }
+    fs.clear();
+    fs.seekg(0, std::ios::beg);
+    r_t.ret += bio_redundant_check(r_t, r_t.cfile, fs);
+    fs.clear();
+    fs.seekg(0, std::ios::beg);
+    r_t.ret += bnetwork_redundant_check(r_t, r_t.cfile, fs);
+    fs.clear();
+    fs.seekg(0, std::ios::beg);
+    r_t.inc_cnt += platform_symbols(r_t, r_t.symbol_inc_log, r_t.cfile, fs);
+    fs.close();
+}
+
+void
+process_src_file(repo_state_t &r_t)
+{
+    std::ifstream fs;
+    fs.open(r_t.cfile);
+    if (!fs.is_open()) {
+       return;
+    }
+    fs.clear();
+    fs.seekg(0, std::ios::beg);
+    r_t.ret += bio_redundant_check(r_t, r_t.cfile, fs);
+    fs.clear();
+    fs.seekg(0, std::ios::beg);
+    r_t.ret += bnetwork_redundant_check(r_t, r_t.cfile, fs);
+    fs.clear();
+    fs.seekg(0, std::ios::beg);
+    r_t.ret += common_include_first(r_t, r_t.cfile, fs);
+    fs.clear();
+    fs.seekg(0, std::ios::beg);
+    r_t.ret += api_usage(r_t, r_t.cfile, fs);
+    fs.clear();
+    fs.seekg(0, std::ios::beg);
+    r_t.src_cnt += platform_symbols(r_t, r_t.symbol_src_log, r_t.cfile, fs);
+    fs.close();
+}
+
+void
+process_bld_file(repo_state_t &r_t)
+{
+    std::ifstream fs;
+    fs.open(r_t.cfile);
+    if (!fs.is_open()) {
+       return;
+    }
+    fs.clear();
+    fs.seekg(0, std::ios::beg);
+    r_t.bld_cnt += platform_symbols(r_t, r_t.symbol_bld_log, r_t.cfile, fs);
+    fs.close();
+}
+
 int
 main(int argc, const char *argv[])
 {
@@ -553,9 +624,6 @@
        return -1;
     }
 
-    repo_state_t repo_state;
-    repo_state.path_root = std::string(argv[2]);
-
     std::string sfile;
     std::ifstream src_file_stream;
     src_file_stream.open(argv[1]);
@@ -631,67 +699,91 @@
     int ret = 0;
 
 
-    int inc_cnt = 0;
-    for (size_t i = 0; i < inc_files.size(); i++) {
-       std::ifstream fs;
-       fs.open(inc_files[i]);
-       if (!fs.is_open()) {
-           std::cerr << "Unable to open " << inc_files[i] << " for reading, 
skipping\n";
-           continue;
-       }
-       fs.clear();
-       fs.seekg(0, std::ios::beg);
-       ret += bio_redundant_check(repo_state, inc_files[i], fs);
-       fs.clear();
-       fs.seekg(0, std::ios::beg);
-       ret += bnetwork_redundant_check(repo_state, inc_files[i], fs);
-       fs.clear();
-       fs.seekg(0, std::ios::beg);
-       inc_cnt += platform_symbols(repo_state, repo_state.symbol_inc_log, 
inc_files[i], fs);
-       fs.close();
+    // Regex testing is CPU intensive - go parallel for main checks
+    size_t fcnt = 0;
+    unsigned int hwc = std::thread::hardware_concurrency();
+    if (!hwc) {
+       hwc = 10;
     }
+    std::vector<repo_state_t> repo_states;
+    for (unsigned int i = 0; i < hwc; i++) {
+       repo_state_t repo_state;
+       repo_state.path_root = std::string(argv[2]);
+       repo_states.push_back(repo_state);
+    }
 
-    int src_cnt = 0;
-    for (size_t i = 0; i < src_files.size(); i++) {
-       std::ifstream fs;
-       fs.open(src_files[i]);
-       if (!fs.is_open()) {
-           std::cerr << "Unable to open " << src_files[i] << " for reading, 
skipping\n";
-           continue;
-       }
-       fs.clear();
-       fs.seekg(0, std::ios::beg);
-       ret += bio_redundant_check(repo_state, src_files[i], fs);
-       fs.clear();
-       fs.seekg(0, std::ios::beg);
-       ret += bnetwork_redundant_check(repo_state, src_files[i], fs);
-       fs.clear();
-       fs.seekg(0, std::ios::beg);
-       ret += common_include_first(repo_state, src_files[i], fs);
-       fs.clear();
-       fs.seekg(0, std::ios::beg);
-       ret += api_usage(repo_state, src_files[i], fs);
-       fs.clear();
-       fs.seekg(0, std::ios::beg);
-       src_cnt += platform_symbols(repo_state, repo_state.symbol_src_log, 
src_files[i], fs);
-       fs.close();
+    fcnt = 0;
+    while (fcnt < inc_files.size()) {
+        int athreads = 0;
+        std::vector<std::thread> t;
+        for (unsigned int i = 0; i < hwc; i++) {
+            if (fcnt + i < inc_files.size()) {
+                repo_states[i].cfile = inc_files[fcnt+i];
+                t.push_back(std::thread(process_inc_file, 
std::ref(repo_states[i])));
+                athreads++;
+            }
+        }
+        for (int i = 0; i < athreads; i++) {
+            t[i].join();
+        }
+        fcnt += athreads;
     }
 
-    int bld_cnt = 0;
-    for (size_t i = 0; i < bld_files.size(); i++) {
-       std::ifstream fs;
-       fs.open(bld_files[i]);
-       if (!fs.is_open()) {
-           std::cerr << "Unable to open " << bld_files[i] << " for reading, 
skipping\n";
-           continue;
-       }
-       fs.clear();
-       fs.seekg(0, std::ios::beg);
-       bld_cnt += platform_symbols(repo_state, repo_state.symbol_bld_log, 
bld_files[i], fs);
+    fcnt = 0;
+    while (fcnt < src_files.size()) {
+        int athreads = 0;
+        std::vector<std::thread> t;
+        for (unsigned int i = 0; i < hwc; i++) {
+            if (fcnt + i < src_files.size()) {
+                repo_states[i].cfile = src_files[fcnt+i];
+                t.push_back(std::thread(process_src_file, 
std::ref(repo_states[i])));
+                athreads++;
+            }
+        }
+        for (int i = 0; i < athreads; i++) {
+            t[i].join();
+        }
+        fcnt += athreads;
     }
 
-    int psym_cnt = inc_cnt + src_cnt + bld_cnt;
-    int expected_psym_cnt = 10;
+    fcnt = 0;
+    while (fcnt < bld_files.size()) {
+        int athreads = 0;
+        std::vector<std::thread> t;
+        for (unsigned int i = 0; i < hwc; i++) {
+            if (fcnt + i < bld_files.size()) {
+                repo_states[i].cfile = bld_files[fcnt+i];
+                t.push_back(std::thread(process_bld_file, 
std::ref(repo_states[i])));
+                athreads++;
+            }
+        }
+        for (int i = 0; i < athreads; i++) {
+            t[i].join();
+        }
+        fcnt += athreads;
+    }
+
+    repo_state_t repo_state;
+
+    // Consolidate
+    for (unsigned int i = 0; i < hwc; i++) {
+       repo_state_t &rs = repo_states[i];
+       repo_state.ret += rs.ret;
+       repo_state.inc_cnt += rs.inc_cnt;
+       repo_state.src_cnt += rs.src_cnt;
+       repo_state.bld_cnt += rs.bld_cnt;
+    
+       repo_state.api_log.insert(repo_state.api_log.end(), rs.api_log.begin(), 
rs.api_log.end());
+       repo_state.bio_log.insert(repo_state.bio_log.end(), rs.bio_log.begin(), 
rs.bio_log.end());
+       repo_state.bnet_log.insert(repo_state.bnet_log.end(), 
rs.bnet_log.begin(), rs.bnet_log.end());
+       repo_state.common_log.insert(repo_state.common_log.end(), 
rs.common_log.begin(), rs.common_log.end());
+       repo_state.symbol_inc_log.insert(repo_state.symbol_inc_log.end(), 
rs.symbol_inc_log.begin(), rs.symbol_inc_log.end());
+       repo_state.symbol_src_log.insert(repo_state.symbol_src_log.end(), 
rs.symbol_src_log.begin(), rs.symbol_src_log.end());
+       repo_state.symbol_bld_log.insert(repo_state.symbol_bld_log.end(), 
rs.symbol_bld_log.begin(), rs.symbol_bld_log.end());
+    }
+
+    int psym_cnt = repo_state.inc_cnt + repo_state.src_cnt + 
repo_state.bld_cnt;
+    int expected_psym_cnt = EXPECTED_PLATFORM_SYMBOLS ;
     if (psym_cnt > expected_psym_cnt) {
        ret += 1;
     }

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.



_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to