Added SILC Thread Queue API
[silc.git] / lib / silcutil / tests / test_silcatomic.c
1 /* atomic operation tests */
2
3 #include "silc.h"
4 #include "silcatomic.h"
5
6 int main(int argc, char **argv)
7 {
8   SilcBool success = FALSE;
9   SilcAtomic32 ref32;
10   SilcAtomic16 ref16;
11   SilcAtomic8 ref8;
12   SilcAtomicPointer refptr;
13   SilcUInt8 ret8;
14   SilcUInt16 ret16;
15   SilcUInt32 ret32;
16
17   if (argc > 1 && !strcmp(argv[1], "-d")) {
18     silc_log_debug(TRUE);
19     silc_log_debug_hexdump(TRUE);
20     silc_log_set_debug_string("*atomic*,*errno*");
21   }
22
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));
27
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));
34
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, (SilcInt16)0xffff);
44   SILC_LOG_DEBUG(("ref16: 65022 - 0xffff = %d (65023) (underflow)", ret16));
45
46   SILC_LOG_DEBUG(("Current value: %d (-513)",
47                   (SilcInt16)silc_atomic_get_int16(&ref16)));
48
49   SILC_LOG_DEBUG(("Swapping -513 with 57392"));
50   if (!silc_atomic_cas16(&ref16, silc_atomic_get_int16(&ref16), 57392))
51     goto err;
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))
56     goto err;
57   SILC_LOG_DEBUG(("Current value: %d (-500)",
58                   (SilcInt16)silc_atomic_get_int16(&ref16)));
59
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));
71
72   SILC_LOG_DEBUG(("Current value: %d (-234125253)",
73                   silc_atomic_get_int32(&ref32)));
74
75   SILC_LOG_DEBUG(("Swapping -234125253 with 76327681"));
76   if (!silc_atomic_cas32(&ref32, silc_atomic_get_int32(&ref32), 76327681))
77     goto err;
78   SILC_LOG_DEBUG(("Current value: %d (76327681)",
79                   silc_atomic_get_int32(&ref32)));
80
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))
86     goto err;
87   SILC_LOG_DEBUG(("Current ptr: %p (NULL)",
88                   silc_atomic_get_pointer(&refptr)));
89
90   SILC_LOG_DEBUG(("Setting val 34322111 (32-bit)"));
91   silc_atomic_set_int32(&ref32, 34322111);
92   if (silc_atomic_get_int32(&ref32) != 34322111)
93     goto err;
94   SILC_LOG_DEBUG(("Setting val 1432211119 (32-bit)"));
95   silc_atomic_set_int32(&ref32, 1432211119);
96   if (silc_atomic_get_int32(&ref32) != 1432211119)
97     goto err;
98   SILC_LOG_DEBUG(("Setting val 23422 (16-bit)"));
99   silc_atomic_set_int16(&ref16, 23422);
100   if (silc_atomic_get_int16(&ref16) != 23422)
101     goto err;
102   SILC_LOG_DEBUG(("Setting val 124 (8-bit)"));
103   silc_atomic_set_int8(&ref8, 124);
104   if (silc_atomic_get_int8(&ref8) != 124)
105     goto err;
106
107   silc_atomic_uninit8(&ref8);
108   silc_atomic_uninit16(&ref16);
109   silc_atomic_uninit32(&ref32);
110   silc_atomic_uninit_pointer(&refptr);
111
112   success = TRUE;
113
114  err:
115   SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
116   fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
117
118   return success;
119 }