Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit e800bd7

Browse files
committed
Report test_atomic_ops() failures consistently, via macros.
This prints the unexpected value in more failure cases, and it removes forty-eight hand-maintained error messages. Back-patch to 9.5, which introduced these tests. Reviewed (in an earlier version) by Andres Freund. Discussion: https://postgr.es/m/20190915160021.GA24376@alvherre.pgsql
1 parent d82f390 commit e800bd7

File tree

1 file changed

+81
-146
lines changed

1 file changed

+81
-146
lines changed

src/test/regress/regress.c

+81-146
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,34 @@
4141
#include "utils/memutils.h"
4242

4343

44+
#define EXPECT_TRUE(expr) \
45+
do { \
46+
if (!(expr)) \
47+
elog(ERROR, \
48+
"%s was unexpectedly false in file \"%s\" line %u", \
49+
#expr, __FILE__, __LINE__); \
50+
} while (0)
51+
52+
#define EXPECT_EQ_U32(result_expr, expected_expr) \
53+
do { \
54+
uint32 result = (result_expr); \
55+
uint32 expected = (expected_expr); \
56+
if (result != expected) \
57+
elog(ERROR, \
58+
"%s yielded %u, expected %s in file \"%s\" line %u", \
59+
#result_expr, result, #expected_expr, __FILE__, __LINE__); \
60+
} while (0)
61+
62+
#define EXPECT_EQ_U64(result_expr, expected_expr) \
63+
do { \
64+
uint64 result = (result_expr); \
65+
uint64 expected = (expected_expr); \
66+
if (result != expected) \
67+
elog(ERROR, \
68+
"%s yielded " UINT64_FORMAT ", expected %s in file \"%s\" line %u", \
69+
#result_expr, result, #expected_expr, __FILE__, __LINE__); \
70+
} while (0)
71+
4472
#define LDELIM '('
4573
#define RDELIM ')'
4674
#define DELIM ','
@@ -646,27 +674,13 @@ test_atomic_flag(void)
646674
pg_atomic_flag flag;
647675

648676
pg_atomic_init_flag(&flag);
649-
650-
if (!pg_atomic_unlocked_test_flag(&flag))
651-
elog(ERROR, "flag: unexpectedly set");
652-
653-
if (!pg_atomic_test_set_flag(&flag))
654-
elog(ERROR, "flag: couldn't set");
655-
656-
if (pg_atomic_unlocked_test_flag(&flag))
657-
elog(ERROR, "flag: unexpectedly unset");
658-
659-
if (pg_atomic_test_set_flag(&flag))
660-
elog(ERROR, "flag: set spuriously #2");
661-
677+
EXPECT_TRUE(pg_atomic_unlocked_test_flag(&flag));
678+
EXPECT_TRUE(pg_atomic_test_set_flag(&flag));
679+
EXPECT_TRUE(!pg_atomic_unlocked_test_flag(&flag));
680+
EXPECT_TRUE(!pg_atomic_test_set_flag(&flag));
662681
pg_atomic_clear_flag(&flag);
663-
664-
if (!pg_atomic_unlocked_test_flag(&flag))
665-
elog(ERROR, "flag: unexpectedly set #2");
666-
667-
if (!pg_atomic_test_set_flag(&flag))
668-
elog(ERROR, "flag: couldn't set");
669-
682+
EXPECT_TRUE(pg_atomic_unlocked_test_flag(&flag));
683+
EXPECT_TRUE(pg_atomic_test_set_flag(&flag));
670684
pg_atomic_clear_flag(&flag);
671685
}
672686

@@ -678,75 +692,38 @@ test_atomic_uint32(void)
678692
int i;
679693

680694
pg_atomic_init_u32(&var, 0);
681-
682-
if (pg_atomic_read_u32(&var) != 0)
683-
elog(ERROR, "atomic_read_u32() #1 wrong");
684-
695+
EXPECT_EQ_U32(pg_atomic_read_u32(&var), 0);
685696
pg_atomic_write_u32(&var, 3);
686-
687-
if (pg_atomic_read_u32(&var) != 3)
688-
elog(ERROR, "atomic_read_u32() #2 wrong");
689-
690-
if (pg_atomic_fetch_add_u32(&var, pg_atomic_read_u32(&var) - 2) != 3)
691-
elog(ERROR, "atomic_fetch_add_u32() #1 wrong");
692-
693-
if (pg_atomic_fetch_sub_u32(&var, 1) != 4)
694-
elog(ERROR, "atomic_fetch_sub_u32() #1 wrong");
695-
696-
if (pg_atomic_sub_fetch_u32(&var, 3) != 0)
697-
elog(ERROR, "atomic_sub_fetch_u32() #1 wrong");
698-
699-
if (pg_atomic_add_fetch_u32(&var, 10) != 10)
700-
elog(ERROR, "atomic_add_fetch_u32() #1 wrong");
701-
702-
if (pg_atomic_exchange_u32(&var, 5) != 10)
703-
elog(ERROR, "pg_atomic_exchange_u32() #1 wrong");
704-
705-
if (pg_atomic_exchange_u32(&var, 0) != 5)
706-
elog(ERROR, "pg_atomic_exchange_u32() #0 wrong");
697+
EXPECT_EQ_U32(pg_atomic_read_u32(&var), 3);
698+
EXPECT_EQ_U32(pg_atomic_fetch_add_u32(&var, pg_atomic_read_u32(&var) - 2),
699+
3);
700+
EXPECT_EQ_U32(pg_atomic_fetch_sub_u32(&var, 1), 4);
701+
EXPECT_EQ_U32(pg_atomic_sub_fetch_u32(&var, 3), 0);
702+
EXPECT_EQ_U32(pg_atomic_add_fetch_u32(&var, 10), 10);
703+
EXPECT_EQ_U32(pg_atomic_exchange_u32(&var, 5), 10);
704+
EXPECT_EQ_U32(pg_atomic_exchange_u32(&var, 0), 5);
707705

708706
/* test around numerical limits */
709-
if (pg_atomic_fetch_add_u32(&var, INT_MAX) != 0)
710-
elog(ERROR, "pg_atomic_fetch_add_u32() #2 wrong");
711-
712-
if (pg_atomic_fetch_add_u32(&var, INT_MAX) != INT_MAX)
713-
elog(ERROR, "pg_atomic_add_fetch_u32() #3 wrong");
714-
707+
EXPECT_EQ_U32(pg_atomic_fetch_add_u32(&var, INT_MAX), 0);
708+
EXPECT_EQ_U32(pg_atomic_fetch_add_u32(&var, INT_MAX), INT_MAX);
715709
pg_atomic_fetch_add_u32(&var, 2); /* wrap to 0 */
716-
717-
if (pg_atomic_fetch_add_u32(&var, PG_INT16_MAX) != 0)
718-
elog(ERROR, "pg_atomic_fetch_add_u32() #3 wrong");
719-
720-
if (pg_atomic_fetch_add_u32(&var, PG_INT16_MAX + 1) != PG_INT16_MAX)
721-
elog(ERROR, "pg_atomic_fetch_add_u32() #4 wrong");
722-
723-
if (pg_atomic_fetch_add_u32(&var, PG_INT16_MIN) != 2 * PG_INT16_MAX + 1)
724-
elog(ERROR, "pg_atomic_fetch_add_u32() #5 wrong");
725-
726-
if (pg_atomic_fetch_add_u32(&var, PG_INT16_MIN - 1) != PG_INT16_MAX)
727-
elog(ERROR, "pg_atomic_fetch_add_u32() #6 wrong");
728-
710+
EXPECT_EQ_U32(pg_atomic_fetch_add_u32(&var, PG_INT16_MAX), 0);
711+
EXPECT_EQ_U32(pg_atomic_fetch_add_u32(&var, PG_INT16_MAX + 1),
712+
PG_INT16_MAX);
713+
EXPECT_EQ_U32(pg_atomic_fetch_add_u32(&var, PG_INT16_MIN),
714+
2 * PG_INT16_MAX + 1);
715+
EXPECT_EQ_U32(pg_atomic_fetch_add_u32(&var, PG_INT16_MIN - 1),
716+
PG_INT16_MAX);
729717
pg_atomic_fetch_add_u32(&var, 1); /* top up to UINT_MAX */
730-
731-
if (pg_atomic_read_u32(&var) != UINT_MAX)
732-
elog(ERROR, "atomic_read_u32() #2 wrong");
733-
734-
if (pg_atomic_fetch_sub_u32(&var, INT_MAX) != UINT_MAX)
735-
elog(ERROR, "pg_atomic_fetch_sub_u32() #2 wrong");
736-
737-
if (pg_atomic_read_u32(&var) != (uint32) INT_MAX + 1)
738-
elog(ERROR, "atomic_read_u32() #3 wrong: %u", pg_atomic_read_u32(&var));
739-
740-
expected = pg_atomic_sub_fetch_u32(&var, INT_MAX);
741-
if (expected != 1)
742-
elog(ERROR, "pg_atomic_sub_fetch_u32() #3 wrong: %u", expected);
743-
718+
EXPECT_EQ_U32(pg_atomic_read_u32(&var), UINT_MAX);
719+
EXPECT_EQ_U32(pg_atomic_fetch_sub_u32(&var, INT_MAX), UINT_MAX);
720+
EXPECT_EQ_U32(pg_atomic_read_u32(&var), (uint32) INT_MAX + 1);
721+
EXPECT_EQ_U32(pg_atomic_sub_fetch_u32(&var, INT_MAX), 1);
744722
pg_atomic_sub_fetch_u32(&var, 1);
745723

746724
/* fail exchange because of old expected */
747725
expected = 10;
748-
if (pg_atomic_compare_exchange_u32(&var, &expected, 1))
749-
elog(ERROR, "atomic_compare_exchange_u32() changed value spuriously");
726+
EXPECT_TRUE(!pg_atomic_compare_exchange_u32(&var, &expected, 1));
750727

751728
/* CAS is allowed to fail due to interrupts, try a couple of times */
752729
for (i = 0; i < 1000; i++)
@@ -757,31 +734,18 @@ test_atomic_uint32(void)
757734
}
758735
if (i == 1000)
759736
elog(ERROR, "atomic_compare_exchange_u32() never succeeded");
760-
if (pg_atomic_read_u32(&var) != 1)
761-
elog(ERROR, "atomic_compare_exchange_u32() didn't set value properly");
762-
737+
EXPECT_EQ_U32(pg_atomic_read_u32(&var), 1);
763738
pg_atomic_write_u32(&var, 0);
764739

765740
/* try setting flagbits */
766-
if (pg_atomic_fetch_or_u32(&var, 1) & 1)
767-
elog(ERROR, "pg_atomic_fetch_or_u32() #1 wrong");
768-
769-
if (!(pg_atomic_fetch_or_u32(&var, 2) & 1))
770-
elog(ERROR, "pg_atomic_fetch_or_u32() #2 wrong");
771-
772-
if (pg_atomic_read_u32(&var) != 3)
773-
elog(ERROR, "invalid result after pg_atomic_fetch_or_u32()");
774-
741+
EXPECT_TRUE(!(pg_atomic_fetch_or_u32(&var, 1) & 1));
742+
EXPECT_TRUE(pg_atomic_fetch_or_u32(&var, 2) & 1);
743+
EXPECT_EQ_U32(pg_atomic_read_u32(&var), 3);
775744
/* try clearing flagbits */
776-
if ((pg_atomic_fetch_and_u32(&var, ~2) & 3) != 3)
777-
elog(ERROR, "pg_atomic_fetch_and_u32() #1 wrong");
778-
779-
if (pg_atomic_fetch_and_u32(&var, ~1) != 1)
780-
elog(ERROR, "pg_atomic_fetch_and_u32() #2 wrong: is %u",
781-
pg_atomic_read_u32(&var));
745+
EXPECT_EQ_U32(pg_atomic_fetch_and_u32(&var, ~2) & 3, 3);
746+
EXPECT_EQ_U32(pg_atomic_fetch_and_u32(&var, ~1), 1);
782747
/* no bits set anymore */
783-
if (pg_atomic_fetch_and_u32(&var, ~0) != 0)
784-
elog(ERROR, "pg_atomic_fetch_and_u32() #3 wrong");
748+
EXPECT_EQ_U32(pg_atomic_fetch_and_u32(&var, ~0), 0);
785749
}
786750

787751
static void
@@ -792,37 +756,20 @@ test_atomic_uint64(void)
792756
int i;
793757

794758
pg_atomic_init_u64(&var, 0);
795-
796-
if (pg_atomic_read_u64(&var) != 0)
797-
elog(ERROR, "atomic_read_u64() #1 wrong");
798-
759+
EXPECT_EQ_U64(pg_atomic_read_u64(&var), 0);
799760
pg_atomic_write_u64(&var, 3);
800-
801-
if (pg_atomic_read_u64(&var) != 3)
802-
elog(ERROR, "atomic_read_u64() #2 wrong");
803-
804-
if (pg_atomic_fetch_add_u64(&var, pg_atomic_read_u64(&var) - 2) != 3)
805-
elog(ERROR, "atomic_fetch_add_u64() #1 wrong");
806-
807-
if (pg_atomic_fetch_sub_u64(&var, 1) != 4)
808-
elog(ERROR, "atomic_fetch_sub_u64() #1 wrong");
809-
810-
if (pg_atomic_sub_fetch_u64(&var, 3) != 0)
811-
elog(ERROR, "atomic_sub_fetch_u64() #1 wrong");
812-
813-
if (pg_atomic_add_fetch_u64(&var, 10) != 10)
814-
elog(ERROR, "atomic_add_fetch_u64() #1 wrong");
815-
816-
if (pg_atomic_exchange_u64(&var, 5) != 10)
817-
elog(ERROR, "pg_atomic_exchange_u64() #1 wrong");
818-
819-
if (pg_atomic_exchange_u64(&var, 0) != 5)
820-
elog(ERROR, "pg_atomic_exchange_u64() #0 wrong");
761+
EXPECT_EQ_U64(pg_atomic_read_u64(&var), 3);
762+
EXPECT_EQ_U64(pg_atomic_fetch_add_u64(&var, pg_atomic_read_u64(&var) - 2),
763+
3);
764+
EXPECT_EQ_U64(pg_atomic_fetch_sub_u64(&var, 1), 4);
765+
EXPECT_EQ_U64(pg_atomic_sub_fetch_u64(&var, 3), 0);
766+
EXPECT_EQ_U64(pg_atomic_add_fetch_u64(&var, 10), 10);
767+
EXPECT_EQ_U64(pg_atomic_exchange_u64(&var, 5), 10);
768+
EXPECT_EQ_U64(pg_atomic_exchange_u64(&var, 0), 5);
821769

822770
/* fail exchange because of old expected */
823771
expected = 10;
824-
if (pg_atomic_compare_exchange_u64(&var, &expected, 1))
825-
elog(ERROR, "atomic_compare_exchange_u64() changed value spuriously");
772+
EXPECT_TRUE(!pg_atomic_compare_exchange_u64(&var, &expected, 1));
826773

827774
/* CAS is allowed to fail due to interrupts, try a couple of times */
828775
for (i = 0; i < 100; i++)
@@ -833,31 +780,19 @@ test_atomic_uint64(void)
833780
}
834781
if (i == 100)
835782
elog(ERROR, "atomic_compare_exchange_u64() never succeeded");
836-
if (pg_atomic_read_u64(&var) != 1)
837-
elog(ERROR, "atomic_compare_exchange_u64() didn't set value properly");
783+
EXPECT_EQ_U64(pg_atomic_read_u64(&var), 1);
838784

839785
pg_atomic_write_u64(&var, 0);
840786

841787
/* try setting flagbits */
842-
if (pg_atomic_fetch_or_u64(&var, 1) & 1)
843-
elog(ERROR, "pg_atomic_fetch_or_u64() #1 wrong");
844-
845-
if (!(pg_atomic_fetch_or_u64(&var, 2) & 1))
846-
elog(ERROR, "pg_atomic_fetch_or_u64() #2 wrong");
847-
848-
if (pg_atomic_read_u64(&var) != 3)
849-
elog(ERROR, "invalid result after pg_atomic_fetch_or_u64()");
850-
788+
EXPECT_TRUE(!(pg_atomic_fetch_or_u64(&var, 1) & 1));
789+
EXPECT_TRUE(pg_atomic_fetch_or_u64(&var, 2) & 1);
790+
EXPECT_EQ_U64(pg_atomic_read_u64(&var), 3);
851791
/* try clearing flagbits */
852-
if ((pg_atomic_fetch_and_u64(&var, ~2) & 3) != 3)
853-
elog(ERROR, "pg_atomic_fetch_and_u64() #1 wrong");
854-
855-
if (pg_atomic_fetch_and_u64(&var, ~1) != 1)
856-
elog(ERROR, "pg_atomic_fetch_and_u64() #2 wrong: is " UINT64_FORMAT,
857-
pg_atomic_read_u64(&var));
792+
EXPECT_EQ_U64((pg_atomic_fetch_and_u64(&var, ~2) & 3), 3);
793+
EXPECT_EQ_U64(pg_atomic_fetch_and_u64(&var, ~1), 1);
858794
/* no bits set anymore */
859-
if (pg_atomic_fetch_and_u64(&var, ~0) != 0)
860-
elog(ERROR, "pg_atomic_fetch_and_u64() #3 wrong");
795+
EXPECT_EQ_U64(pg_atomic_fetch_and_u64(&var, ~0), 0);
861796
}
862797

863798

0 commit comments

Comments
 (0)