blob: c9e5992bc789ac84361dcc4354458880aa0586c0 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
// Copyright (C) 2024 Jarek Kobus
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "barrier.h"
QT_BEGIN_NAMESPACE
namespace Tasking {
// That's cut down qtcassert.{c,h} to avoid the dependency.
#define QT_STRING(cond) qDebug("SOFT ASSERT: \"%s\" in %s: %s", cond, __FILE__, QT_STRINGIFY(__LINE__))
#define QT_ASSERT(cond, action) if (Q_LIKELY(cond)) {} else { QT_STRING(#cond); action; } do {} while (0)
void Barrier::setLimit(int value)
{
QT_ASSERT(!isRunning(), return);
QT_ASSERT(value > 0, return);
m_limit = value;
}
void Barrier::start()
{
QT_ASSERT(!isRunning(), return);
m_current = 0;
m_result.reset();
}
void Barrier::advance()
{
// Calling advance on finished is OK
QT_ASSERT(isRunning() || m_result, return);
if (!isRunning()) // no-op
return;
++m_current;
if (m_current == m_limit)
stopWithResult(DoneResult::Success);
}
void Barrier::stopWithResult(DoneResult result)
{
// Calling stopWithResult on finished is OK when the same success is passed
QT_ASSERT(isRunning() || (m_result && *m_result == result), return);
if (!isRunning()) // no-op
return;
m_current = -1;
m_result = result;
emit done(result);
}
} // namespace Tasking
QT_END_NAMESPACE
|