File indexing completed on 2025-05-11 08:24:12
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038 #ifndef _RTEMS_SCORE_ATOMIC_H
0039 #define _RTEMS_SCORE_ATOMIC_H
0040
0041 #include <rtems/score/basedefs.h>
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058 #ifdef RTEMS_SMP
0059 #if defined(__cplusplus) \
0060 && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9))
0061
0062
0063
0064
0065
0066
0067
0068
0069 #include <atomic>
0070 #define _RTEMS_SCORE_ATOMIC_USE_ATOMIC
0071 #else
0072 #include <stdatomic.h>
0073 #define _RTEMS_SCORE_ATOMIC_USE_STDATOMIC
0074 #endif
0075 #else
0076 #include <rtems/score/isrlevel.h>
0077 #endif
0078
0079 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0080
0081 typedef unsigned int Atomic_Uint;
0082
0083 typedef unsigned long Atomic_Ulong;
0084
0085 typedef uintptr_t Atomic_Uintptr;
0086
0087 typedef std::atomic_flag Atomic_Flag;
0088
0089 typedef std::memory_order Atomic_Order;
0090
0091 #define ATOMIC_ORDER_RELAXED std::memory_order_relaxed
0092
0093 #define ATOMIC_ORDER_ACQUIRE std::memory_order_acquire
0094
0095 #define ATOMIC_ORDER_RELEASE std::memory_order_release
0096
0097 #define ATOMIC_ORDER_ACQ_REL std::memory_order_acq_rel
0098
0099 #define ATOMIC_ORDER_SEQ_CST std::memory_order_seq_cst
0100
0101 #define ATOMIC_INITIALIZER_UINT( value ) ATOMIC_VAR_INIT( value )
0102
0103 #define ATOMIC_INITIALIZER_ULONG( value ) ATOMIC_VAR_INIT( value )
0104
0105 #define ATOMIC_INITIALIZER_UINTPTR( value ) ATOMIC_VAR_INIT( value )
0106
0107 #define ATOMIC_INITIALIZER_FLAG ATOMIC_FLAG_INIT
0108
0109 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0110
0111 typedef atomic_uint Atomic_Uint;
0112
0113 typedef atomic_ulong Atomic_Ulong;
0114
0115 typedef atomic_uintptr_t Atomic_Uintptr;
0116
0117 typedef atomic_flag Atomic_Flag;
0118
0119 typedef memory_order Atomic_Order;
0120
0121 #define ATOMIC_ORDER_RELAXED memory_order_relaxed
0122
0123 #define ATOMIC_ORDER_ACQUIRE memory_order_acquire
0124
0125 #define ATOMIC_ORDER_RELEASE memory_order_release
0126
0127 #define ATOMIC_ORDER_ACQ_REL memory_order_acq_rel
0128
0129 #define ATOMIC_ORDER_SEQ_CST memory_order_seq_cst
0130
0131 #define ATOMIC_INITIALIZER_UINT( value ) ATOMIC_VAR_INIT( value )
0132
0133 #define ATOMIC_INITIALIZER_ULONG( value ) ATOMIC_VAR_INIT( value )
0134
0135 #define ATOMIC_INITIALIZER_UINTPTR( value ) ATOMIC_VAR_INIT( value )
0136
0137 #define ATOMIC_INITIALIZER_FLAG ATOMIC_FLAG_INIT
0138
0139 #else
0140
0141 typedef unsigned int Atomic_Uint;
0142
0143 typedef unsigned long Atomic_Ulong;
0144
0145 typedef uintptr_t Atomic_Uintptr;
0146
0147 typedef bool Atomic_Flag;
0148
0149 typedef int Atomic_Order;
0150
0151 #define ATOMIC_ORDER_RELAXED 0
0152
0153 #define ATOMIC_ORDER_ACQUIRE 2
0154
0155 #define ATOMIC_ORDER_RELEASE 3
0156
0157 #define ATOMIC_ORDER_ACQ_REL 4
0158
0159 #define ATOMIC_ORDER_SEQ_CST 5
0160
0161 #define ATOMIC_INITIALIZER_UINT( value ) ( value )
0162
0163 #define ATOMIC_INITIALIZER_ULONG( value ) ( value )
0164
0165 #define ATOMIC_INITIALIZER_UINTPTR( value ) ( value )
0166
0167 #define ATOMIC_INITIALIZER_FLAG false
0168
0169 #endif
0170
0171
0172
0173
0174
0175
0176 static inline void _Atomic_Fence( Atomic_Order order )
0177 {
0178 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0179 std::atomic_thread_fence( order );
0180 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0181 atomic_thread_fence( order );
0182 #else
0183 (void) order;
0184 RTEMS_COMPILER_MEMORY_BARRIER();
0185 #endif
0186 }
0187
0188
0189
0190
0191
0192
0193
0194 static inline void _Atomic_Init_uint( Atomic_Uint *obj, unsigned int desired )
0195 {
0196 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0197 reinterpret_cast<std::atomic_uint *>( obj )->store( desired );
0198 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0199 atomic_init( obj, desired );
0200 #else
0201 *obj = desired;
0202 #endif
0203 }
0204
0205
0206
0207
0208
0209
0210
0211 static inline void _Atomic_Init_ulong( Atomic_Ulong *obj, unsigned long desired )
0212 {
0213 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0214 reinterpret_cast<std::atomic_ulong *>( obj )->store( desired );
0215 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0216 atomic_init( obj, desired );
0217 #else
0218 *obj = desired;
0219 #endif
0220 }
0221
0222
0223
0224
0225
0226
0227
0228 static inline void _Atomic_Init_uintptr( Atomic_Uintptr *obj, uintptr_t desired )
0229 {
0230 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0231 reinterpret_cast<std::atomic_uintptr_t *>( obj )->store( desired );
0232 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0233 atomic_init( obj, desired );
0234 #else
0235 *obj = desired;
0236 #endif
0237 }
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247 static inline unsigned int _Atomic_Load_uint( const Atomic_Uint *obj, Atomic_Order order )
0248 {
0249 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0250 return reinterpret_cast<const std::atomic_uint *>( obj )->load( order );
0251 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0252 return atomic_load_explicit( obj, order );
0253 #else
0254 unsigned int val;
0255
0256 (void) order;
0257 val = *obj;
0258 RTEMS_COMPILER_MEMORY_BARRIER();
0259
0260 return val;
0261 #endif
0262 }
0263
0264
0265
0266
0267
0268
0269
0270
0271
0272 static inline unsigned long _Atomic_Load_ulong( const Atomic_Ulong *obj, Atomic_Order order )
0273 {
0274 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0275 return reinterpret_cast<const std::atomic_ulong *>( obj )->load( order );
0276 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0277 return atomic_load_explicit( obj, order );
0278 #else
0279 unsigned long val;
0280
0281 (void) order;
0282 val = *obj;
0283 RTEMS_COMPILER_MEMORY_BARRIER();
0284
0285 return val;
0286 #endif
0287 }
0288
0289
0290
0291
0292
0293
0294
0295
0296
0297 static inline uintptr_t _Atomic_Load_uintptr( const Atomic_Uintptr *obj, Atomic_Order order )
0298 {
0299 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0300 return reinterpret_cast<const std::atomic_uintptr_t *>( obj )->load( order );
0301 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0302 return atomic_load_explicit( obj, order );
0303 #else
0304 uintptr_t val;
0305
0306 (void) order;
0307 val = *obj;
0308 RTEMS_COMPILER_MEMORY_BARRIER();
0309
0310 return val;
0311 #endif
0312 }
0313
0314
0315
0316
0317
0318
0319
0320
0321 static inline void _Atomic_Store_uint( Atomic_Uint *obj, unsigned int desired, Atomic_Order order )
0322 {
0323 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0324 reinterpret_cast<std::atomic_uint *>( obj )->store( desired, order );
0325 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0326 atomic_store_explicit( obj, desired, order );
0327 #else
0328 (void) order;
0329 RTEMS_COMPILER_MEMORY_BARRIER();
0330 *obj = desired;
0331 #endif
0332 }
0333
0334
0335
0336
0337
0338
0339
0340
0341 static inline void _Atomic_Store_ulong( Atomic_Ulong *obj, unsigned long desired, Atomic_Order order )
0342 {
0343 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0344 reinterpret_cast<std::atomic_ulong *>( obj )->store( desired, order );
0345 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0346 atomic_store_explicit( obj, desired, order );
0347 #else
0348 (void) order;
0349 RTEMS_COMPILER_MEMORY_BARRIER();
0350 *obj = desired;
0351 #endif
0352 }
0353
0354
0355
0356
0357
0358
0359
0360
0361 static inline void _Atomic_Store_uintptr( Atomic_Uintptr *obj, uintptr_t desired, Atomic_Order order )
0362 {
0363 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0364 reinterpret_cast<std::atomic_uintptr_t *>( obj )->store( desired, order );
0365 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0366 atomic_store_explicit( obj, desired, order );
0367 #else
0368 (void) order;
0369 RTEMS_COMPILER_MEMORY_BARRIER();
0370 *obj = desired;
0371 #endif
0372 }
0373
0374
0375
0376
0377
0378
0379
0380
0381
0382
0383 static inline unsigned int _Atomic_Fetch_add_uint( Atomic_Uint *obj, unsigned int arg, Atomic_Order order )
0384 {
0385 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0386 return reinterpret_cast<std::atomic_uint *>( obj )->fetch_add( arg, order );
0387 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0388 return atomic_fetch_add_explicit( obj, arg, order );
0389 #else
0390 unsigned int val;
0391 ISR_Level level;
0392
0393 (void) order;
0394 _ISR_Local_disable( level );
0395 val = *obj;
0396 *obj = val + arg;
0397 _ISR_Local_enable( level );
0398
0399 return val;
0400 #endif
0401 }
0402
0403
0404
0405
0406
0407
0408
0409
0410
0411
0412 static inline unsigned long _Atomic_Fetch_add_ulong( Atomic_Ulong *obj, unsigned long arg, Atomic_Order order )
0413 {
0414 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0415 return reinterpret_cast<std::atomic_ulong *>( obj )->fetch_add( arg, order );
0416 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0417 return atomic_fetch_add_explicit( obj, arg, order );
0418 #else
0419 unsigned long val;
0420 ISR_Level level;
0421
0422 (void) order;
0423 _ISR_Local_disable( level );
0424 val = *obj;
0425 *obj = val + arg;
0426 _ISR_Local_enable( level );
0427
0428 return val;
0429 #endif
0430 }
0431
0432
0433
0434
0435
0436
0437
0438
0439
0440
0441 static inline uintptr_t _Atomic_Fetch_add_uintptr( Atomic_Uintptr *obj, uintptr_t arg, Atomic_Order order )
0442 {
0443 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0444 return reinterpret_cast<std::atomic_uintptr_t *>( obj )->fetch_add( arg, order );
0445 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0446 return atomic_fetch_add_explicit( obj, arg, order );
0447 #else
0448 uintptr_t val;
0449 ISR_Level level;
0450
0451 (void) order;
0452 _ISR_Local_disable( level );
0453 val = *obj;
0454 *obj = val + arg;
0455 _ISR_Local_enable( level );
0456
0457 return val;
0458 #endif
0459 }
0460
0461
0462
0463
0464
0465
0466
0467
0468
0469
0470 static inline unsigned int _Atomic_Fetch_sub_uint( Atomic_Uint *obj, unsigned int arg, Atomic_Order order )
0471 {
0472 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0473 return reinterpret_cast<std::atomic_uint *>( obj )->fetch_sub( arg, order );
0474 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0475 return atomic_fetch_sub_explicit( obj, arg, order );
0476 #else
0477 unsigned int val;
0478 ISR_Level level;
0479
0480 (void) order;
0481 _ISR_Local_disable( level );
0482 val = *obj;
0483 *obj = val - arg;
0484 _ISR_Local_enable( level );
0485
0486 return val;
0487 #endif
0488 }
0489
0490
0491
0492
0493
0494
0495
0496
0497
0498
0499 static inline unsigned long _Atomic_Fetch_sub_ulong( Atomic_Ulong *obj, unsigned long arg, Atomic_Order order )
0500 {
0501 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0502 return reinterpret_cast<std::atomic_ulong *>( obj )->fetch_sub( arg, order );
0503 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0504 return atomic_fetch_sub_explicit( obj, arg, order );
0505 #else
0506 unsigned long val;
0507 ISR_Level level;
0508
0509 (void) order;
0510 _ISR_Local_disable( level );
0511 val = *obj;
0512 *obj = val - arg;
0513 _ISR_Local_enable( level );
0514
0515 return val;
0516 #endif
0517 }
0518
0519
0520
0521
0522
0523
0524
0525
0526
0527
0528 static inline uintptr_t _Atomic_Fetch_sub_uintptr( Atomic_Uintptr *obj, uintptr_t arg, Atomic_Order order )
0529 {
0530 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0531 return reinterpret_cast<std::atomic_uintptr_t *>( obj )->fetch_sub( arg, order );
0532 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0533 return atomic_fetch_sub_explicit( obj, arg, order );
0534 #else
0535 uintptr_t val;
0536 ISR_Level level;
0537
0538 (void) order;
0539 _ISR_Local_disable( level );
0540 val = *obj;
0541 *obj = val - arg;
0542 _ISR_Local_enable( level );
0543
0544 return val;
0545 #endif
0546 }
0547
0548
0549
0550
0551
0552
0553
0554
0555
0556
0557 static inline unsigned int _Atomic_Fetch_or_uint( Atomic_Uint *obj, unsigned int arg, Atomic_Order order )
0558 {
0559 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0560 return reinterpret_cast<std::atomic_uint *>( obj )->fetch_or( arg, order );
0561 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0562 return atomic_fetch_or_explicit( obj, arg, order );
0563 #else
0564 unsigned int val;
0565 ISR_Level level;
0566
0567 (void) order;
0568 _ISR_Local_disable( level );
0569 val = *obj;
0570 *obj = val | arg;
0571 _ISR_Local_enable( level );
0572
0573 return val;
0574 #endif
0575 }
0576
0577
0578
0579
0580
0581
0582
0583
0584
0585
0586 static inline unsigned long _Atomic_Fetch_or_ulong( Atomic_Ulong *obj, unsigned long arg, Atomic_Order order )
0587 {
0588 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0589 return reinterpret_cast<std::atomic_ulong *>( obj )->fetch_or( arg, order );
0590 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0591 return atomic_fetch_or_explicit( obj, arg, order );
0592 #else
0593 unsigned long val;
0594 ISR_Level level;
0595
0596 (void) order;
0597 _ISR_Local_disable( level );
0598 val = *obj;
0599 *obj = val | arg;
0600 _ISR_Local_enable( level );
0601
0602 return val;
0603 #endif
0604 }
0605
0606
0607
0608
0609
0610
0611
0612
0613
0614
0615 static inline uintptr_t _Atomic_Fetch_or_uintptr( Atomic_Uintptr *obj, uintptr_t arg, Atomic_Order order )
0616 {
0617 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0618 return reinterpret_cast<std::atomic_uintptr_t *>( obj )->fetch_or( arg, order );
0619 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0620 return atomic_fetch_or_explicit( obj, arg, order );
0621 #else
0622 uintptr_t val;
0623 ISR_Level level;
0624
0625 (void) order;
0626 _ISR_Local_disable( level );
0627 val = *obj;
0628 *obj = val | arg;
0629 _ISR_Local_enable( level );
0630
0631 return val;
0632 #endif
0633 }
0634
0635
0636
0637
0638
0639
0640
0641
0642
0643
0644 static inline unsigned int _Atomic_Fetch_and_uint( Atomic_Uint *obj, unsigned int arg, Atomic_Order order )
0645 {
0646 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0647 return reinterpret_cast<std::atomic_uint *>( obj )->fetch_and( arg, order );
0648 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0649 return atomic_fetch_and_explicit( obj, arg, order );
0650 #else
0651 unsigned int val;
0652 ISR_Level level;
0653
0654 (void) order;
0655 _ISR_Local_disable( level );
0656 val = *obj;
0657 *obj = val & arg;
0658 _ISR_Local_enable( level );
0659
0660 return val;
0661 #endif
0662 }
0663
0664
0665
0666
0667
0668
0669
0670
0671
0672
0673 static inline unsigned long _Atomic_Fetch_and_ulong( Atomic_Ulong *obj, unsigned long arg, Atomic_Order order )
0674 {
0675 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0676 return reinterpret_cast<std::atomic_ulong *>( obj )->fetch_and( arg, order );
0677 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0678 return atomic_fetch_and_explicit( obj, arg, order );
0679 #else
0680 unsigned long val;
0681 ISR_Level level;
0682
0683 (void) order;
0684 _ISR_Local_disable( level );
0685 val = *obj;
0686 *obj = val & arg;
0687 _ISR_Local_enable( level );
0688
0689 return val;
0690 #endif
0691 }
0692
0693
0694
0695
0696
0697
0698
0699
0700
0701
0702 static inline uintptr_t _Atomic_Fetch_and_uintptr( Atomic_Uintptr *obj, uintptr_t arg, Atomic_Order order )
0703 {
0704 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0705 return reinterpret_cast<std::atomic_uintptr_t *>( obj )->fetch_and( arg, order );
0706 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0707 return atomic_fetch_and_explicit( obj, arg, order );
0708 #else
0709 uintptr_t val;
0710 ISR_Level level;
0711
0712 (void) order;
0713 _ISR_Local_disable( level );
0714 val = *obj;
0715 *obj = val & arg;
0716 _ISR_Local_enable( level );
0717
0718 return val;
0719 #endif
0720 }
0721
0722
0723
0724
0725
0726
0727
0728
0729
0730
0731 static inline unsigned int _Atomic_Exchange_uint( Atomic_Uint *obj, unsigned int desired, Atomic_Order order )
0732 {
0733 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0734 return reinterpret_cast<std::atomic_uint *>( obj )->exchange( desired, order );
0735 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0736 return atomic_exchange_explicit( obj, desired, order );
0737 #else
0738 unsigned int val;
0739 ISR_Level level;
0740
0741 (void) order;
0742 _ISR_Local_disable( level );
0743 val = *obj;
0744 *obj = desired;
0745 _ISR_Local_enable( level );
0746
0747 return val;
0748 #endif
0749 }
0750
0751
0752
0753
0754
0755
0756
0757
0758
0759
0760 static inline unsigned long _Atomic_Exchange_ulong( Atomic_Ulong *obj, unsigned long desired, Atomic_Order order )
0761 {
0762 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0763 return reinterpret_cast<std::atomic_ulong *>( obj )->exchange( desired, order );
0764 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0765 return atomic_exchange_explicit( obj, desired, order );
0766 #else
0767 unsigned long val;
0768 ISR_Level level;
0769
0770 (void) order;
0771 _ISR_Local_disable( level );
0772 val = *obj;
0773 *obj = desired;
0774 _ISR_Local_enable( level );
0775
0776 return val;
0777 #endif
0778 }
0779
0780
0781
0782
0783
0784
0785
0786
0787
0788
0789 static inline uintptr_t _Atomic_Exchange_uintptr( Atomic_Uintptr *obj, uintptr_t desired, Atomic_Order order )
0790 {
0791 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0792 return reinterpret_cast<std::atomic_uintptr_t *>( obj )->exchange( desired, order );
0793 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0794 return atomic_exchange_explicit( obj, desired, order );
0795 #else
0796 uintptr_t val;
0797 ISR_Level level;
0798
0799 (void) order;
0800 _ISR_Local_disable( level );
0801 val = *obj;
0802 *obj = desired;
0803 _ISR_Local_enable( level );
0804
0805 return val;
0806 #endif
0807 }
0808
0809
0810
0811
0812
0813
0814
0815
0816
0817
0818
0819
0820
0821
0822
0823
0824
0825
0826 static inline bool _Atomic_Compare_exchange_uint( Atomic_Uint *obj, unsigned int *expected, unsigned int desired, Atomic_Order succ, Atomic_Order fail )
0827 {
0828 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0829 return reinterpret_cast<std::atomic_uint *>( obj )->compare_exchange_strong( *expected, desired, succ, fail );
0830 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0831 return atomic_compare_exchange_strong_explicit( obj, expected, desired, succ, fail );
0832 #else
0833 bool success;
0834 ISR_Level level;
0835 unsigned int actual;
0836
0837 (void) succ;
0838 (void) fail;
0839 _ISR_Local_disable( level );
0840 actual = *obj;
0841 success = ( actual == *expected );
0842 if ( success ) {
0843 *obj = desired;
0844 } else {
0845 *expected = actual;
0846 }
0847 _ISR_Local_enable( level );
0848
0849 return success;
0850 #endif
0851 }
0852
0853
0854
0855
0856
0857
0858
0859
0860
0861
0862
0863
0864
0865
0866
0867
0868
0869
0870 static inline bool _Atomic_Compare_exchange_ulong( Atomic_Ulong *obj, unsigned long *expected, unsigned long desired, Atomic_Order succ, Atomic_Order fail )
0871 {
0872 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0873 return reinterpret_cast<std::atomic_ulong *>( obj )->compare_exchange_strong( *expected, desired, succ, fail );
0874 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0875 return atomic_compare_exchange_strong_explicit( obj, expected, desired, succ, fail );
0876 #else
0877 bool success;
0878 ISR_Level level;
0879 unsigned long actual;
0880
0881 (void) succ;
0882 (void) fail;
0883 _ISR_Local_disable( level );
0884 actual = *obj;
0885 success = ( actual == *expected );
0886 if ( success ) {
0887 *obj = desired;
0888 } else {
0889 *expected = actual;
0890 }
0891 _ISR_Local_enable( level );
0892
0893 return success;
0894 #endif
0895 }
0896
0897
0898
0899
0900
0901
0902
0903
0904
0905
0906
0907
0908
0909
0910
0911
0912
0913
0914 static inline bool _Atomic_Compare_exchange_uintptr( Atomic_Uintptr *obj, uintptr_t *expected, uintptr_t desired, Atomic_Order succ, Atomic_Order fail )
0915 {
0916 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0917 return reinterpret_cast<std::atomic_uintptr_t *>( obj )->compare_exchange_strong( *expected, desired, succ, fail );
0918 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0919 return atomic_compare_exchange_strong_explicit( obj, expected, desired, succ, fail );
0920 #else
0921 bool success;
0922 ISR_Level level;
0923 uintptr_t actual;
0924
0925 (void) succ;
0926 (void) fail;
0927 _ISR_Local_disable( level );
0928 actual = *obj;
0929 success = ( actual == *expected );
0930 if ( success ) {
0931 *obj = desired;
0932 } else {
0933 *expected = actual;
0934 }
0935 _ISR_Local_enable( level );
0936
0937 return success;
0938 #endif
0939 }
0940
0941
0942
0943
0944
0945
0946
0947 static inline void _Atomic_Flag_clear( Atomic_Flag *obj, Atomic_Order order )
0948 {
0949 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0950 obj->clear( order );
0951 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0952 atomic_flag_clear_explicit( obj, order );
0953 #else
0954 (void) order;
0955 *obj = false;
0956 #endif
0957 }
0958
0959
0960
0961
0962
0963
0964
0965
0966
0967
0968 static inline bool _Atomic_Flag_test_and_set( Atomic_Flag *obj, Atomic_Order order )
0969 {
0970 #if defined(_RTEMS_SCORE_ATOMIC_USE_ATOMIC)
0971 return obj->test_and_set( order );
0972 #elif defined(_RTEMS_SCORE_ATOMIC_USE_STDATOMIC)
0973 return atomic_flag_test_and_set_explicit( obj, order );
0974 #else
0975 bool flag;
0976 ISR_Level level;
0977
0978 (void) order;
0979 _ISR_Local_disable( level );
0980 flag = *obj;
0981 *obj = true;
0982 _ISR_Local_enable( level );
0983
0984 return flag;
0985 #endif
0986 }
0987
0988
0989
0990 #endif