Skip to content

Commit

Permalink
Merge pull request #804 from flowln/improve_big_concurrent_task_test
Browse files Browse the repository at this point in the history
  • Loading branch information
flowln authored and Scrumplex committed Feb 3, 2023
1 parent 68c884f commit a7ff743
Showing 1 changed file with 23 additions and 9 deletions.
32 changes: 23 additions & 9 deletions tests/Task_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
#include <tasks/SequentialTask.h>
#include <tasks/Task.h>

#include <array>

/* Does nothing. Only used for testing. */
class BasicTask : public Task {
Q_OBJECT
Expand Down Expand Up @@ -35,10 +37,23 @@ class BasicTask_MultiStep : public Task {
void executeTask() override {};
};

class BigConcurrentTask : public QThread {
class BigConcurrentTask : public ConcurrentTask {
Q_OBJECT

void startNext() override
{
// This is here only to help fill the stack a bit more quickly (if there's an issue, of course :^))
// Each tasks thus adds 1024 * 4 bytes to the stack, at the very least.
[[maybe_unused]] volatile std::array<uint32_t, 1024> some_data_on_the_stack {};

ConcurrentTask::startNext();
}
};

class BigConcurrentTaskThread : public QThread {
Q_OBJECT

ConcurrentTask big_task;
BigConcurrentTask big_task;

void run() override
{
Expand All @@ -48,8 +63,10 @@ class BigConcurrentTask : public QThread {
deadline.start();

// NOTE: Arbitrary value that manages to trigger a problem when there is one.
static const unsigned s_num_tasks = 1 << 14;
auto sub_tasks = new BasicTask*[s_num_tasks];
// Considering each tasks, in a problematic state, adds 1024 * 4 bytes to the stack,
// this number is enough to fill up 16 MiB of stack, more than enough to cause a problem.
static const unsigned s_num_tasks = 1 << 12;
auto sub_tasks = new BasicTask::Ptr[s_num_tasks];

for (unsigned i = 0; i < s_num_tasks; i++) {
sub_tasks[i] = new BasicTask(false);
Expand Down Expand Up @@ -229,12 +246,9 @@ class TaskTest : public QObject {
{
QEventLoop loop;

auto thread = new BigConcurrentTask;
// NOTE: This is an arbitrary value, big enough to not cause problems on normal execution, but low enough
// so that the number of tasks that needs to get ran to potentially cause a problem isn't too big.
thread->setStackSize(32 * 1024);
auto thread = new BigConcurrentTaskThread;

connect(thread, &BigConcurrentTask::finished, &loop, &QEventLoop::quit);
connect(thread, &BigConcurrentTaskThread::finished, &loop, &QEventLoop::quit);

thread->start();

Expand Down

0 comments on commit a7ff743

Please sign in to comment.