Blender  V2.93
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 # if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 /* gcc4.6+ only */
10 # pragma GCC diagnostic error "-Wsign-compare"
11 # endif
12 # if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408
13 # pragma GCC diagnostic error "-Wsign-conversion"
14 # endif
15 #endif
16 
17 /* -------------------------------------------------------------------- */
22 {
23  {
24  uint64_t value = 1;
26  EXPECT_EQ(value, 3);
27  }
28 
29  {
30  uint64_t value = 0x1020304050607080;
31  EXPECT_EQ(atomic_add_and_fetch_uint64(&value, 0x0807060504030201), 0x1827364554637281);
32  EXPECT_EQ(value, 0x1827364554637281);
33  }
34 
35  {
36  uint64_t value = 0x9020304050607080;
37  EXPECT_EQ(atomic_add_and_fetch_uint64(&value, 0x0807060504030201), 0x9827364554637281);
38  EXPECT_EQ(value, 0x9827364554637281);
39  }
40 }
41 
43 {
44  {
45  uint64_t value = 3;
47  EXPECT_EQ(value, 1);
48  }
49 
50  {
51  uint64_t value = 0x1827364554637281;
52  EXPECT_EQ(atomic_sub_and_fetch_uint64(&value, 0x0807060504030201), 0x1020304050607080);
53  EXPECT_EQ(value, 0x1020304050607080);
54  }
55 
56  {
57  uint64_t value = 0x9827364554637281;
58  EXPECT_EQ(atomic_sub_and_fetch_uint64(&value, 0x0807060504030201), 0x9020304050607080);
59  EXPECT_EQ(value, 0x9020304050607080);
60  }
61 
62  {
63  uint64_t value = 1;
64  EXPECT_EQ(atomic_sub_and_fetch_uint64(&value, 2), 0xffffffffffffffff);
65  EXPECT_EQ(value, 0xffffffffffffffff);
66  }
67 }
68 
70 {
71  {
72  uint64_t value = 1;
74  EXPECT_EQ(value, 3);
75  }
76 
77  {
78  uint64_t value = 0x1020304050607080;
79  EXPECT_EQ(atomic_fetch_and_add_uint64(&value, 0x0807060504030201), 0x1020304050607080);
80  EXPECT_EQ(value, 0x1827364554637281);
81  }
82 
83  {
84  uint64_t value = 0x9020304050607080;
85  EXPECT_EQ(atomic_fetch_and_add_uint64(&value, 0x0807060504030201), 0x9020304050607080);
86  EXPECT_EQ(value, 0x9827364554637281);
87  }
88 }
89 
91 {
92  {
93  uint64_t value = 3;
95  EXPECT_EQ(value, 1);
96  }
97 
98  {
99  uint64_t value = 0x1827364554637281;
100  EXPECT_EQ(atomic_fetch_and_sub_uint64(&value, 0x0807060504030201), 0x1827364554637281);
101  EXPECT_EQ(value, 0x1020304050607080);
102  }
103 
104  {
105  uint64_t value = 0x9827364554637281;
106  EXPECT_EQ(atomic_fetch_and_sub_uint64(&value, 0x0807060504030201), 0x9827364554637281);
107  EXPECT_EQ(value, 0x9020304050607080);
108  }
109 
110  {
111  uint64_t value = 1;
112  EXPECT_EQ(atomic_fetch_and_sub_uint64(&value, 2), 1);
113  EXPECT_EQ(value, 0xffffffffffffffff);
114  }
115 }
116 
118 {
119  {
120  uint64_t value = 1;
121  EXPECT_EQ(atomic_cas_uint64(&value, 1, 2), 1);
122  EXPECT_EQ(value, 2);
123  }
124 
125  {
126  uint64_t value = 1;
127  EXPECT_EQ(atomic_cas_uint64(&value, 2, 3), 1);
128  EXPECT_EQ(value, 1);
129  }
130 
131  {
132  uint64_t value = 0x1234567890abcdef;
133  EXPECT_EQ(atomic_cas_uint64(&value, 0x1234567890abcdef, 0xfedcba0987654321),
134  0x1234567890abcdef);
135  EXPECT_EQ(value, 0xfedcba0987654321);
136  }
137 
138  {
139  uint64_t value = 0x1234567890abcdef;
140  EXPECT_EQ(atomic_cas_uint64(&value, 0xdeadbeefefefefef, 0xfedcba0987654321),
141  0x1234567890abcdef);
142  EXPECT_EQ(value, 0x1234567890abcdef);
143  }
144 }
145 
148 /* -------------------------------------------------------------------- */
153 {
154  {
155  int64_t value = 1;
156  EXPECT_EQ(atomic_add_and_fetch_int64(&value, 2), 3);
157  EXPECT_EQ(value, 3);
158  }
159 
160  {
161  int64_t value = 0x1020304050607080;
162  EXPECT_EQ(atomic_add_and_fetch_int64(&value, 0x0807060504030201), 0x1827364554637281);
163  EXPECT_EQ(value, 0x1827364554637281);
164  }
165 
166  {
167  int64_t value = -0x1020304050607080;
168  EXPECT_EQ(atomic_add_and_fetch_int64(&value, -0x0807060504030201), -0x1827364554637281);
169  EXPECT_EQ(value, -0x1827364554637281);
170  }
171 }
172 
174 {
175  {
176  int64_t value = 3;
177  EXPECT_EQ(atomic_sub_and_fetch_int64(&value, 2), 1);
178  EXPECT_EQ(value, 1);
179  }
180 
181  {
182  int64_t value = 0x1827364554637281;
183  EXPECT_EQ(atomic_sub_and_fetch_int64(&value, 0x0807060504030201), 0x1020304050607080);
184  EXPECT_EQ(value, 0x1020304050607080);
185  }
186 
187  {
188  int64_t value = -0x1827364554637281;
189  EXPECT_EQ(atomic_sub_and_fetch_int64(&value, -0x0807060504030201), -0x1020304050607080);
190  EXPECT_EQ(value, -0x1020304050607080);
191  }
192 
193  {
194  int64_t value = 1;
195  EXPECT_EQ(atomic_sub_and_fetch_int64(&value, 2), -1);
196  EXPECT_EQ(value, -1);
197  }
198 }
199 
201 {
202  {
203  int64_t value = 1;
204  EXPECT_EQ(atomic_fetch_and_add_int64(&value, 2), 1);
205  EXPECT_EQ(value, 3);
206  }
207 
208  {
209  int64_t value = 0x1020304050607080;
210  EXPECT_EQ(atomic_fetch_and_add_int64(&value, 0x0807060504030201), 0x1020304050607080);
211  EXPECT_EQ(value, 0x1827364554637281);
212  }
213 
214  {
215  int64_t value = -0x1020304050607080;
216  EXPECT_EQ(atomic_fetch_and_add_int64(&value, -0x0807060504030201), -0x1020304050607080);
217  EXPECT_EQ(value, -0x1827364554637281);
218  }
219 }
220 
222 {
223  {
224  int64_t value = 3;
225  EXPECT_EQ(atomic_fetch_and_sub_int64(&value, 2), 3);
226  EXPECT_EQ(value, 1);
227  }
228 
229  {
230  int64_t value = 0x1827364554637281;
231  EXPECT_EQ(atomic_fetch_and_sub_int64(&value, 0x0807060504030201), 0x1827364554637281);
232  EXPECT_EQ(value, 0x1020304050607080);
233  }
234 
235  {
236  int64_t value = -0x1827364554637281;
237  EXPECT_EQ(atomic_fetch_and_sub_int64(&value, -0x0807060504030201), -0x1827364554637281);
238  EXPECT_EQ(value, -0x1020304050607080);
239  }
240 
241  {
242  int64_t value = 1;
243  EXPECT_EQ(atomic_fetch_and_sub_int64(&value, 2), 1);
244  EXPECT_EQ(value, -1);
245  }
246 }
247 
249 {
250  {
251  int64_t value = 1;
252  EXPECT_EQ(atomic_cas_int64(&value, 1, 2), 1);
253  EXPECT_EQ(value, 2);
254  }
255 
256  {
257  int64_t value = 1;
258  EXPECT_EQ(atomic_cas_int64(&value, 2, 3), 1);
259  EXPECT_EQ(value, 1);
260  }
261 
262  // 0xfedcba0987654321 is -0x012345f6789abcdf
263  // 0xdeadbeefefefefef is -0x2152411010101011
264 
265  {
266  int64_t value = 0x1234567890abcdef;
267  EXPECT_EQ(atomic_cas_int64(&value, 0x1234567890abcdef, -0x012345f6789abcdf),
268  0x1234567890abcdef);
269  EXPECT_EQ(value, -0x012345f6789abcdf);
270  }
271 
272  {
273  int64_t value = 0x1234567890abcdef;
274  EXPECT_EQ(atomic_cas_int64(&value, 0x2152411010101011, -0x012345f6789abcdf),
275  0x1234567890abcdef);
276  EXPECT_EQ(value, 0x1234567890abcdef);
277  }
278 }
279 
282 /* -------------------------------------------------------------------- */
287 {
288  {
289  uint32_t value = 1;
290  EXPECT_EQ(atomic_add_and_fetch_uint32(&value, 2), 3);
291  EXPECT_EQ(value, 3);
292  }
293 
294  {
295  uint32_t value = 0x10203040;
296  EXPECT_EQ(atomic_add_and_fetch_uint32(&value, 0x04030201), 0x14233241);
297  EXPECT_EQ(value, 0x14233241);
298  }
299 
300  {
301  uint32_t value = 0x90203040;
302  EXPECT_EQ(atomic_add_and_fetch_uint32(&value, 0x04030201), 0x94233241);
303  EXPECT_EQ(value, 0x94233241);
304  }
305 }
306 
308 {
309  {
310  uint32_t value = 3;
311  EXPECT_EQ(atomic_sub_and_fetch_uint32(&value, 2), 1);
312  EXPECT_EQ(value, 1);
313  }
314 
315  {
316  uint32_t value = 0x14233241;
317  EXPECT_EQ(atomic_sub_and_fetch_uint32(&value, 0x04030201), 0x10203040);
318  EXPECT_EQ(value, 0x10203040);
319  }
320 
321  {
322  uint32_t value = 0x94233241;
323  EXPECT_EQ(atomic_sub_and_fetch_uint32(&value, 0x04030201), 0x90203040);
324  EXPECT_EQ(value, 0x90203040);
325  }
326 
327  {
328  uint32_t value = 1;
329  EXPECT_EQ(atomic_sub_and_fetch_uint32(&value, 2), 0xffffffff);
330  EXPECT_EQ(value, 0xffffffff);
331  }
332 }
333 
335 {
336  {
337  uint32_t value = 1;
338  EXPECT_EQ(atomic_cas_uint32(&value, 1, 2), 1);
339  EXPECT_EQ(value, 2);
340  }
341 
342  {
343  uint32_t value = 1;
344  EXPECT_EQ(atomic_cas_uint32(&value, 2, 3), 1);
345  EXPECT_EQ(value, 1);
346  }
347 
348  {
349  uint32_t value = 0x12345678;
350  EXPECT_EQ(atomic_cas_uint32(&value, 0x12345678, 0x87654321), 0x12345678);
351  EXPECT_EQ(value, 0x87654321);
352  }
353 
354  {
355  uint32_t value = 0x12345678;
356  EXPECT_EQ(atomic_cas_uint32(&value, 0xdeadbeef, 0x87654321), 0x12345678);
357  EXPECT_EQ(value, 0x12345678);
358  }
359 }
360 
362 {
363  {
364  uint32_t value = 1;
365  EXPECT_EQ(atomic_fetch_and_add_uint32(&value, 2), 1);
366  EXPECT_EQ(value, 3);
367  }
368 
369  {
370  uint32_t value = 0x10203040;
371  EXPECT_EQ(atomic_fetch_and_add_uint32(&value, 0x04030201), 0x10203040);
372  EXPECT_EQ(value, 0x14233241);
373  }
374 
375  {
376  uint32_t value = 0x90203040;
377  EXPECT_EQ(atomic_fetch_and_add_uint32(&value, 0x04030201), 0x90203040);
378  EXPECT_EQ(value, 0x94233241);
379  }
380 }
381 
383 {
384  {
385  uint32_t value = 12;
386  EXPECT_EQ(atomic_fetch_and_or_uint32(&value, 5), 12);
387  EXPECT_EQ(value, 13);
388  }
389 
390  {
391  uint32_t value = 0x12345678;
392  EXPECT_EQ(atomic_fetch_and_or_uint32(&value, 0x87654321), 0x12345678);
393  EXPECT_EQ(value, 0x97755779);
394  }
395 
396  {
397  uint32_t value = 0x92345678;
398  EXPECT_EQ(atomic_fetch_and_or_uint32(&value, 0x87654321), 0x92345678);
399  EXPECT_EQ(value, 0x97755779);
400  }
401 }
402 
404 {
405  {
406  uint32_t value = 12;
407  EXPECT_EQ(atomic_fetch_and_and_uint32(&value, 5), 12);
408  EXPECT_EQ(value, 4);
409  }
410 
411  {
412  uint32_t value = 0x12345678;
413  EXPECT_EQ(atomic_fetch_and_and_uint32(&value, 0x87654321), 0x12345678);
414  EXPECT_EQ(value, 0x02244220);
415  }
416 
417  {
418  uint32_t value = 0x92345678;
419  EXPECT_EQ(atomic_fetch_and_and_uint32(&value, 0x87654321), 0x92345678);
420  EXPECT_EQ(value, 0x82244220);
421  }
422 }
423 
430 {
431  {
432  int32_t value = 1;
433  EXPECT_EQ(atomic_add_and_fetch_int32(&value, 2), 3);
434  EXPECT_EQ(value, 3);
435  }
436 
437  {
438  int32_t value = 0x10203040;
439  EXPECT_EQ(atomic_add_and_fetch_int32(&value, 0x04030201), 0x14233241);
440  EXPECT_EQ(value, 0x14233241);
441  }
442 
443  {
444  int32_t value = -0x10203040;
445  EXPECT_EQ(atomic_add_and_fetch_int32(&value, -0x04030201), -0x14233241);
446  EXPECT_EQ(value, -0x14233241);
447  }
448 }
449 
451 {
452  {
453  int32_t value = 3;
454  EXPECT_EQ(atomic_sub_and_fetch_int32(&value, 2), 1);
455  EXPECT_EQ(value, 1);
456  }
457 
458  {
459  int32_t value = 0x14233241;
460  EXPECT_EQ(atomic_sub_and_fetch_int32(&value, 0x04030201), 0x10203040);
461  EXPECT_EQ(value, 0x10203040);
462  }
463 
464  {
465  int32_t value = -0x14233241;
466  EXPECT_EQ(atomic_sub_and_fetch_int32(&value, -0x04030201), -0x10203040);
467  EXPECT_EQ(value, -0x10203040);
468  }
469 
470  {
471  int32_t value = 1;
472  EXPECT_EQ(atomic_sub_and_fetch_int32(&value, 2), 0xffffffff);
473  EXPECT_EQ(value, 0xffffffff);
474  }
475 }
476 
478 {
479  {
480  int32_t value = 1;
481  EXPECT_EQ(atomic_cas_int32(&value, 1, 2), 1);
482  EXPECT_EQ(value, 2);
483  }
484 
485  {
486  int32_t value = 1;
487  EXPECT_EQ(atomic_cas_int32(&value, 2, 3), 1);
488  EXPECT_EQ(value, 1);
489  }
490 
491  // 0x87654321 is -0x789abcdf
492  // 0xdeadbeef is -0x21524111
493 
494  {
495  int32_t value = 0x12345678;
496  EXPECT_EQ(atomic_cas_int32(&value, 0x12345678, -0x789abcdf), 0x12345678);
497  EXPECT_EQ(value, -0x789abcdf);
498  }
499 
500  {
501  int32_t value = 0x12345678;
502  EXPECT_EQ(atomic_cas_int32(&value, -0x21524111, -0x789abcdf), 0x12345678);
503  EXPECT_EQ(value, 0x12345678);
504  }
505 }
506 
508 {
509  {
510  int32_t value = 1;
511  EXPECT_EQ(atomic_fetch_and_add_int32(&value, 2), 1);
512  EXPECT_EQ(value, 3);
513  }
514 
515  {
516  int32_t value = 0x10203040;
517  EXPECT_EQ(atomic_fetch_and_add_int32(&value, 0x04030201), 0x10203040);
518  EXPECT_EQ(value, 0x14233241);
519  }
520 
521  {
522  int32_t value = -0x10203040;
523  EXPECT_EQ(atomic_fetch_and_add_int32(&value, -0x04030201), -0x10203040);
524  EXPECT_EQ(value, -0x14233241);
525  }
526 }
527 
529 {
530  {
531  int32_t value = 12;
532  EXPECT_EQ(atomic_fetch_and_or_int32(&value, 5), 12);
533  EXPECT_EQ(value, 13);
534  }
535 
536  // 0x87654321 is -0x789abcdf
537 
538  {
539  int32_t value = 0x12345678;
540  EXPECT_EQ(atomic_fetch_and_or_int32(&value, -0x789abcdf), 0x12345678);
541  EXPECT_EQ(value, 0x97755779);
542  }
543 }
544 
546 {
547  {
548  int32_t value = 12;
549  EXPECT_EQ(atomic_fetch_and_and_int32(&value, 5), 12);
550  EXPECT_EQ(value, 4);
551  }
552 
553  {
554  int32_t value = 0x12345678;
555  EXPECT_EQ(atomic_fetch_and_and_int32(&value, -0x789abcdf), 0x12345678);
556  EXPECT_EQ(value, 0x02244220);
557  }
558 }
559 
566 {
567  {
568  int16_t value = 12;
569  EXPECT_EQ(atomic_fetch_and_or_int16(&value, 5), 12);
570  EXPECT_EQ(value, 13);
571  }
572 
573  {
574  int16_t value = 0x1234;
575  EXPECT_EQ(atomic_fetch_and_or_int16(&value, -0x5678), 0x1234);
576  EXPECT_EQ(value, -0x4444);
577  }
578 }
579 
581 {
582  {
583  int16_t value = 12;
584  EXPECT_EQ(atomic_fetch_and_and_int16(&value, 5), 12);
585  EXPECT_EQ(value, 4);
586  }
587 
588  {
589  int16_t value = 0x1234;
590  EXPECT_EQ(atomic_fetch_and_and_int16(&value, -0x789A), 0x1234);
591  EXPECT_EQ(value, 0x224);
592  }
593 }
594 
599 {
600  {
601  uint8_t value = 12;
602  EXPECT_EQ(atomic_fetch_and_or_uint8(&value, 5), 12);
603  EXPECT_EQ(value, 13);
604  }
605 }
606 
608 {
609  {
610  uint8_t value = 12;
611  EXPECT_EQ(atomic_fetch_and_and_uint8(&value, 5), 12);
612  EXPECT_EQ(value, 4);
613  }
614 }
615 
622 {
623  {
624  int8_t value = 12;
625  EXPECT_EQ(atomic_fetch_and_or_int8(&value, 5), 12);
626  EXPECT_EQ(value, 13);
627  }
628 }
629 
631 {
632  {
633  int8_t value = 12;
634  EXPECT_EQ(atomic_fetch_and_and_int8(&value, 5), 12);
635  EXPECT_EQ(value, 4);
636  }
637 }
638 
645 {
646  {
647  char value = 12;
648  EXPECT_EQ(atomic_fetch_and_or_char(&value, 5), 12);
649  EXPECT_EQ(value, 13);
650  }
651 }
652 
654 {
655  {
656  char value = 12;
657  EXPECT_EQ(atomic_fetch_and_and_char(&value, 5), 12);
658  EXPECT_EQ(value, 4);
659  }
660 }
661 
668 {
669  /* Make sure alias is implemented. */
670  {
671  size_t value = 1;
672  EXPECT_EQ(atomic_add_and_fetch_z(&value, 2), 3);
673  EXPECT_EQ(value, 3);
674  }
675 
676  /* Make sure alias is using proper bitness. */
677  {
678  const size_t size_t_max = std::numeric_limits<size_t>::max();
679  size_t value = size_t_max - 10;
680  EXPECT_EQ(atomic_add_and_fetch_z(&value, 2), size_t_max - 8);
681  EXPECT_EQ(value, size_t_max - 8);
682  }
683 }
684 
686 {
687  /* Make sure alias is implemented. */
688  {
689  size_t value = 3;
690  EXPECT_EQ(atomic_sub_and_fetch_z(&value, 2), 1);
691  EXPECT_EQ(value, 1);
692  }
693 
694  /* Make sure alias is using proper bitness. */
695  {
696  const size_t size_t_max = std::numeric_limits<size_t>::max();
697  size_t value = size_t_max - 10;
698  EXPECT_EQ(atomic_sub_and_fetch_z(&value, 2), size_t_max - 12);
699  EXPECT_EQ(value, size_t_max - 12);
700  }
701 }
702 
704 {
705  /* Make sure alias is implemented. */
706  {
707  size_t value = 1;
708  EXPECT_EQ(atomic_fetch_and_add_z(&value, 2), 1);
709  EXPECT_EQ(value, 3);
710  }
711 
712  /* Make sure alias is using proper bitness. */
713  {
714  const size_t size_t_max = std::numeric_limits<size_t>::max();
715  size_t value = size_t_max - 10;
716  EXPECT_EQ(atomic_fetch_and_add_z(&value, 2), size_t_max - 10);
717  EXPECT_EQ(value, size_t_max - 8);
718  }
719 }
720 
722 {
723  /* Make sure alias is implemented. */
724  {
725  size_t value = 3;
726  EXPECT_EQ(atomic_fetch_and_sub_z(&value, 2), 3);
727  EXPECT_EQ(value, 1);
728  }
729 
730  /* Make sure alias is using proper bitness. */
731  {
732  const size_t size_t_max = std::numeric_limits<size_t>::max();
733  size_t value = size_t_max - 10;
734  EXPECT_EQ(atomic_fetch_and_sub_z(&value, 2), size_t_max - 10);
735  EXPECT_EQ(value, size_t_max - 12);
736  }
737 }
738 
740 {
741  /* Make sure alias is implemented. */
742  {
743  size_t value = 1;
744  EXPECT_EQ(atomic_cas_z(&value, 1, 2), 1);
745  EXPECT_EQ(value, 2);
746  }
747 
748  /* Make sure alias is using proper bitness. */
749  {
750  const size_t size_t_max = std::numeric_limits<size_t>::max();
751  size_t value = 1;
752  EXPECT_EQ(atomic_cas_z(&value, 1, size_t_max), 1);
753  EXPECT_EQ(value, size_t_max);
754  }
755 }
756 
758 {
759  const size_t size_t_max = std::numeric_limits<size_t>::max();
760 
761  size_t value = 12;
762 
764  EXPECT_EQ(value, 12);
765 
766  EXPECT_EQ(atomic_fetch_and_update_max_z(&value, 24), 12);
767  EXPECT_EQ(value, 24);
768 
769  EXPECT_EQ(atomic_fetch_and_update_max_z(&value, size_t_max), 24);
770  EXPECT_EQ(value, size_t_max);
771 }
772 
779 {
780  /* Make sure alias is implemented. */
781  {
782  unsigned int value = 1;
783  EXPECT_EQ(atomic_add_and_fetch_u(&value, 2), 3);
784  EXPECT_EQ(value, 3);
785  }
786 
787  /* Make sure alias is using proper bitness. */
788  {
789  const unsigned int uint_max = std::numeric_limits<unsigned int>::max();
790  unsigned int value = uint_max - 10;
791  EXPECT_EQ(atomic_add_and_fetch_u(&value, 2), uint_max - 8);
792  EXPECT_EQ(value, uint_max - 8);
793  }
794 }
795 
797 {
798  /* Make sure alias is implemented. */
799  {
800  unsigned int value = 3;
801  EXPECT_EQ(atomic_sub_and_fetch_u(&value, 2), 1);
802  EXPECT_EQ(value, 1);
803  }
804 
805  /* Make sure alias is using proper bitness. */
806  {
807  const unsigned int uint_max = std::numeric_limits<unsigned int>::max();
808  unsigned int value = uint_max - 10;
809  EXPECT_EQ(atomic_sub_and_fetch_u(&value, 2), uint_max - 12);
810  EXPECT_EQ(value, uint_max - 12);
811  }
812 }
813 
815 {
816  /* Make sure alias is implemented. */
817  {
818  unsigned int value = 1;
819  EXPECT_EQ(atomic_fetch_and_add_u(&value, 2), 1);
820  EXPECT_EQ(value, 3);
821  }
822 
823  /* Make sure alias is using proper bitness. */
824  {
825  const unsigned int uint_max = std::numeric_limits<unsigned int>::max();
826  unsigned int value = uint_max - 10;
827  EXPECT_EQ(atomic_fetch_and_add_u(&value, 2), uint_max - 10);
828  EXPECT_EQ(value, uint_max - 8);
829  }
830 }
831 
833 {
834  /* Make sure alias is implemented. */
835  {
836  unsigned int value = 3;
837  EXPECT_EQ(atomic_fetch_and_sub_u(&value, 2), 3);
838  EXPECT_EQ(value, 1);
839  }
840 
841  /* Make sure alias is using proper bitness. */
842  {
843  const unsigned int uint_max = std::numeric_limits<unsigned int>::max();
844  unsigned int value = uint_max - 10;
845  EXPECT_EQ(atomic_fetch_and_sub_u(&value, 2), uint_max - 10);
846  EXPECT_EQ(value, uint_max - 12);
847  }
848 }
849 
851 {
852  /* Make sure alias is implemented. */
853  {
854  unsigned int value = 1;
855  EXPECT_EQ(atomic_cas_u(&value, 1, 2), 1);
856  EXPECT_EQ(value, 2);
857  }
858 
859  /* Make sure alias is using proper bitness. */
860  {
861  const unsigned int uint_max = std::numeric_limits<unsigned int>::max();
862  unsigned int value = 1;
863  EXPECT_EQ(atomic_cas_u(&value, 1, uint_max), 1);
864  EXPECT_EQ(value, uint_max);
865  }
866 }
867 
873 #define INT_AS_PTR(a) reinterpret_cast<void *>((a))
874 
876 {
877  {
878  void *value = INT_AS_PTR(0x7f);
879  EXPECT_EQ(atomic_cas_ptr(&value, INT_AS_PTR(0x7f), INT_AS_PTR(0xef)), INT_AS_PTR(0x7f));
880  EXPECT_EQ(value, INT_AS_PTR(0xef));
881  }
882 }
883 
884 #undef INT_AS_PTR
885 
892 {
893  {
894  float value = 1.234f;
895  EXPECT_EQ(atomic_cas_float(&value, 1.234f, 2.71f), 1.234f);
896  EXPECT_EQ(value, 2.71f);
897  }
898 }
899 
901 {
902  {
903  float value = 1.23f;
904  EXPECT_NEAR(atomic_add_and_fetch_fl(&value, 2.71f), 3.94f, 1e-8f);
905  EXPECT_NEAR(value, 3.94f, 1e-8f);
906  }
907 }
908 
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 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 size_t atomic_sub_and_fetch_z(size_t *p, size_t x)
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 float atomic_add_and_fetch_fl(float *p, const float x)
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 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 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 void * atomic_cas_ptr(void **v, void *old, void *_new)
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 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 uint64_t atomic_sub_and_fetch_uint64(uint64_t *p, uint64_t x)
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 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)
Definition: atomic_test.cc:873
TEST(atomic, atomic_add_and_fetch_uint64)
Definition: atomic_test.cc:21
signed short int16_t
Definition: stdint.h:79
unsigned int uint32_t
Definition: stdint.h:83
__int64 int64_t
Definition: stdint.h:92
signed int int32_t
Definition: stdint.h:80
unsigned char uint8_t
Definition: stdint.h:81
unsigned __int64 uint64_t
Definition: stdint.h:93
signed char int8_t
Definition: stdint.h:78
float max