diff --git a/glib/tests/atomic.c b/glib/tests/atomic.c index 771e85346..52d429c4e 100644 --- a/glib/tests/atomic.c +++ b/glib/tests/atomic.c @@ -3,37 +3,187 @@ int main (void) { - guint u; - gint s; - gpointer vp; - int *ip; - gsize gs; + guint u, u2; + gint s, s2; + gpointer vp, vp2; + int *ip, *ip2; + gsize gs, gs2; + gboolean res; g_atomic_int_set (&u, 5); - g_atomic_int_get (&u); - g_atomic_int_compare_and_exchange (&u, 6, 7); + u2 = g_atomic_int_get (&u); + g_assert_cmpint (u2, ==, 5); + res = g_atomic_int_compare_and_exchange (&u, 6, 7); + g_assert (!res); + g_assert_cmpint (u, ==, 5); g_atomic_int_add (&u, 1); + g_assert_cmpint (u, ==, 6); g_atomic_int_inc (&u); - (void) g_atomic_int_dec_and_test (&u); + g_assert_cmpint (u, ==, 7); + res = g_atomic_int_dec_and_test (&u); + g_assert (!res); + g_assert_cmpint (u, ==, 6); + u2 = g_atomic_int_and (&u, 5); + g_assert_cmpint (u2, ==, 6); + g_assert_cmpint (u, ==, 4); + u2 = g_atomic_int_or (&u, 8); + g_assert_cmpint (u2, ==, 4); + g_assert_cmpint (u, ==, 12); + u2 = g_atomic_int_xor (&u, 4); + g_assert_cmpint (u2, ==, 12); + g_assert_cmpint (u, ==, 8); g_atomic_int_set (&s, 5); - g_atomic_int_get (&s); - g_atomic_int_compare_and_exchange (&s, 6, 7); + s2 = g_atomic_int_get (&s); + g_assert_cmpint (s2, ==, 5); + res = g_atomic_int_compare_and_exchange (&s, 6, 7); + g_assert (!res); + g_assert_cmpint (s, ==, 5); g_atomic_int_add (&s, 1); + g_assert_cmpint (s, ==, 6); g_atomic_int_inc (&s); - (void) g_atomic_int_dec_and_test (&s); + g_assert_cmpint (s, ==, 7); + res = g_atomic_int_dec_and_test (&s); + g_assert (!res); + g_assert_cmpint (s, ==, 6); + s2 = g_atomic_int_and (&s, 5); + g_assert_cmpint (s2, ==, 6); + g_assert_cmpint (s, ==, 4); + s2 = g_atomic_int_or (&s, 8); + g_assert_cmpint (s2, ==, 4); + g_assert_cmpint (s, ==, 12); + s2 = g_atomic_int_xor (&s, 4); + g_assert_cmpint (s2, ==, 12); + g_assert_cmpint (s, ==, 8); g_atomic_pointer_set (&vp, 0); - g_atomic_pointer_get (&vp); - g_atomic_pointer_compare_and_exchange (&vp, 0, 0); + vp2 = g_atomic_pointer_get (&vp); + g_assert (vp2 == 0); + res = g_atomic_pointer_compare_and_exchange (&vp, 0, 0); + g_assert (res); + g_assert (vp == 0); g_atomic_pointer_set (&ip, 0); - g_atomic_pointer_get (&ip); - g_atomic_pointer_compare_and_exchange (&ip, 0, 0); + ip2 = g_atomic_pointer_get (&ip); + g_assert (ip2 == 0); + res = g_atomic_pointer_compare_and_exchange (&ip, 0, 0); + g_assert (res); + g_assert (ip == 0); g_atomic_pointer_set (&gs, 0); - g_atomic_pointer_get (&gs); - g_atomic_pointer_compare_and_exchange (&gs, 0, 0); + gs2 = (gsize) g_atomic_pointer_get (&gs); + g_assert (gs2 == 0); + res = g_atomic_pointer_compare_and_exchange (&gs, 0, 0); + g_assert (res); + g_assert (gs == 0); + gs2 = g_atomic_pointer_add (&gs, 5); + g_assert (gs2 == 0); + g_assert (gs == 5); + gs2 = g_atomic_pointer_and (&gs, 6); + g_assert (gs2 == 5); + g_assert (gs == 4); + gs2 = g_atomic_pointer_or (&gs, 8); + g_assert (gs2 == 4); + g_assert (gs == 12); + gs2 = g_atomic_pointer_xor (&gs, 4); + g_assert (gs2 == 12); + g_assert (gs == 8); + + /* repeat, without the macros */ +#undef g_atomic_int_set +#undef g_atomic_int_get +#undef g_atomic_int_compare_and_exchange +#undef g_atomic_int_add +#undef g_atomic_int_inc +#undef g_atomic_int_and +#undef g_atomic_int_or +#undef g_atomic_int_xor +#undef g_atomic_int_dec_and_test +#undef g_atomic_pointer_set +#undef g_atomic_pointer_get +#undef g_atomic_pointer_compare_and_exchange +#undef g_atomic_pointer_add +#undef g_atomic_pointer_and +#undef g_atomic_pointer_or +#undef g_atomic_pointer_xor + + g_atomic_int_set ((gint*)&u, 5); + u2 = g_atomic_int_get ((gint*)&u); + g_assert_cmpint (u2, ==, 5); + res = g_atomic_int_compare_and_exchange ((gint*)&u, 6, 7); + g_assert (!res); + g_assert_cmpint (u, ==, 5); + g_atomic_int_add ((gint*)&u, 1); + g_assert_cmpint (u, ==, 6); + g_atomic_int_inc ((gint*)&u); + g_assert_cmpint (u, ==, 7); + res = g_atomic_int_dec_and_test ((gint*)&u); + g_assert (!res); + g_assert_cmpint (u, ==, 6); + u2 = g_atomic_int_and (&u, 5); + g_assert_cmpint (u2, ==, 6); + g_assert_cmpint (u, ==, 4); + u2 = g_atomic_int_or (&u, 8); + g_assert_cmpint (u2, ==, 4); + g_assert_cmpint (u, ==, 12); + u2 = g_atomic_int_xor (&u, 4); + g_assert_cmpint (u2, ==, 12); + + g_atomic_int_set (&s, 5); + s2 = g_atomic_int_get (&s); + g_assert_cmpint (s2, ==, 5); + res = g_atomic_int_compare_and_exchange (&s, 6, 7); + g_assert (!res); + g_assert_cmpint (s, ==, 5); + g_atomic_int_add (&s, 1); + g_assert_cmpint (s, ==, 6); + g_atomic_int_inc (&s); + g_assert_cmpint (s, ==, 7); + res = g_atomic_int_dec_and_test (&s); + g_assert (!res); + g_assert_cmpint (s, ==, 6); + s2 = g_atomic_int_and ((guint*)&s, 5); + g_assert_cmpint (s2, ==, 6); + g_assert_cmpint (s, ==, 4); + s2 = g_atomic_int_or ((guint*)&s, 8); + g_assert_cmpint (s2, ==, 4); + g_assert_cmpint (s, ==, 12); + s2 = g_atomic_int_xor ((guint*)&s, 4); + g_assert_cmpint (s2, ==, 12); + g_assert_cmpint (s, ==, 8); + + g_atomic_pointer_set (&vp, 0); + vp2 = g_atomic_pointer_get (&vp); + g_assert (vp2 == 0); + res = g_atomic_pointer_compare_and_exchange (&vp, 0, 0); + g_assert (res); + g_assert (vp == 0); + + g_atomic_pointer_set (&ip, 0); + ip2 = g_atomic_pointer_get (&ip); + g_assert (ip2 == 0); + res = g_atomic_pointer_compare_and_exchange (&ip, 0, 0); + g_assert (res); + g_assert (ip == 0); + + g_atomic_pointer_set (&gs, 0); + gs2 = (gsize) g_atomic_pointer_get (&gs); + g_assert (gs2 == 0); + res = g_atomic_pointer_compare_and_exchange (&gs, 0, 0); + g_assert (res); + g_assert (gs == 0); + gs2 = g_atomic_pointer_add (&gs, 5); + g_assert (gs2 == 0); + g_assert (gs == 5); + gs2 = g_atomic_pointer_and (&gs, 6); + g_assert (gs2 == 5); + g_assert (gs == 4); + gs2 = g_atomic_pointer_or (&gs, 8); + g_assert (gs2 == 4); + g_assert (gs == 12); + gs2 = g_atomic_pointer_xor (&gs, 4); + g_assert (gs2 == 12); + g_assert (gs == 8); return 0; }