1 /* atomic operation tests */
4 #include "silcatomic.h"
6 int main(int argc, char **argv)
8 SilcBool success = FALSE;
12 SilcAtomicPointer refptr;
17 if (argc > 1 && !strcmp(argv[1], "-d")) {
19 silc_log_debug_hexdump(TRUE);
20 silc_log_set_debug_string("*atomic*");
23 silc_atomic_init8(&ref8, 1);
24 silc_atomic_init16(&ref16, 1);
25 silc_atomic_init32(&ref32, 1);
26 silc_atomic_init_pointer(&refptr, SILC_32_TO_PTR(0xdeadbeef));
28 ret8 = silc_atomic_add_int8(&ref8, 7);
29 SILC_LOG_DEBUG(("ref8: 1 + 7 = %d (8)", ret8));
30 ret8 = silc_atomic_add_int8(&ref8, 3);
31 SILC_LOG_DEBUG(("ref8: 8 + 3 = %d (11)", ret8));
32 ret8 = silc_atomic_sub_int8(&ref8, 10);
33 SILC_LOG_DEBUG(("ref8: 11 - 10 = %d (1)", ret8));
35 ret16 = silc_atomic_add_int16(&ref16, 1);
36 SILC_LOG_DEBUG(("ref16: 1 + 1 = %d (2)", ret16));
37 ret16 = silc_atomic_add_int16(&ref16, 31020);
38 SILC_LOG_DEBUG(("ref16: 2 + 31020 = %d (31022)", ret16));
39 ret16 = silc_atomic_add_int16(&ref16, 34000);
40 SILC_LOG_DEBUG(("ref16: 31022 + 34000 = %d (65022)", ret16));
41 ret16 = silc_atomic_sub_int16(&ref16, 0);
42 SILC_LOG_DEBUG(("ref16: 65022 - 0 = %d (65022)", ret16));
43 ret16 = silc_atomic_sub_int16(&ref16, 0xffff);
44 SILC_LOG_DEBUG(("ref16: 65022 - 0xfff = %d (65023) (underflow)", ret16));
46 SILC_LOG_DEBUG(("Current value: %d (-513)",
47 (SilcInt16)silc_atomic_get_int16(&ref16)));
49 SILC_LOG_DEBUG(("Swapping -513 with 57392"));
50 if (!silc_atomic_cas16(&ref16, silc_atomic_get_int16(&ref16), 57392))
52 SILC_LOG_DEBUG(("Current value: %d (57392)",
53 silc_atomic_get_int16(&ref16)));
54 SILC_LOG_DEBUG(("Swapping 57392 with -500"));
55 if (!silc_atomic_cas16(&ref16, silc_atomic_get_int16(&ref16), -500))
57 SILC_LOG_DEBUG(("Current value: %d (-500)",
58 (SilcInt16)silc_atomic_get_int16(&ref16)));
60 ret32 = silc_atomic_add_int32(&ref32, 1);
61 SILC_LOG_DEBUG(("ref32: 1 + 1 = %d (2)", ret32));
62 ret32 = silc_atomic_add_int32(&ref32, 310200);
63 SILC_LOG_DEBUG(("ref32: 2 + 310200 = %d (310202)", ret32));
64 ret32 = silc_atomic_add_int32(&ref32, 34000000);
65 SILC_LOG_DEBUG(("ref32: 310202 + 34000000 = %d (34310202)", ret32));
66 ret32 = silc_atomic_sub_int32(&ref32, 0);
67 SILC_LOG_DEBUG(("ref32: 34310202 - 0 = %d (34310202)", ret32));
68 ret32 = silc_atomic_sub_int32(&ref32, 0xfffffff);
69 SILC_LOG_DEBUG(("ref32: 34310202 - 0xfffffff = %d (-234125253) "
70 "(underflow)", ret32));
72 SILC_LOG_DEBUG(("Current value: %d (-234125253)",
73 silc_atomic_get_int32(&ref32)));
75 SILC_LOG_DEBUG(("Swapping -234125253 with 76327681"));
76 if (!silc_atomic_cas32(&ref32, silc_atomic_get_int32(&ref32), 76327681))
78 SILC_LOG_DEBUG(("Current value: %d (76327681)",
79 silc_atomic_get_int32(&ref32)));
81 SILC_LOG_DEBUG(("Current ptr: %p (0xdeadbeef)",
82 silc_atomic_get_pointer(&refptr)));
83 SILC_LOG_DEBUG(("Swapping %p with NULL", silc_atomic_get_pointer(&refptr)));
84 if (!silc_atomic_cas_pointer(&refptr,
85 silc_atomic_get_pointer(&refptr), NULL))
87 SILC_LOG_DEBUG(("Current ptr: %p (NULL)",
88 silc_atomic_get_pointer(&refptr)));
90 silc_atomic_uninit8(&ref8);
91 silc_atomic_uninit16(&ref16);
92 silc_atomic_uninit32(&ref32);
93 silc_atomic_uninit_pointer(&refptr);
98 SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
99 fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");