207 lines · 4.5 KB · C
RawDownload
#include <stdatomic.h>int printf(const char*,...); #if defined test_atomic_compare_exchangeint main(){    _Atomic int a = 12;    int b = 77;    int r;     atomic_store(&a, b + 0);    r = atomic_compare_exchange_strong(&a, &b, 99);    printf("%d %d %d\n", r, a, b);     atomic_store(&a, b + 3);    r = atomic_compare_exchange_strong(&a, &b, 99);    printf("%d %d %d\n", r, a, b);     atomic_store(&a, b + 5);    r = atomic_exchange(&a,  33);    printf("%d %d %d\n", r, a, b);     atomic_store(&a, b + 10);    r = atomic_exchange(&a, 66);    printf("%d %d %d\n", r, a, b);     return 0;} #elif defined test_atomic_storeint main(){    int _Atomic i;    int r;    atomic_store(&i, 12);    r = atomic_fetch_add(&i, i);    printf("r = %d, i = %d\n", r, i);} #elif defined test_atomic_store_pointertypedef struct { char c[4]; } c4;int main(){    int i = 1;    int _Atomic *p = &i;    int k = 2;    atomic_store(&p, &k);    printf("*p = %d\n", *p);} #elif defined test_atomic_store_structtypedef struct { char c[4]; } c4;int main(){    c4 _Atomic p;    c4 v = { 1,2,3,4 };    atomic_store(&p, v);    printf("%d %d %d %d\n", p.c[0], p.c[1], p.c[2], p.c[3]);} #elif defined test_atomic_op #define OP1(func, v, e1, e2) atomic_##func(&c, v) == e1 && c == e2#define OP2(func, v, e1, e2) atomic_##func(&s, v) == e1 && s == e2#define OP4(func, v, e1, e2) atomic_##func(&i, v) == e1 && i == e2#define OP8(func, v, e1, e2) atomic_##func(&l, v) == e1 && l == e2 #define OP(func, v, e1, e2) printf ("%s: %s\n", #func,                        \                                    OP1(func,v,e1,e2) && OP2(func,v,e1,e2) && \                                    OP4(func,v,e1,e2) && OP8(func,v,e1,e2)    \                                    ? "SUCCESS" : "FAIL"); int main(){    atomic_char c;    atomic_short s;    atomic_int i;    atomic_size_t l;     atomic_init(&c, 0);    atomic_init(&s, 0);    atomic_init(&i, 0);    atomic_init(&l, 0);     OP(fetch_add, 10, 0, 10);    OP(fetch_sub, 5, 10, 5);    OP(fetch_or, 0x10, 5, 21);    OP(fetch_xor, 0x20, 21, 53);    OP(fetch_and, 0x0f, 53, 5);} #elif defined test_atomic_op2 typedef __SIZE_TYPE__ size64_t; #define OP1(func, v, e1, e2) \    __atomic_##func(&c, v, __ATOMIC_SEQ_CST) == e1 && c == e2#define OP2(func, v, e1, e2)\    __atomic_##func(&s, v, __ATOMIC_SEQ_CST) == e1 && s == e2#define OP4(func, v, e1, e2)\    __atomic_##func(&i, v, __ATOMIC_SEQ_CST) == e1 && i == e2#define OP8(func, v, e1, e2)\    __atomic_##func(&l, v, __ATOMIC_SEQ_CST) == e1 && l == e2 #define OP(func, v, e1, e2) printf ("%s: %s\n", #func,                        \                                    OP1(func,v,e1,e2) && OP2(func,v,e1,e2) && \                                    OP4(func,v,e1,e2) && OP8(func,v,e1,e2)    \                                    ? "SUCCESS" : "FAIL"); int main(){    signed char c;    short s;    int i;    size64_t l;     atomic_init(&c, 0);    atomic_init(&s, 0);    atomic_init(&i, 0);    atomic_init(&l, 0);     OP(fetch_add, 10, 0, 10);    OP(fetch_sub, 5, 10, 5);    OP(fetch_or, 0x10, 5, 21);    OP(fetch_xor, 0x20, 21, 53);    OP(fetch_and, 0x0f, 53, 5);    OP(fetch_nand, 0x01, 5, -2);     atomic_init(&c, 0);    atomic_init(&s, 0);    atomic_init(&i, 0);    atomic_init(&l, 0);     OP(add_fetch, 10, 10, 10);    OP(sub_fetch, 5, 5, 5);    OP(or_fetch, 0x10, 21, 21);    OP(xor_fetch, 0x20, 53, 53);    OP(and_fetch, 0x0f, 5, 5);    OP(nand_fetch, 0x01, -2, -2);} #elif defined test_atomic_thread_signalint main(){    int c;     atomic_thread_fence(__ATOMIC_SEQ_CST);    atomic_signal_fence(__ATOMIC_SEQ_CST);    printf ("%d\n", atomic_is_lock_free(&c));} #elif defined test_atomic_error_1int main(){    int _Atomic i;    atomic_load(i);} #elif defined test_atomic_error_2int main(){    struct { char c[3]; } _Atomic c3;    atomic_load(&c3);} #elif defined test_atomic_error_3int main(){    _Atomic int *p = 0;    atomic_fetch_add(&p, 1);} #elif defined test_atomic_error_4int main(){    int _Atomic i = 1;    char c = 2;    atomic_compare_exchange_strong(&i, &c, 0);} #elif defined test_atomic_warn_1int main(){    size_t _Atomic i = 1;    /* assignment to integer from pointer */    atomic_store(&i, &i);} #elif defined test_atomic_warn_2int main(){    int i = 1;    char c = 2;    int _Atomic *p = &i;    /* assignment from incompatible pointer */    atomic_store(&p, &c);} #elif defined test_atomic_warn_3int main(){    int const i = 1;    /* assignment to read-only -location */    atomic_fetch_add(&i, 2);} #endif

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t