Blender V4.3
atomic_test.cc
Go to the documentation of this file.
1/* Apache License, Version 2.0 */
2
3#include <limits>
4
5#include "atomic_ops.h"
6#include "testing/testing.h"
7
8#ifdef __GNUC__
9# pragma GCC diagnostic error "-Wsign-compare"
10# pragma GCC diagnostic error "-Wsign-conversion"
11#endif
12
13/* -------------------------------------------------------------------- */
18{
19 {
20 uint64_t value = 1;
22 EXPECT_EQ(value, 3);
23 }
24
25 {
26 uint64_t value = 0x1020304050607080;
27 EXPECT_EQ(atomic_add_and_fetch_uint64(&value, 0x0807060504030201), 0x1827364554637281);
28 EXPECT_EQ(value, 0x1827364554637281);
29 }
30
31 {
32 uint64_t value = 0x9020304050607080;
33 EXPECT_EQ(atomic_add_and_fetch_uint64(&value, 0x0807060504030201), 0x9827364554637281);
34 EXPECT_EQ(value, 0x9827364554637281);
35 }
36}
37
39{
40 {
41 uint64_t value = 3;
43 EXPECT_EQ(value, 1);
44 }
45
46 {
47 uint64_t value = 0x1827364554637281;
48 EXPECT_EQ(atomic_sub_and_fetch_uint64(&value, 0x0807060504030201), 0x1020304050607080);
49 EXPECT_EQ(value, 0x1020304050607080);
50 }
51
52 {
53 uint64_t value = 0x9827364554637281;
54 EXPECT_EQ(atomic_sub_and_fetch_uint64(&value, 0x0807060504030201), 0x9020304050607080);
55 EXPECT_EQ(value, 0x9020304050607080);
56 }
57
58 {
59 uint64_t value = 1;
60 EXPECT_EQ(atomic_sub_and_fetch_uint64(&value, 2), 0xffffffffffffffff);
61 EXPECT_EQ(value, 0xffffffffffffffff);
62 }
63}
64
66{
67 {
68 uint64_t value = 1;
70 EXPECT_EQ(value, 3);
71 }
72
73 {
74 uint64_t value = 0x1020304050607080;
75 EXPECT_EQ(atomic_fetch_and_add_uint64(&value, 0x0807060504030201), 0x1020304050607080);
76 EXPECT_EQ(value, 0x1827364554637281);
77 }
78
79 {
80 uint64_t value = 0x9020304050607080;
81 EXPECT_EQ(atomic_fetch_and_add_uint64(&value, 0x0807060504030201), 0x9020304050607080);
82 EXPECT_EQ(value, 0x9827364554637281);
83 }
84}
85
87{
88 {
89 uint64_t value = 3;
91 EXPECT_EQ(value, 1);
92 }
93
94 {
95 uint64_t value = 0x1827364554637281;
96 EXPECT_EQ(atomic_fetch_and_sub_uint64(&value, 0x0807060504030201), 0x1827364554637281);
97 EXPECT_EQ(value, 0x1020304050607080);
98 }
99
100 {
101 uint64_t value = 0x9827364554637281;
102 EXPECT_EQ(atomic_fetch_and_sub_uint64(&value, 0x0807060504030201), 0x9827364554637281);
103 EXPECT_EQ(value, 0x9020304050607080);
104 }
105
106 {
107 uint64_t value = 1;
109 EXPECT_EQ(value, 0xffffffffffffffff);
110 }
111}
112
114{
115 {
116 uint64_t value = 1;
117 EXPECT_EQ(atomic_cas_uint64(&value, 1, 2), 1);
118 EXPECT_EQ(value, 2);
119 }
120
121 {
122 uint64_t value = 1;
123 EXPECT_EQ(atomic_cas_uint64(&value, 2, 3), 1);
124 EXPECT_EQ(value, 1);
125 }
126
127 {
128 uint64_t value = 0x1234567890abcdef;
129 EXPECT_EQ(atomic_cas_uint64(&value, 0x1234567890abcdef, 0xfedcba0987654321),
130 0x1234567890abcdef);
131 EXPECT_EQ(value, 0xfedcba0987654321);
132 }
133
134 {
135 uint64_t value = 0x1234567890abcdef;
136 EXPECT_EQ(atomic_cas_uint64(&value, 0xdeadbeefefefefef, 0xfedcba0987654321),
137 0x1234567890abcdef);
138 EXPECT_EQ(value, 0x1234567890abcdef);
139 }
140}
141
143{
144 /* Make sure alias is implemented. */
145 {
146 uint64_t value = 2;
147 EXPECT_EQ(atomic_load_uint64(&value), 2);
148 }
149
150 /* Make sure alias is using proper bitness. */
151 {
152 const uint64_t uint64_t_max = std::numeric_limits<uint64_t>::max();
153 uint64_t value = uint64_t_max;
154 EXPECT_EQ(atomic_load_uint64(&value), uint64_t_max);
155 }
156}
157
159{
160 /* Make sure alias is implemented. */
161 {
162 uint64_t value = 0;
163 atomic_store_uint64(&value, 2);
164 EXPECT_EQ(value, 2);
165 }
166
167 /* Make sure alias is using proper bitness. */
168 {
169 const uint64_t uint64_t_max = std::numeric_limits<uint64_t>::max();
170 uint64_t value = 0;
171 atomic_store_uint64(&value, uint64_t_max);
172 EXPECT_EQ(value, uint64_t_max);
173 }
174}
175
178/* -------------------------------------------------------------------- */
183{
184 {
185 int64_t value = 1;
187 EXPECT_EQ(value, 3);
188 }
189
190 {
191 int64_t value = 0x1020304050607080;
192 EXPECT_EQ(atomic_add_and_fetch_int64(&value, 0x0807060504030201), 0x1827364554637281);
193 EXPECT_EQ(value, 0x1827364554637281);
194 }
195
196 {
197 int64_t value = -0x1020304050607080;
198 EXPECT_EQ(atomic_add_and_fetch_int64(&value, -0x0807060504030201), -0x1827364554637281);
199 EXPECT_EQ(value, -0x1827364554637281);
200 }
201}
202
204{
205 {
206 int64_t value = 3;
208 EXPECT_EQ(value, 1);
209 }
210
211 {
212 int64_t value = 0x1827364554637281;
213 EXPECT_EQ(atomic_sub_and_fetch_int64(&value, 0x0807060504030201), 0x1020304050607080);
214 EXPECT_EQ(value, 0x1020304050607080);
215 }
216
217 {
218 int64_t value = -0x1827364554637281;
219 EXPECT_EQ(atomic_sub_and_fetch_int64(&value, -0x0807060504030201), -0x1020304050607080);
220 EXPECT_EQ(value, -0x1020304050607080);
221 }
222
223 {
224 int64_t value = 1;
226 EXPECT_EQ(value, -1);
227 }
228}
229
231{
232 {
233 int64_t value = 1;
235 EXPECT_EQ(value, 3);
236 }
237
238 {
239 int64_t value = 0x1020304050607080;
240 EXPECT_EQ(atomic_fetch_and_add_int64(&value, 0x0807060504030201), 0x1020304050607080);
241 EXPECT_EQ(value, 0x1827364554637281);
242 }
243
244 {
245 int64_t value = -0x1020304050607080;
246 EXPECT_EQ(atomic_fetch_and_add_int64(&value, -0x0807060504030201), -0x1020304050607080);
247 EXPECT_EQ(value, -0x1827364554637281);
248 }
249}
250
252{
253 {
254 int64_t value = 3;
256 EXPECT_EQ(value, 1);
257 }
258
259 {
260 int64_t value = 0x1827364554637281;
261 EXPECT_EQ(atomic_fetch_and_sub_int64(&value, 0x0807060504030201), 0x1827364554637281);
262 EXPECT_EQ(value, 0x1020304050607080);
263 }
264
265 {
266 int64_t value = -0x1827364554637281;
267 EXPECT_EQ(atomic_fetch_and_sub_int64(&value, -0x0807060504030201), -0x1827364554637281);
268 EXPECT_EQ(value, -0x1020304050607080);
269 }
270
271 {
272 int64_t value = 1;
274 EXPECT_EQ(value, -1);
275 }
276}
277
279{
280 {
281 int64_t value = 1;
282 EXPECT_EQ(atomic_cas_int64(&value, 1, 2), 1);
283 EXPECT_EQ(value, 2);
284 }
285
286 {
287 int64_t value = 1;
288 EXPECT_EQ(atomic_cas_int64(&value, 2, 3), 1);
289 EXPECT_EQ(value, 1);
290 }
291
292 // 0xfedcba0987654321 is -0x012345f6789abcdf
293 // 0xdeadbeefefefefef is -0x2152411010101011
294
295 {
296 int64_t value = 0x1234567890abcdef;
297 EXPECT_EQ(atomic_cas_int64(&value, 0x1234567890abcdef, -0x012345f6789abcdf),
298 0x1234567890abcdef);
299 EXPECT_EQ(value, -0x012345f6789abcdf);
300 }
301
302 {
303 int64_t value = 0x1234567890abcdef;
304 EXPECT_EQ(atomic_cas_int64(&value, 0x2152411010101011, -0x012345f6789abcdf),
305 0x1234567890abcdef);
306 EXPECT_EQ(value, 0x1234567890abcdef);
307 }
308}
309
311{
312 /* Make sure alias is implemented. */
313 {
314 int64_t value = 2;
315 EXPECT_EQ(atomic_load_int64(&value), 2);
316 }
317
318 /* Make sure alias is using proper bitness. */
319 {
320 const int64_t int64_t_max = std::numeric_limits<int64_t>::max();
321 int64_t value = int64_t_max;
322 EXPECT_EQ(atomic_load_int64(&value), int64_t_max);
323 }
324}
325
327{
328 /* Make sure alias is implemented. */
329 {
330 int64_t value = 0;
331 atomic_store_int64(&value, 2);
332 EXPECT_EQ(value, 2);
333 }
334
335 /* Make sure alias is using proper bitness. */
336 {
337 const int64_t int64_t_max = std::numeric_limits<int64_t>::max();
338 int64_t value = 0;
339 atomic_store_int64(&value, int64_t_max);
340 EXPECT_EQ(value, int64_t_max);
341 }
342}
343
346/* -------------------------------------------------------------------- */
351{
352 {
353 uint32_t value = 1;
355 EXPECT_EQ(value, 3);
356 }
357
358 {
359 uint32_t value = 0x10203040;
360 EXPECT_EQ(atomic_add_and_fetch_uint32(&value, 0x04030201), 0x14233241);
361 EXPECT_EQ(value, 0x14233241);
362 }
363
364 {
365 uint32_t value = 0x90203040;
366 EXPECT_EQ(atomic_add_and_fetch_uint32(&value, 0x04030201), 0x94233241);
367 EXPECT_EQ(value, 0x94233241);
368 }
369}
370
372{
373 {
374 uint32_t value = 3;
376 EXPECT_EQ(value, 1);
377 }
378
379 {
380 uint32_t value = 0x14233241;
381 EXPECT_EQ(atomic_sub_and_fetch_uint32(&value, 0x04030201), 0x10203040);
382 EXPECT_EQ(value, 0x10203040);
383 }
384
385 {
386 uint32_t value = 0x94233241;
387 EXPECT_EQ(atomic_sub_and_fetch_uint32(&value, 0x04030201), 0x90203040);
388 EXPECT_EQ(value, 0x90203040);
389 }
390
391 {
392 uint32_t value = 1;
393 EXPECT_EQ(atomic_sub_and_fetch_uint32(&value, 2), 0xffffffff);
394 EXPECT_EQ(value, 0xffffffff);
395 }
396}
397
399{
400 {
401 uint32_t value = 1;
402 EXPECT_EQ(atomic_cas_uint32(&value, 1, 2), 1);
403 EXPECT_EQ(value, 2);
404 }
405
406 {
407 uint32_t value = 1;
408 EXPECT_EQ(atomic_cas_uint32(&value, 2, 3), 1);
409 EXPECT_EQ(value, 1);
410 }
411
412 {
413 uint32_t value = 0x12345678;
414 EXPECT_EQ(atomic_cas_uint32(&value, 0x12345678, 0x87654321), 0x12345678);
415 EXPECT_EQ(value, 0x87654321);
416 }
417
418 {
419 uint32_t value = 0x12345678;
420 EXPECT_EQ(atomic_cas_uint32(&value, 0xdeadbeef, 0x87654321), 0x12345678);
421 EXPECT_EQ(value, 0x12345678);
422 }
423}
424
426{
427 /* Make sure alias is implemented. */
428 {
429 uint32_t value = 2;
430 EXPECT_EQ(atomic_load_uint32(&value), 2);
431 }
432
433 /* Make sure alias is using proper bitness. */
434 {
435 const uint32_t uint32_t_max = std::numeric_limits<uint32_t>::max();
436 uint32_t value = uint32_t_max;
437 EXPECT_EQ(atomic_load_uint32(&value), uint32_t_max);
438 }
439}
440
442{
443 /* Make sure alias is implemented. */
444 {
445 uint32_t value = 0;
446 atomic_store_uint32(&value, 2);
447 EXPECT_EQ(value, 2);
448 }
449
450 /* Make sure alias is using proper bitness. */
451 {
452 const uint32_t uint32_t_max = std::numeric_limits<uint32_t>::max();
453 uint32_t value = 0;
454 atomic_store_uint32(&value, uint32_t_max);
455 EXPECT_EQ(value, uint32_t_max);
456 }
457}
458
460{
461 {
462 uint32_t value = 1;
464 EXPECT_EQ(value, 3);
465 }
466
467 {
468 uint32_t value = 0x10203040;
469 EXPECT_EQ(atomic_fetch_and_add_uint32(&value, 0x04030201), 0x10203040);
470 EXPECT_EQ(value, 0x14233241);
471 }
472
473 {
474 uint32_t value = 0x90203040;
475 EXPECT_EQ(atomic_fetch_and_add_uint32(&value, 0x04030201), 0x90203040);
476 EXPECT_EQ(value, 0x94233241);
477 }
478}
479
481{
482 {
483 uint32_t value = 12;
485 EXPECT_EQ(value, 13);
486 }
487
488 {
489 uint32_t value = 0x12345678;
490 EXPECT_EQ(atomic_fetch_and_or_uint32(&value, 0x87654321), 0x12345678);
491 EXPECT_EQ(value, 0x97755779);
492 }
493
494 {
495 uint32_t value = 0x92345678;
496 EXPECT_EQ(atomic_fetch_and_or_uint32(&value, 0x87654321), 0x92345678);
497 EXPECT_EQ(value, 0x97755779);
498 }
499}
500
502{
503 {
504 uint32_t value = 12;
506 EXPECT_EQ(value, 4);
507 }
508
509 {
510 uint32_t value = 0x12345678;
511 EXPECT_EQ(atomic_fetch_and_and_uint32(&value, 0x87654321), 0x12345678);
512 EXPECT_EQ(value, 0x02244220);
513 }
514
515 {
516 uint32_t value = 0x92345678;
517 EXPECT_EQ(atomic_fetch_and_and_uint32(&value, 0x87654321), 0x92345678);
518 EXPECT_EQ(value, 0x82244220);
519 }
520}
521
524/* -------------------------------------------------------------------- */
529{
530 {
531 int32_t value = 1;
533 EXPECT_EQ(value, 3);
534 }
535
536 {
537 int32_t value = 0x10203040;
538 EXPECT_EQ(atomic_add_and_fetch_int32(&value, 0x04030201), 0x14233241);
539 EXPECT_EQ(value, 0x14233241);
540 }
541
542 {
543 int32_t value = -0x10203040;
544 EXPECT_EQ(atomic_add_and_fetch_int32(&value, -0x04030201), -0x14233241);
545 EXPECT_EQ(value, -0x14233241);
546 }
547}
548
550{
551 {
552 int32_t value = 3;
554 EXPECT_EQ(value, 1);
555 }
556
557 {
558 int32_t value = 0x14233241;
559 EXPECT_EQ(atomic_sub_and_fetch_int32(&value, 0x04030201), 0x10203040);
560 EXPECT_EQ(value, 0x10203040);
561 }
562
563 {
564 int32_t value = -0x14233241;
565 EXPECT_EQ(atomic_sub_and_fetch_int32(&value, -0x04030201), -0x10203040);
566 EXPECT_EQ(value, -0x10203040);
567 }
568
569 {
570 int32_t value = 1;
571 EXPECT_EQ(atomic_sub_and_fetch_int32(&value, 2), 0xffffffff);
572 EXPECT_EQ(value, 0xffffffff);
573 }
574}
575
577{
578 {
579 int32_t value = 1;
580 EXPECT_EQ(atomic_cas_int32(&value, 1, 2), 1);
581 EXPECT_EQ(value, 2);
582 }
583
584 {
585 int32_t value = 1;
586 EXPECT_EQ(atomic_cas_int32(&value, 2, 3), 1);
587 EXPECT_EQ(value, 1);
588 }
589
590 // 0x87654321 is -0x789abcdf
591 // 0xdeadbeef is -0x21524111
592
593 {
594 int32_t value = 0x12345678;
595 EXPECT_EQ(atomic_cas_int32(&value, 0x12345678, -0x789abcdf), 0x12345678);
596 EXPECT_EQ(value, -0x789abcdf);
597 }
598
599 {
600 int32_t value = 0x12345678;
601 EXPECT_EQ(atomic_cas_int32(&value, -0x21524111, -0x789abcdf), 0x12345678);
602 EXPECT_EQ(value, 0x12345678);
603 }
604}
605
607{
608 /* Make sure alias is implemented. */
609 {
610 int32_t value = 2;
611 EXPECT_EQ(atomic_load_int32(&value), 2);
612 }
613
614 /* Make sure alias is using proper bitness. */
615 {
616 const int32_t int32_t_max = std::numeric_limits<int32_t>::max();
617 int32_t value = int32_t_max;
618 EXPECT_EQ(atomic_load_int32(&value), int32_t_max);
619 }
620}
621
623{
624 /* Make sure alias is implemented. */
625 {
626 int32_t value = 0;
627 atomic_store_int32(&value, 2);
628 EXPECT_EQ(value, 2);
629 }
630
631 /* Make sure alias is using proper bitness. */
632 {
633 const int32_t int32_t_max = std::numeric_limits<int32_t>::max();
634 int32_t value = 0;
635 atomic_store_int32(&value, int32_t_max);
636 EXPECT_EQ(value, int32_t_max);
637 }
638}
639
641{
642 {
643 int32_t value = 1;
645 EXPECT_EQ(value, 3);
646 }
647
648 {
649 int32_t value = 0x10203040;
650 EXPECT_EQ(atomic_fetch_and_add_int32(&value, 0x04030201), 0x10203040);
651 EXPECT_EQ(value, 0x14233241);
652 }
653
654 {
655 int32_t value = -0x10203040;
656 EXPECT_EQ(atomic_fetch_and_add_int32(&value, -0x04030201), -0x10203040);
657 EXPECT_EQ(value, -0x14233241);
658 }
659}
660
662{
663 {
664 int32_t value = 12;
665 EXPECT_EQ(atomic_fetch_and_or_int32(&value, 5), 12);
666 EXPECT_EQ(value, 13);
667 }
668
669 // 0x87654321 is -0x789abcdf
670
671 {
672 int32_t value = 0x12345678;
673 EXPECT_EQ(atomic_fetch_and_or_int32(&value, -0x789abcdf), 0x12345678);
674 EXPECT_EQ(value, 0x97755779);
675 }
676}
677
679{
680 {
681 int32_t value = 12;
683 EXPECT_EQ(value, 4);
684 }
685
686 {
687 int32_t value = 0x12345678;
688 EXPECT_EQ(atomic_fetch_and_and_int32(&value, -0x789abcdf), 0x12345678);
689 EXPECT_EQ(value, 0x02244220);
690 }
691}
692
695/* -------------------------------------------------------------------- */
700{
701 {
702 int16_t value = 12;
703 EXPECT_EQ(atomic_fetch_and_or_int16(&value, 5), 12);
704 EXPECT_EQ(value, 13);
705 }
706
707 {
708 int16_t value = 0x1234;
709 EXPECT_EQ(atomic_fetch_and_or_int16(&value, -0x5678), 0x1234);
710 EXPECT_EQ(value, -0x4444);
711 }
712}
713
715{
716 {
717 int16_t value = 12;
719 EXPECT_EQ(value, 4);
720 }
721
722 {
723 int16_t value = 0x1234;
724 EXPECT_EQ(atomic_fetch_and_and_int16(&value, -0x789A), 0x1234);
725 EXPECT_EQ(value, 0x224);
726 }
727}
728
731/* -------------------------------------------------------------------- */
736{
737 {
738 uint8_t value = 12;
739 EXPECT_EQ(atomic_fetch_and_or_uint8(&value, 5), 12);
740 EXPECT_EQ(value, 13);
741 }
742}
743
745{
746 {
747 uint8_t value = 12;
749 EXPECT_EQ(value, 4);
750 }
751}
752
759{
760 {
761 int8_t value = 12;
762 EXPECT_EQ(atomic_fetch_and_or_int8(&value, 5), 12);
763 EXPECT_EQ(value, 13);
764 }
765}
766
768{
769 {
770 int8_t value = 12;
771 EXPECT_EQ(atomic_fetch_and_and_int8(&value, 5), 12);
772 EXPECT_EQ(value, 4);
773 }
774}
775
778/* -------------------------------------------------------------------- */
783{
784 {
785 char value = 12;
786 EXPECT_EQ(atomic_fetch_and_or_char(&value, 5), 12);
787 EXPECT_EQ(value, 13);
788 }
789}
790
792{
793 {
794 char value = 12;
795 EXPECT_EQ(atomic_fetch_and_and_char(&value, 5), 12);
796 EXPECT_EQ(value, 4);
797 }
798}
799
802/* -------------------------------------------------------------------- */
807{
808 /* Make sure alias is implemented. */
809 {
810 size_t value = 1;
811 EXPECT_EQ(atomic_add_and_fetch_z(&value, 2), 3);
812 EXPECT_EQ(value, 3);
813 }
814
815 /* Make sure alias is using proper bitness. */
816 {
817 const size_t size_t_max = std::numeric_limits<size_t>::max();
818 size_t value = size_t_max - 10;
819 EXPECT_EQ(atomic_add_and_fetch_z(&value, 2), size_t_max - 8);
820 EXPECT_EQ(value, size_t_max - 8);
821 }
822}
823
825{
826 /* Make sure alias is implemented. */
827 {
828 size_t value = 3;
829 EXPECT_EQ(atomic_sub_and_fetch_z(&value, 2), 1);
830 EXPECT_EQ(value, 1);
831 }
832
833 /* Make sure alias is using proper bitness. */
834 {
835 const size_t size_t_max = std::numeric_limits<size_t>::max();
836 size_t value = size_t_max - 10;
837 EXPECT_EQ(atomic_sub_and_fetch_z(&value, 2), size_t_max - 12);
838 EXPECT_EQ(value, size_t_max - 12);
839 }
840}
841
843{
844 /* Make sure alias is implemented. */
845 {
846 size_t value = 1;
847 EXPECT_EQ(atomic_fetch_and_add_z(&value, 2), 1);
848 EXPECT_EQ(value, 3);
849 }
850
851 /* Make sure alias is using proper bitness. */
852 {
853 const size_t size_t_max = std::numeric_limits<size_t>::max();
854 size_t value = size_t_max - 10;
855 EXPECT_EQ(atomic_fetch_and_add_z(&value, 2), size_t_max - 10);
856 EXPECT_EQ(value, size_t_max - 8);
857 }
858}
859
861{
862 /* Make sure alias is implemented. */
863 {
864 size_t value = 3;
865 EXPECT_EQ(atomic_fetch_and_sub_z(&value, 2), 3);
866 EXPECT_EQ(value, 1);
867 }
868
869 /* Make sure alias is using proper bitness. */
870 {
871 const size_t size_t_max = std::numeric_limits<size_t>::max();
872 size_t value = size_t_max - 10;
873 EXPECT_EQ(atomic_fetch_and_sub_z(&value, 2), size_t_max - 10);
874 EXPECT_EQ(value, size_t_max - 12);
875 }
876}
877
879{
880 /* Make sure alias is implemented. */
881 {
882 size_t value = 1;
883 EXPECT_EQ(atomic_cas_z(&value, 1, 2), 1);
884 EXPECT_EQ(value, 2);
885 }
886
887 /* Make sure alias is using proper bitness. */
888 {
889 const size_t size_t_max = std::numeric_limits<size_t>::max();
890 size_t value = 1;
891 EXPECT_EQ(atomic_cas_z(&value, 1, size_t_max), 1);
892 EXPECT_EQ(value, size_t_max);
893 }
894}
895
897{
898 /* Make sure alias is implemented. */
899 {
900 size_t value = 2;
901 EXPECT_EQ(atomic_load_z(&value), 2);
902 }
903
904 /* Make sure alias is using proper bitness. */
905 {
906 const size_t size_t_max = std::numeric_limits<size_t>::max();
907 size_t value = size_t_max;
908 EXPECT_EQ(atomic_load_z(&value), size_t_max);
909 }
910}
911
913{
914 /* Make sure alias is implemented. */
915 {
916 size_t value = 0;
917 atomic_store_z(&value, 2);
918 EXPECT_EQ(value, 2);
919 }
920
921 /* Make sure alias is using proper bitness. */
922 {
923 const size_t size_t_max = std::numeric_limits<size_t>::max();
924 size_t value = 0;
925 atomic_store_z(&value, size_t_max);
926 EXPECT_EQ(value, size_t_max);
927 }
928}
929
931{
932 const size_t size_t_max = std::numeric_limits<size_t>::max();
933
934 size_t value = 12;
935
937 EXPECT_EQ(value, 12);
938
940 EXPECT_EQ(value, 24);
941
942 EXPECT_EQ(atomic_fetch_and_update_max_z(&value, size_t_max), 24);
943 EXPECT_EQ(value, size_t_max);
944}
945
948/* -------------------------------------------------------------------- */
953{
954 /* Make sure alias is implemented. */
955 {
956 unsigned int value = 1;
957 EXPECT_EQ(atomic_add_and_fetch_u(&value, 2), 3);
958 EXPECT_EQ(value, 3);
959 }
960
961 /* Make sure alias is using proper bitness. */
962 {
963 const unsigned int uint_max = std::numeric_limits<unsigned int>::max();
964 unsigned int value = uint_max - 10;
965 EXPECT_EQ(atomic_add_and_fetch_u(&value, 2), uint_max - 8);
966 EXPECT_EQ(value, uint_max - 8);
967 }
968}
969
971{
972 /* Make sure alias is implemented. */
973 {
974 unsigned int value = 3;
975 EXPECT_EQ(atomic_sub_and_fetch_u(&value, 2), 1);
976 EXPECT_EQ(value, 1);
977 }
978
979 /* Make sure alias is using proper bitness. */
980 {
981 const unsigned int uint_max = std::numeric_limits<unsigned int>::max();
982 unsigned int value = uint_max - 10;
983 EXPECT_EQ(atomic_sub_and_fetch_u(&value, 2), uint_max - 12);
984 EXPECT_EQ(value, uint_max - 12);
985 }
986}
987
989{
990 /* Make sure alias is implemented. */
991 {
992 unsigned int value = 1;
993 EXPECT_EQ(atomic_fetch_and_add_u(&value, 2), 1);
994 EXPECT_EQ(value, 3);
995 }
996
997 /* Make sure alias is using proper bitness. */
998 {
999 const unsigned int uint_max = std::numeric_limits<unsigned int>::max();
1000 unsigned int value = uint_max - 10;
1001 EXPECT_EQ(atomic_fetch_and_add_u(&value, 2), uint_max - 10);
1002 EXPECT_EQ(value, uint_max - 8);
1003 }
1004}
1005
1007{
1008 /* Make sure alias is implemented. */
1009 {
1010 unsigned int value = 3;
1011 EXPECT_EQ(atomic_fetch_and_sub_u(&value, 2), 3);
1012 EXPECT_EQ(value, 1);
1013 }
1014
1015 /* Make sure alias is using proper bitness. */
1016 {
1017 const unsigned int uint_max = std::numeric_limits<unsigned int>::max();
1018 unsigned int value = uint_max - 10;
1019 EXPECT_EQ(atomic_fetch_and_sub_u(&value, 2), uint_max - 10);
1020 EXPECT_EQ(value, uint_max - 12);
1021 }
1022}
1023
1025{
1026 /* Make sure alias is implemented. */
1027 {
1028 unsigned int value = 1;
1029 EXPECT_EQ(atomic_cas_u(&value, 1, 2), 1);
1030 EXPECT_EQ(value, 2);
1031 }
1032
1033 /* Make sure alias is using proper bitness. */
1034 {
1035 const unsigned int uint_max = std::numeric_limits<unsigned int>::max();
1036 unsigned int value = 1;
1037 EXPECT_EQ(atomic_cas_u(&value, 1, uint_max), 1);
1038 EXPECT_EQ(value, uint_max);
1039 }
1040}
1041
1044/* -------------------------------------------------------------------- */
1048#define INT_AS_PTR(a) reinterpret_cast<void *>((a))
1049
1051{
1052 {
1053 void *value = INT_AS_PTR(0x7f);
1054 EXPECT_EQ(atomic_cas_ptr(&value, INT_AS_PTR(0x7f), INT_AS_PTR(0xef)), INT_AS_PTR(0x7f));
1055 EXPECT_EQ(value, INT_AS_PTR(0xef));
1056 }
1057}
1058
1060{
1061 {
1062 void *value = INT_AS_PTR(0x7f);
1063 void *dest = atomic_load_ptr(&value);
1064 EXPECT_EQ(dest, INT_AS_PTR(0x7f));
1065 }
1066}
1067
1069{
1070 {
1071 void *value = INT_AS_PTR(0x7f);
1072 void *dest = nullptr;
1073 atomic_store_ptr(&dest, value);
1074 EXPECT_EQ(dest, INT_AS_PTR(0x7f));
1075 }
1076}
1077
1078#undef INT_AS_PTR
1079
1082/* -------------------------------------------------------------------- */
1087{
1088 {
1089 float value = 1.234f;
1090 EXPECT_EQ(atomic_cas_float(&value, 1.234f, 2.71f), 1.234f);
1091 EXPECT_EQ(value, 2.71f);
1092 }
1093}
1094
1096{
1097 {
1098 float value = 1.23f;
1099 EXPECT_NEAR(atomic_add_and_fetch_fl(&value, 2.71f), 3.94f, 1e-8f);
1100 EXPECT_NEAR(value, 3.94f, 1e-8f);
1101 }
1102}
1103
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
Provides wrapper around system-specific atomic primitives, and some extensions (faked-atomic operatio...
ATOMIC_INLINE unsigned int atomic_fetch_and_sub_u(unsigned int *p, unsigned int x)
ATOMIC_INLINE uint32_t atomic_fetch_and_or_uint32(uint32_t *p, uint32_t x)
ATOMIC_INLINE int32_t atomic_add_and_fetch_int32(int32_t *p, int32_t x)
ATOMIC_INLINE int16_t atomic_fetch_and_or_int16(int16_t *p, int16_t b)
ATOMIC_INLINE void atomic_store_uint64(uint64_t *p, uint64_t v)
ATOMIC_INLINE size_t atomic_load_z(const size_t *v)
ATOMIC_INLINE size_t atomic_add_and_fetch_z(size_t *p, size_t x)
ATOMIC_INLINE uint64_t atomic_fetch_and_sub_uint64(uint64_t *p, uint64_t x)
ATOMIC_INLINE int64_t atomic_sub_and_fetch_int64(int64_t *p, int64_t x)
ATOMIC_INLINE uint8_t atomic_fetch_and_and_uint8(uint8_t *p, uint8_t b)
ATOMIC_INLINE void * atomic_load_ptr(void *const *v)
ATOMIC_INLINE uint64_t atomic_load_uint64(const uint64_t *v)
ATOMIC_INLINE size_t atomic_sub_and_fetch_z(size_t *p, size_t x)
ATOMIC_INLINE void * atomic_cas_ptr(void **v, void *old, void *_new)
ATOMIC_INLINE int64_t atomic_cas_int64(int64_t *v, int64_t old, int64_t _new)
ATOMIC_INLINE size_t atomic_fetch_and_sub_z(size_t *p, size_t x)
ATOMIC_INLINE uint32_t atomic_fetch_and_add_uint32(uint32_t *p, uint32_t x)
ATOMIC_INLINE uint8_t atomic_fetch_and_or_uint8(uint8_t *p, uint8_t b)
ATOMIC_INLINE int32_t atomic_load_int32(const int32_t *v)
ATOMIC_INLINE float atomic_add_and_fetch_fl(float *p, const float x)
ATOMIC_INLINE int64_t atomic_load_int64(const int64_t *v)
ATOMIC_INLINE int32_t atomic_fetch_and_or_int32(int32_t *p, int32_t x)
ATOMIC_INLINE char atomic_fetch_and_or_char(char *p, char b)
ATOMIC_INLINE uint32_t atomic_fetch_and_and_uint32(uint32_t *p, uint32_t x)
ATOMIC_INLINE void atomic_store_int64(int64_t *p, int64_t v)
ATOMIC_INLINE int64_t atomic_fetch_and_add_int64(int64_t *p, int64_t x)
ATOMIC_INLINE unsigned int atomic_add_and_fetch_u(unsigned int *p, unsigned int x)
ATOMIC_INLINE uint32_t atomic_add_and_fetch_uint32(uint32_t *p, uint32_t x)
ATOMIC_INLINE void atomic_store_int32(int32_t *p, int32_t v)
ATOMIC_INLINE int32_t atomic_fetch_and_add_int32(int32_t *p, int32_t x)
ATOMIC_INLINE uint64_t atomic_cas_uint64(uint64_t *v, uint64_t old, uint64_t _new)
ATOMIC_INLINE uint64_t atomic_fetch_and_add_uint64(uint64_t *p, uint64_t x)
ATOMIC_INLINE uint32_t atomic_sub_and_fetch_uint32(uint32_t *p, uint32_t x)
ATOMIC_INLINE char atomic_fetch_and_and_char(char *p, char b)
ATOMIC_INLINE int16_t atomic_fetch_and_and_int16(int16_t *p, int16_t b)
ATOMIC_INLINE unsigned int atomic_cas_u(unsigned int *v, unsigned int old, unsigned int _new)
ATOMIC_INLINE size_t atomic_cas_z(size_t *v, size_t old, size_t _new)
ATOMIC_INLINE void atomic_store_z(size_t *p, size_t v)
ATOMIC_INLINE float atomic_cas_float(float *v, float old, float _new)
ATOMIC_INLINE int64_t atomic_add_and_fetch_int64(int64_t *p, int64_t x)
ATOMIC_INLINE uint64_t atomic_add_and_fetch_uint64(uint64_t *p, uint64_t x)
ATOMIC_INLINE size_t atomic_fetch_and_add_z(size_t *p, size_t x)
ATOMIC_INLINE uint32_t atomic_load_uint32(const uint32_t *v)
ATOMIC_INLINE uint64_t atomic_sub_and_fetch_uint64(uint64_t *p, uint64_t x)
ATOMIC_INLINE void atomic_store_uint32(uint32_t *p, uint32_t v)
ATOMIC_INLINE int32_t atomic_cas_int32(int32_t *v, int32_t old, int32_t _new)
ATOMIC_INLINE int32_t atomic_fetch_and_and_int32(int32_t *p, int32_t x)
ATOMIC_INLINE size_t atomic_fetch_and_update_max_z(size_t *p, size_t x)
ATOMIC_INLINE int8_t atomic_fetch_and_or_int8(int8_t *p, int8_t b)
ATOMIC_INLINE void atomic_store_ptr(void **p, void *v)
ATOMIC_INLINE int32_t atomic_sub_and_fetch_int32(int32_t *p, int32_t x)
ATOMIC_INLINE unsigned int atomic_sub_and_fetch_u(unsigned int *p, unsigned int x)
ATOMIC_INLINE int8_t atomic_fetch_and_and_int8(int8_t *p, int8_t b)
ATOMIC_INLINE unsigned int atomic_fetch_and_add_u(unsigned int *p, unsigned int x)
ATOMIC_INLINE int64_t atomic_fetch_and_sub_int64(int64_t *p, int64_t x)
ATOMIC_INLINE uint32_t atomic_cas_uint32(uint32_t *v, uint32_t old, uint32_t _new)
#define INT_AS_PTR(a)
TEST(atomic, atomic_add_and_fetch_uint64)
signed short int16_t
Definition stdint.h:76
unsigned int uint32_t
Definition stdint.h:80
__int64 int64_t
Definition stdint.h:89
signed int int32_t
Definition stdint.h:77
unsigned char uint8_t
Definition stdint.h:78
unsigned __int64 uint64_t
Definition stdint.h:90
signed char int8_t
Definition stdint.h:75