aboutsummaryrefslogtreecommitdiff
path: root/src/ringct/rctSigs.cpp
diff options
context:
space:
mode:
authormoneromooo-monero <moneromooo-monero@users.noreply.github.com>2020-08-12 22:13:29 +0000
committermoneromooo-monero <moneromooo-monero@users.noreply.github.com>2020-09-01 14:33:33 +0000
commit6a37da837e1c936200f8d71a142973cc60b17b32 (patch)
tree922c9eff10660a49a16249781b05e5b8e1b5fc97 /src/ringct/rctSigs.cpp
parentMerge pull request #6586 (diff)
downloadmonero-6a37da837e1c936200f8d71a142973cc60b17b32.tar.xz
threadpool: guard against exceptions in jobs, and armour plating
Those would, if uncaught, exit run and leave the waiter to wait indefinitely for the number of active jobs to reach 0
Diffstat (limited to 'src/ringct/rctSigs.cpp')
-rw-r--r--src/ringct/rctSigs.cpp15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/ringct/rctSigs.cpp b/src/ringct/rctSigs.cpp
index 2e3e7007e..5948cadc5 100644
--- a/src/ringct/rctSigs.cpp
+++ b/src/ringct/rctSigs.cpp
@@ -937,12 +937,13 @@ namespace rct {
{
if (semantics) {
tools::threadpool& tpool = tools::threadpool::getInstance();
- tools::threadpool::waiter waiter;
+ tools::threadpool::waiter waiter(tpool);
std::deque<bool> results(rv.outPk.size(), false);
DP("range proofs verified?");
for (size_t i = 0; i < rv.outPk.size(); i++)
tpool.submit(&waiter, [&, i] { results[i] = verRange(rv.outPk[i].mask, rv.p.rangeSigs[i]); });
- waiter.wait(&tpool);
+ if (!waiter.wait())
+ return false;
for (size_t i = 0; i < results.size(); ++i) {
if (!results[i]) {
@@ -986,7 +987,7 @@ namespace rct {
PERF_TIMER(verRctSemanticsSimple);
tools::threadpool& tpool = tools::threadpool::getInstance();
- tools::threadpool::waiter waiter;
+ tools::threadpool::waiter waiter(tpool);
std::deque<bool> results;
std::vector<const Bulletproof*> proofs;
size_t max_non_bp_proofs = 0, offset = 0;
@@ -1060,7 +1061,8 @@ namespace rct {
return false;
}
- waiter.wait(&tpool);
+ if (!waiter.wait())
+ return false;
for (size_t i = 0; i < results.size(); ++i) {
if (!results[i]) {
LOG_PRINT_L1("Range proof verified failed for proof " << i);
@@ -1108,7 +1110,7 @@ namespace rct {
std::deque<bool> results(threads);
tools::threadpool& tpool = tools::threadpool::getInstance();
- tools::threadpool::waiter waiter;
+ tools::threadpool::waiter waiter(tpool);
const keyV &pseudoOuts = bulletproof ? rv.p.pseudoOuts : rv.pseudoOuts;
@@ -1121,7 +1123,8 @@ namespace rct {
results[i] = verRctMGSimple(message, rv.p.MGs[i], rv.mixRing[i], pseudoOuts[i]);
});
}
- waiter.wait(&tpool);
+ if (!waiter.wait())
+ return false;
for (size_t i = 0; i < results.size(); ++i) {
if (!results[i]) {