}
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) {
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);
}
}
data->userData);
}
}
- delete data;
- }, fnDataAr[i]);
+ }, &fnDataAr[i]);
}
threadPool->easyStartAndWait();
}
}
}
} 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) {
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) {
fn(i, data->manager, data->userData);
}
}
- delete data;
- }, fnDataAr[i]);
+ }, &fnDataAr[i]);
}
threadPool->easyStartAndWait();
}
fnQueue.emplace(std::make_tuple(fn, ud));
}
- void startThreads() {
+ Internal::PointersT startThreads() {
if (MAXSIZE >= 2) {
checkStacks();
auto pointers = newStackEntry();
while (aCounter->load() != MAXSIZE) {
std::this_thread::sleep_for(std::chrono::microseconds(15));
}
+ return pointers;
} else {
sequentiallyRunTasks();
}
+ return {nullptr, nullptr, nullptr};
}
/*!
void easyStartAndWait() {
if (MAXSIZE >= 2) {
- startThreads();
+ Internal::PointersT pointers = startThreads();
do {
std::this_thread::sleep_for(std::chrono::microseconds(30));
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();
}