]> git.seodisparate.com - EntityComponentMetaSystem/commitdiff
Fix ThreadPool::easyStartAndWait()
authorStephen Seo <seo.disparate@gmail.com>
Thu, 16 Jun 2022 03:20:02 +0000 (12:20 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Thu, 16 Jun 2022 03:20:02 +0000 (12:20 +0900)
Previously, the "waiting" part wasn't implemented.

src/EC/Manager.hpp
src/EC/ThreadPool.hpp

index ad8d382b077f221561fa7bb106f762e69b886043..11c913413f0e97876c624962587fe523c39996ed 100644 (file)
@@ -801,7 +801,7 @@ namespace EC
             }
             else
             {
-                std::array<TPFnDataStructZero*, ThreadCount * 2> fnDataAr;
+                std::array<TPFnDataStructZero, ThreadCount * 2> fnDataAr;
 
                 std::size_t s = currentSize / (ThreadCount * 2);
                 for(std::size_t i = 0; i < ThreadCount * 2; ++i) {
@@ -815,15 +815,14 @@ namespace EC
                     if(begin == end) {
                         continue;
                     }
-                    fnDataAr[i] = new TPFnDataStructZero{};
-                    fnDataAr[i]->range = {begin, end};
-                    fnDataAr[i]->manager = this;
-                    fnDataAr[i]->entities = &entities;
-                    fnDataAr[i]->signature = signatureBitset;
-                    fnDataAr[i]->userData = userData;
+                    fnDataAr[i].range = {begin, end};
+                    fnDataAr[i].manager = this;
+                    fnDataAr[i].entities = &entities;
+                    fnDataAr[i].signature = signatureBitset;
+                    fnDataAr[i].userData = userData;
                     for(std::size_t j = begin; j < end; ++j) {
                         if(!isAlive(j)) {
-                            fnDataAr[i]->dead.insert(j);
+                            fnDataAr[i].dead.insert(j);
                         }
                     }
 
@@ -845,8 +844,7 @@ namespace EC
                                              data->userData);
                             }
                         }
-                        delete data;
-                    }, fnDataAr[i]);
+                    }, &fnDataAr[i]);
                 }
                 threadPool->easyStartAndWait();
             }
@@ -1991,7 +1989,7 @@ namespace EC
                     }
                 }
             } else {
-                std::array<TPFnDataStructZero*, ThreadCount * 2> fnDataAr;
+                std::array<TPFnDataStructZero, ThreadCount * 2> fnDataAr;
 
                 std::size_t s = currentSize / (ThreadCount * 2);
                 for(std::size_t i = 0; i < ThreadCount * 2; ++i) {
@@ -2005,15 +2003,14 @@ namespace EC
                     if(begin == end) {
                         continue;
                     }
-                    fnDataAr[i] = new TPFnDataStructZero{};
-                    fnDataAr[i]->range = {begin, end};
-                    fnDataAr[i]->manager = this;
-                    fnDataAr[i]->entities = &entities;
-                    fnDataAr[i]->signature = signatureBitset;
-                    fnDataAr[i]->userData = userData;
+                    fnDataAr[i].range = {begin, end};
+                    fnDataAr[i].manager = this;
+                    fnDataAr[i].entities = &entities;
+                    fnDataAr[i].signature = signatureBitset;
+                    fnDataAr[i].userData = userData;
                     for(std::size_t j = begin; j < end; ++j) {
                         if(!isAlive(j)) {
-                            fnDataAr[i]->dead.insert(j);
+                            fnDataAr[i].dead.insert(j);
                         }
                     }
                     threadPool->queueFn([&fn] (void *ud) {
@@ -2029,8 +2026,7 @@ namespace EC
                                 fn(i, data->manager, data->userData);
                             }
                         }
-                        delete data;
-                    }, fnDataAr[i]);
+                    }, &fnDataAr[i]);
                 }
                 threadPool->easyStartAndWait();
             }
index 74f16da7215d1b56075d0e60b8a3bf780e123b36..003a61712a3f2cf1c7e183710c0bc14aa5876ad9 100644 (file)
@@ -62,7 +62,7 @@ class ThreadPool {
         fnQueue.emplace(std::make_tuple(fn, ud));
     }
 
-    void startThreads() {
+    Internal::PointersT startThreads() {
         if (MAXSIZE >= 2) {
             checkStacks();
             auto pointers = newStackEntry();
@@ -143,9 +143,11 @@ class ThreadPool {
             while (aCounter->load() != MAXSIZE) {
                 std::this_thread::sleep_for(std::chrono::microseconds(15));
             }
+            return pointers;
         } else {
             sequentiallyRunTasks();
         }
+        return {nullptr, nullptr, nullptr};
     }
 
     /*!
@@ -163,7 +165,7 @@ class ThreadPool {
 
     void easyStartAndWait() {
         if (MAXSIZE >= 2) {
-            startThreads();
+            Internal::PointersT pointers = startThreads();
             do {
                 std::this_thread::sleep_for(std::chrono::microseconds(30));
 
@@ -177,6 +179,17 @@ class ThreadPool {
                     break;
                 }
             } while (true);
+            if (std::get<0>(pointers)) {
+                do {
+                    {
+                        std::lock_guard<std::mutex> lock(*std::get<1>(pointers));
+                        if (std::get<0>(pointers)->empty()) {
+                            break;
+                        }
+                    }
+                    std::this_thread::sleep_for(std::chrono::microseconds(15));
+                } while (true);
+            }
         } else {
             sequentiallyRunTasks();
         }