Skip to content

Commit

Permalink
[gdb] Add unit test for gdb::sequential_for_each
Browse files Browse the repository at this point in the history
With commit 18a5766 ("[gdbsupport] Add sequential_for_each") I added a
drop-in replacement for gdb::parallel_for_each, but there's nothing making
sure that the two remain in sync.

Extend the unit test for gdb::parallel_for_each to test both.

Do this using a slightly unusual file-self-inclusion.  Doing so keep things
readable and maintainable, and avoids macrofying functions.

Tested on x86_64-linux.
  • Loading branch information
vries committed Aug 5, 2022
1 parent b069b58 commit 728d543
Showing 1 changed file with 74 additions and 43 deletions.
117 changes: 74 additions & 43 deletions gdb/unittests/parallel-for-selftests.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,13 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */

/* This file is divided in two parts:
- FOR_EACH-undefined, and
- FOR_EACH-defined.
The former includes the latter, more than once, with different values for
FOR_EACH. The FOR_EACH-defined part reads like a regular function. */
#ifndef FOR_EACH

#include "defs.h"
#include "gdbsupport/selftest.h"
#include "gdbsupport/parallel-for.h"
Expand All @@ -43,29 +50,74 @@ struct save_restore_n_threads
int n_threads;
};

/* Define test_par using TEST in the FOR_EACH-defined part. */
#define TEST test_par
#define FOR_EACH gdb::parallel_for_each
#include "parallel-for-selftests.c"
#undef FOR_EACH
#undef TEST

/* Define test_seq using TEST in the FOR_EACH-defined part. */
#define TEST test_seq
#define FOR_EACH gdb::sequential_for_each
#include "parallel-for-selftests.c"
#undef FOR_EACH
#undef TEST

static void
test (int n_threads)
{
test_par (n_threads);
test_seq (n_threads);
}

static void
test_n_threads ()
{
test (0);
test (1);
test (3);
}

}
}

#endif /* CXX_STD_THREAD */

void _initialize_parallel_for_selftests ();
void
_initialize_parallel_for_selftests ()
{
#ifdef CXX_STD_THREAD
selftests::register_test ("parallel_for",
selftests::parallel_for::test_n_threads);
#endif /* CXX_STD_THREAD */
}

#else /* FOR_EACH */

static void
TEST (int n_threads)
{
save_restore_n_threads saver;
gdb::thread_pool::g_thread_pool->set_thread_count (n_threads);

#define NUMBER 10000

std::atomic<int> counter (0);
gdb::parallel_for_each (1, 0, NUMBER,
[&] (int start, int end)
{
counter += end - start;
});

FOR_EACH (1, 0, NUMBER,
[&] (int start, int end)
{
counter += end - start;
});
SELF_CHECK (counter == NUMBER);

counter = 0;
gdb::parallel_for_each (1, 0, 0,
[&] (int start, int end)
{
counter += end - start;
});
FOR_EACH (1, 0, 0,
[&] (int start, int end)
{
counter += end - start;
});
SELF_CHECK (counter == 0);

auto task_size_max_ = [] (int iter)
Expand All @@ -75,11 +127,11 @@ test (int n_threads)
auto task_size_max = gdb::make_function_view (task_size_max_);

counter = 0;
gdb::parallel_for_each (1, 0, NUMBER,
[&] (int start, int end)
{
counter += end - start;
}, task_size_max);
FOR_EACH (1, 0, NUMBER,
[&] (int start, int end)
{
counter += end - start;
}, task_size_max);
SELF_CHECK (counter == NUMBER);

auto task_size_one_ = [] (int iter)
Expand All @@ -89,35 +141,14 @@ test (int n_threads)
auto task_size_one = gdb::make_function_view (task_size_one_);

counter = 0;
gdb::parallel_for_each (1, 0, NUMBER,
[&] (int start, int end)
{
counter += end - start;
}, task_size_one);
FOR_EACH (1, 0, NUMBER,
[&] (int start, int end)
{
counter += end - start;
}, task_size_one);
SELF_CHECK (counter == NUMBER);

#undef NUMBER
}

static void
test_n_threads ()
{
test (0);
test (1);
test (3);
}

}
}

#endif /* CXX_STD_THREAD */

void _initialize_parallel_for_selftests ();
void
_initialize_parallel_for_selftests ()
{
#ifdef CXX_STD_THREAD
selftests::register_test ("parallel_for",
selftests::parallel_for::test_n_threads);
#endif /* CXX_STD_THREAD */
}
#endif /* FOR_EACH */

0 comments on commit 728d543

Please sign in to comment.