diff --git a/contrib/test_jenkins.sh b/contrib/test_jenkins.sh index 824cc83907b..7bfac419a38 100755 --- a/contrib/test_jenkins.sh +++ b/contrib/test_jenkins.sh @@ -712,9 +712,12 @@ run_coverity() { # # Run the test suite (gtest) +# Arguments: [configure-flags] # run_gtest() { - ../contrib/configure-devel --prefix=$ucx_inst + compiler_name=$1 + shift + ../contrib/configure-devel --prefix=$ucx_inst $@ $MAKE clean $MAKE @@ -739,11 +742,11 @@ run_gtest() { mkdir -p $GTEST_REPORT_DIR - echo "==== Running unit tests ====" + echo "==== Running unit tests, $compiler_name compiler ====" $AFFINITY $TIMEOUT make -C test/gtest test (cd test/gtest && rename .tap _gtest.tap *.tap && mv *.tap $GTEST_REPORT_DIR) - echo "==== Running malloc hooks mallopt() test ====" + echo "==== Running malloc hooks mallopt() test, $compiler_name compiler ====" # gtest returns with non zero exit code if there were no # tests to run. As a workaround run a single test on every # shard. @@ -757,7 +760,7 @@ run_gtest() { make -C test/gtest test (cd test/gtest && rename .tap _mallopt_gtest.tap malloc_hook_cplusplus.tap && mv *.tap $GTEST_REPORT_DIR) - echo "==== Running malloc hooks mmap_ptrs test with MMAP_THRESHOLD=16384 ====" + echo "==== Running malloc hooks mmap_ptrs test with MMAP_THRESHOLD=16384, $compiler_name compiler ====" $AFFINITY $TIMEOUT \ env MALLOC_MMAP_THRESHOLD_=16384 \ GTEST_SHARD_INDEX=0 \ @@ -768,7 +771,7 @@ run_gtest() { if ! [[ $(uname -m) =~ "aarch" ]] && ! [[ $(uname -m) =~ "ppc" ]] then - echo "==== Running valgrind tests ====" + echo "==== Running valgrind tests, $compiler_name compiler ====" # Load newer valgrind if naative is older than 3.10 if ! (echo "valgrind-3.10.0"; valgrind --version) | sort -CV @@ -782,12 +785,29 @@ run_gtest() { (cd test/gtest && rename .tap _vg.tap *.tap && mv *.tap $GTEST_REPORT_DIR) module unload tools/valgrind-latest else - echo "==== Not running valgrind tests ====" + echo "==== Not running valgrind tests with $compiler_name compiler ====" echo "1..1" > vg_skipped.tap echo "ok 1 - # SKIP because running on $(uname -m)" >> vg_skipped.tap fi } +run_gtest_default() { + run_gtest "default" +} + +run_gtest_armclang() { + if module_load arm-compiler/arm-hpc-compiler && armclang -v + then + run_gtest "armclang" CC=armclang CXX=armclang++ + else + echo "==== Not running with armclang compiler ====" + echo "1..1" > armclang_skipped.tap + echo "ok 1 - # SKIP because armclang not found" >> armclang_skipped.tap + fi + module unload arm-compiler/arm-hpc-compiler +} + + # # Run the test suite (gtest) in release configuration # @@ -857,7 +877,8 @@ run_tests() { do_distributed_task 0 4 test_unused_env_var # all are running gtest - run_gtest + run_gtest_default + run_gtest_armclang do_distributed_task 3 4 run_coverity do_distributed_task 0 4 run_gtest_release diff --git a/src/ucs/datastruct/queue.h b/src/ucs/datastruct/queue.h index 7a9402f3636..5c1860d708a 100644 --- a/src/ucs/datastruct/queue.h +++ b/src/ucs/datastruct/queue.h @@ -196,7 +196,7 @@ static inline void ucs_queue_splice(ucs_queue_head_t *queue, #define ucs_queue_for_each(elem, queue, member) \ for (*(queue)->ptail = NULL, \ elem = ucs_container_of((queue)->head, typeof(*elem), member); \ - &elem->member != NULL; \ + (elem) != ucs_container_of(NULL, typeof(*elem), member); \ elem = ucs_container_of(elem->member.next, typeof(*elem), member)) /** diff --git a/test/gtest/ucs/test_datatype.cc b/test/gtest/ucs/test_datatype.cc index 5e4dd803fa5..2b1652e572d 100644 --- a/test/gtest/ucs/test_datatype.cc +++ b/test/gtest/ucs/test_datatype.cc @@ -147,27 +147,17 @@ UCS_TEST_F(test_datatype, queue) { UCS_TEST_F(test_datatype, queue_iter) { + const int num_elems = 4; ucs_queue_head_t head; - elem_t *elem1, *elem2, *elem3, *elem4; + std::vector elems(num_elems); ucs_queue_head_init(&head); EXPECT_TRUE(ucs_queue_is_empty(&head)); - elem1 = (elem_t*)malloc(sizeof(elem_t)); - elem2 = (elem_t*)malloc(sizeof(elem_t)); - elem3 = (elem_t*)malloc(sizeof(elem_t)); - elem4 = (elem_t*)malloc(sizeof(elem_t)); - - elem1->i = 1; - elem2->i = 2; - elem3->i = 3; - elem4->i = 4; - - ucs_queue_push(&head, &elem1->queue); - ucs_queue_push(&head, &elem2->queue); - ucs_queue_push(&head, &elem3->queue); - ucs_queue_push(&head, &elem4->queue); - + for (int i = 0; i < num_elems; ++i) { + elems[i].i = i + 1; + ucs_queue_push(&head, &elems[i].queue); + } { std::vector vec; @@ -176,7 +166,7 @@ UCS_TEST_F(test_datatype, queue_iter) { ucs_queue_for_each(elem, &head, queue) { vec.push_back(elem->i); } - ASSERT_EQ(4u, vec.size()); + ASSERT_EQ(static_cast(num_elems), vec.size()); EXPECT_EQ(1, vec[0]); EXPECT_EQ(2, vec[1]); EXPECT_EQ(3, vec[2]); @@ -192,7 +182,7 @@ UCS_TEST_F(test_datatype, queue_iter) { { if (elem->i == 3 || elem->i == 4) { ucs_queue_del_iter(&head, iter); - free(elem); + memset(elem, 0xff, sizeof(*elem)); } } ASSERT_EQ((unsigned long)2, ucs_queue_length(&head)); @@ -200,7 +190,7 @@ UCS_TEST_F(test_datatype, queue_iter) { ucs_queue_for_each_safe(elem, iter, &head, queue) { vec.push_back(elem->i); ucs_queue_del_iter(&head, iter); - free(elem); + memset(elem, 0xff, sizeof(*elem)); } ASSERT_EQ(2u, vec.size()); EXPECT_EQ(1, vec[0]);