nfs-ganesha 1.4
|
00001 /* 00002 * Copyright © 2012 Linux Box Corporation 00003 * 00004 * This program is free software; you can redistribute it and/or 00005 * modify it under the terms of the GNU Lesser General Public License 00006 * as published by the Free Software Foundation; either version 3 of 00007 * the License, or (at your option) any later version. 00008 * 00009 * This program is distributed in the hope that it will be useful, but 00010 * WITHOUT ANY WARRANTY; without even the implied warranty of 00011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 * Lesser General Public License for more details. 00013 * 00014 * You should have received a copy of the GNU Lesser General Public 00015 * License along with this library; if not, write to the Free Software 00016 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 00017 * 02110-1301 USA 00018 * 00019 * --------------------------------------- 00020 */ 00021 00033 #ifndef _ABSTRACT_ATOMIC_H 00034 #define _ABSTRACT_ATOMIC_H 00035 #include <stddef.h> 00036 #include <stdint.h> 00037 00038 #ifndef __GNUC__ 00039 #error Please edit abstract_atomic.h and impelment support for \ 00040 non-GNU compilers. 00041 #else /* __GNUC__ */ 00042 #define ATOMIC_GCC_VERSION (__GNUC__ * 10000 \ 00043 + __GNUC_MINOR__ * 100 \ 00044 + __GNUC_PATCHLEVEL__) 00045 00046 #if ((ATOMIC_GCC_VERSION) >= 40700) 00047 #define GCC_ATOMIC_FUNCTIONS 1 00048 #elif ((ATOMIC_GCC_VERSION) >= 40100) 00049 #define GCC_SYNC_FUNCTIONS 1 00050 #else 00051 #error This verison of GCC does not support atomics. 00052 #endif /* Version check */ 00053 #endif /* __GNUC__ */ 00054 00055 /* 00056 * Increment/decrement 00057 */ 00058 00068 #ifdef GCC_ATOMIC_FUNCTIONS 00069 static inline int64_t 00070 atomic_add_int64_t(int64_t *augend, uint64_t addend) 00071 { 00072 return __atomic_add_fetch(augend, addend, __ATOMIC_SEQ_CST); 00073 } 00074 #elif defined(GCC_SYNC_FUNCTIONS) 00075 static inline int64_t 00076 atomic_add_int64_t(int64_t *augend, uint64_t addend) 00077 { 00078 return __sync_fetch_and_add(augend, addend); 00079 } 00080 #endif 00081 00090 static inline int64_t 00091 atomic_inc_int64_t(int64_t *var) 00092 { 00093 return atomic_add_int64_t(var, 1); 00094 } 00095 00105 #ifdef GCC_ATOMIC_FUNCTIONS 00106 static inline int64_t 00107 atomic_sub_int64_t(int64_t *minuend, uint64_t subtrahend) 00108 { 00109 return __atomic_sub_fetch(minuend, subtrahend, __ATOMIC_SEQ_CST); 00110 } 00111 #elif defined(GCC_SYNC_FUNCTIONS) 00112 static inline int64_t 00113 atomic_sub_int64_t(int64_t *minuend, uint64_t subtrahend) 00114 { 00115 return __sync_fetch_and_sub(minuend, subtrahend); 00116 } 00117 #endif 00118 00127 static inline int64_t 00128 atomic_dec_int64_t(int64_t *var) 00129 { 00130 return atomic_sub_int64_t(var, 1); 00131 } 00132 00142 #ifdef GCC_ATOMIC_FUNCTIONS 00143 static inline uint64_t 00144 atomic_add_uint64_t(uint64_t *augend, uint64_t addend) 00145 { 00146 return __atomic_add_fetch(augend, addend, __ATOMIC_SEQ_CST); 00147 } 00148 #elif defined(GCC_SYNC_FUNCTIONS) 00149 static inline uint64_t 00150 atomic_add_uint64_t(uint64_t *augend, uint64_t addend) 00151 { 00152 return __sync_fetch_and_add(augend, addend); 00153 } 00154 #endif 00155 00164 static inline uint64_t 00165 atomic_inc_uint64_t(uint64_t *var) 00166 { 00167 return atomic_add_uint64_t(var, 1); 00168 } 00169 00179 #ifdef GCC_ATOMIC_FUNCTIONS 00180 static inline uint64_t 00181 atomic_sub_uint64_t(uint64_t *minuend, uint64_t subtrahend) 00182 { 00183 return __atomic_sub_fetch(minuend, subtrahend, __ATOMIC_SEQ_CST); 00184 } 00185 #elif defined(GCC_SYNC_FUNCTIONS) 00186 static inline uint64_t 00187 atomic_sub_uint64_t(uint64_t *minuend, uint64_t subtrahend) 00188 { 00189 return __sync_fetch_and_sub(minuend, subtrahend); 00190 } 00191 #endif 00192 00201 static inline uint64_t 00202 atomic_dec_uint64_t(uint64_t *var) 00203 { 00204 return atomic_sub_uint64_t(var, 1); 00205 } 00206 00216 #ifdef GCC_ATOMIC_FUNCTIONS 00217 static inline int32_t 00218 atomic_add_int32_t(int32_t *augend, uint32_t addend) 00219 { 00220 return __atomic_add_fetch(augend, addend, __ATOMIC_SEQ_CST); 00221 } 00222 #elif defined(GCC_SYNC_FUNCTIONS) 00223 static inline int32_t 00224 atomic_add_int32_t(int32_t *augend, uint32_t addend) 00225 { 00226 return __sync_fetch_and_add(augend, addend); 00227 } 00228 #endif 00229 00238 static inline int32_t 00239 atomic_inc_int32_t(int32_t *var) 00240 { 00241 return atomic_add_int32_t(var, 1); 00242 } 00243 00253 #ifdef GCC_ATOMIC_FUNCTIONS 00254 static inline int32_t 00255 atomic_sub_int32_t(int32_t *minuend, uint32_t subtrahend) 00256 { 00257 return __atomic_sub_fetch(minuend, subtrahend, __ATOMIC_SEQ_CST); 00258 } 00259 #elif defined(GCC_SYNC_FUNCTIONS) 00260 static inline int32_t 00261 atomic_sub_int32_t(int32_t *minuend, uint32_t subtrahend) 00262 { 00263 return __sync_fetch_and_sub(minuend, subtrahend); 00264 } 00265 #endif 00266 00275 static inline int32_t 00276 atomic_dec_int32_t(int32_t *var) 00277 { 00278 return atomic_sub_int32_t(var, 1); 00279 } 00280 00290 #ifdef GCC_ATOMIC_FUNCTIONS 00291 static inline uint32_t 00292 atomic_add_uint32_t(uint32_t *augend, uint32_t addend) 00293 { 00294 return __atomic_add_fetch(augend, addend, __ATOMIC_SEQ_CST); 00295 } 00296 #elif defined(GCC_SYNC_FUNCTIONS) 00297 static inline uint32_t 00298 atomic_add_uint32_t(uint32_t *augend, uint32_t addend) 00299 { 00300 return __sync_fetch_and_add(augend, addend); 00301 } 00302 #endif 00303 00312 static inline uint32_t 00313 atomic_inc_uint32_t(uint32_t *var) 00314 { 00315 return atomic_add_uint32_t(var, 1); 00316 } 00317 00326 #ifdef GCC_ATOMIC_FUNCTIONS 00327 static inline uint32_t 00328 atomic_sub_uint32_t(uint32_t *var, uint32_t sub) 00329 { 00330 return __atomic_sub_fetch(var, sub, __ATOMIC_SEQ_CST); 00331 } 00332 #elif defined(GCC_SYNC_FUNCTIONS) 00333 static inline uint32_t 00334 atomic_sub_uint32_t(uint32_t *var, uint32_t sub) 00335 { 00336 return __sync_fetch_and_sub(var, sub); 00337 } 00338 #endif 00339 00348 static inline uint32_t 00349 atomic_dec_uint32_t(uint32_t *var) 00350 { 00351 return atomic_sub_uint32_t(var, 1); 00352 } 00353 00363 #ifdef GCC_ATOMIC_FUNCTIONS 00364 static inline int16_t 00365 atomic_add_int16_t(int16_t *augend, uint16_t addend) 00366 { 00367 return __atomic_add_fetch(augend, addend, __ATOMIC_SEQ_CST); 00368 } 00369 #elif defined(GCC_SYNC_FUNCTIONS) 00370 static inline int16_t 00371 atomic_add_int16_t(int16_t *augend, uint16_t addend) 00372 { 00373 return __sync_fetch_and_add(augend, addend); 00374 } 00375 #endif 00376 00385 static inline int16_t 00386 atomic_inc_int16_t(int16_t *var) 00387 { 00388 return atomic_add_int16_t(var, 1); 00389 } 00390 00400 #ifdef GCC_ATOMIC_FUNCTIONS 00401 static inline int16_t 00402 atomic_sub_int16_t(int16_t *minuend, uint16_t subtrahend) 00403 { 00404 return __atomic_sub_fetch(minuend, subtrahend, __ATOMIC_SEQ_CST); 00405 } 00406 #elif defined(GCC_SYNC_FUNCTIONS) 00407 static inline int16_t 00408 atomic_sub_int16_t(int16_t *minuend, uint16_t subtrahend) 00409 { 00410 return __sync_fetch_and_sub(minuend, subtrahend); 00411 } 00412 #endif 00413 00422 static inline int16_t 00423 atomic_dec_int16_t(int16_t *var) 00424 { 00425 return atomic_sub_int16_t(var, 1); 00426 } 00427 00437 #ifdef GCC_ATOMIC_FUNCTIONS 00438 static inline uint16_t 00439 atomic_add_uint16_t(uint16_t *augend, uint16_t addend) 00440 { 00441 return __atomic_add_fetch(augend, addend, __ATOMIC_SEQ_CST); 00442 } 00443 #elif defined(GCC_SYNC_FUNCTIONS) 00444 static inline uint16_t 00445 atomic_add_uint16_t(uint16_t *augend, uint16_t addend) 00446 { 00447 return __sync_fetch_and_add(augend, addend); 00448 } 00449 #endif 00450 00459 static inline uint16_t 00460 atomic_inc_uint16_t(uint16_t *var) 00461 { 00462 return atomic_add_uint16_t(var, 1); 00463 } 00464 00474 #ifdef GCC_ATOMIC_FUNCTIONS 00475 static inline uint16_t 00476 atomic_sub_uint16_t(uint16_t *minuend, uint16_t subtrahend) 00477 { 00478 return __atomic_sub_fetch(minuend, subtrahend, __ATOMIC_SEQ_CST); 00479 } 00480 #elif defined(GCC_SYNC_FUNCTIONS) 00481 static inline uint16_t 00482 atomic_sub_uint16_t(uint16_t *minuend, uint16_t subtrahend) 00483 { 00484 return __sync_fetch_and_sub(minuend, subtrahend); 00485 } 00486 #endif 00487 00496 static inline uint16_t 00497 atomic_dec_uint16_t(uint16_t *var) 00498 { 00499 return atomic_sub_uint16_t(var, 1); 00500 } 00501 00511 #ifdef GCC_ATOMIC_FUNCTIONS 00512 static inline int8_t 00513 atomic_add_int8_t(int8_t *augend, uint8_t addend) 00514 { 00515 return __atomic_add_fetch(augend, addend, __ATOMIC_SEQ_CST); 00516 } 00517 #elif defined(GCC_SYNC_FUNCTIONS) 00518 static inline int8_t 00519 atomic_add_int8_t(int8_t *augend, uint8_t addend) 00520 { 00521 return __sync_fetch_and_add(augend, addend); 00522 } 00523 #endif 00524 00533 static inline int8_t 00534 atomic_inc_int8_t(int8_t *var) 00535 { 00536 return atomic_add_int8_t(var, 1); 00537 } 00538 00548 #ifdef GCC_ATOMIC_FUNCTIONS 00549 static inline int8_t 00550 atomic_sub_int8_t(int8_t *minuend, uint8_t subtrahend) 00551 { 00552 return __atomic_sub_fetch(minuend, subtrahend, __ATOMIC_SEQ_CST); 00553 } 00554 #elif defined(GCC_SYNC_FUNCTIONS) 00555 static inline int8_t 00556 atomic_sub_int8_t(int8_t *minuend, uint8_t subtrahend) 00557 { 00558 return __sync_fetch_and_sub(minuend, subtrahend); 00559 } 00560 #endif 00561 00570 static inline int8_t 00571 atomic_dec_int8_t(int8_t *var) 00572 { 00573 return atomic_sub_int8_t(var, 1); 00574 } 00575 00585 #ifdef GCC_ATOMIC_FUNCTIONS 00586 static inline uint8_t 00587 atomic_add_uint8_t(uint8_t *augend, uint8_t addend) 00588 { 00589 return __atomic_add_fetch(augend, addend, __ATOMIC_SEQ_CST); 00590 } 00591 #elif defined(GCC_SYNC_FUNCTIONS) 00592 static inline uint8_t 00593 atomic_add_uint8_t(uint8_t *augend, uint8_t addend) 00594 { 00595 return __sync_fetch_and_add(augend, addend); 00596 } 00597 #endif 00598 00607 static inline uint8_t 00608 atomic_inc_uint8_t(uint8_t *var) 00609 { 00610 return atomic_add_uint8_t(var, 1); 00611 } 00612 00622 #ifdef GCC_ATOMIC_FUNCTIONS 00623 static inline uint8_t 00624 atomic_sub_uint8_t(uint8_t *minuend, uint8_t subtrahend) 00625 { 00626 return __atomic_sub_fetch(minuend, subtrahend, __ATOMIC_SEQ_CST); 00627 } 00628 #elif defined(GCC_SYNC_FUNCTIONS) 00629 static inline uint8_t 00630 atomic_sub_uint8_t(uint8_t *minuend, uint8_t subtrahend) 00631 { 00632 return __sync_fetch_and_sub(minuend, subtrahend); 00633 } 00634 #endif 00635 00644 static inline uint8_t 00645 atomic_dec_uint8_t(uint8_t *var) 00646 { 00647 return atomic_sub_uint8_t(var, 1); 00648 } 00649 00659 #ifdef GCC_ATOMIC_FUNCTIONS 00660 static inline size_t 00661 atomic_add_size_t(size_t *augend, size_t addend) 00662 { 00663 return __atomic_add_fetch(augend, addend, __ATOMIC_SEQ_CST); 00664 } 00665 #elif defined(GCC_SYNC_FUNCTIONS) 00666 static inline size_t 00667 atomic_add_size_t(size_t *augend, size_t addend) 00668 { 00669 return __sync_fetch_and_add(augend, addend); 00670 } 00671 #endif 00672 00681 static inline size_t 00682 atomic_inc_size_t(size_t *var) 00683 { 00684 return atomic_add_size_t(var, 1); 00685 } 00686 00696 #ifdef GCC_ATOMIC_FUNCTIONS 00697 static inline size_t 00698 atomic_sub_size_t(size_t *minuend, size_t subtrahend) 00699 { 00700 return __atomic_sub_fetch(minuend, subtrahend, __ATOMIC_SEQ_CST); 00701 } 00702 #elif defined(GCC_SYNC_FUNCTIONS) 00703 static inline size_t 00704 atomic_sub_size_t(size_t *minuend, size_t subtrahend) 00705 { 00706 return __sync_fetch_and_sub(minuend, subtrahend); 00707 } 00708 #endif 00709 00718 static inline size_t 00719 atomic_dec_size_t(size_t *var) 00720 { 00721 return atomic_sub_size_t(var, 1); 00722 } 00723 00724 /* 00725 * Bit manipulation. 00726 */ 00727 00737 #ifdef GCC_ATOMIC_FUNCTIONS 00738 static inline uint64_t 00739 atomic_clear_uint64_t_bits(uint64_t *var, 00740 uint64_t bits) 00741 { 00742 return __atomic_and_fetch(var, ~bits, __ATOMIC_SEQ_CST); 00743 } 00744 #elif defined(GCC_SYNC_FUNCTIONS) 00745 static inline uint64_t 00746 atomic_clear_uint64_t_bits(uint64_t *var, 00747 uint64_t bits) 00748 { 00749 return __sync_fetch_and_and(var, ~bits); 00750 } 00751 #endif 00752 00762 #ifdef GCC_ATOMIC_FUNCTIONS 00763 static inline uint64_t 00764 atomic_set_uint64_t_bits(uint64_t *var, 00765 uint64_t bits) 00766 { 00767 return __atomic_or_fetch(var, bits, __ATOMIC_SEQ_CST); 00768 } 00769 #elif defined(GCC_SYNC_FUNCTIONS) 00770 static inline uint64_t 00771 atomic_set_uint64_t_bits(uint64_t *var, 00772 uint64_t bits) 00773 { 00774 return __sync_fetch_and_or(var, bits); 00775 } 00776 #endif 00777 00787 #ifdef GCC_ATOMIC_FUNCTIONS 00788 static inline uint32_t 00789 atomic_clear_uint32_t_bits(uint32_t *var, 00790 uint32_t bits) 00791 { 00792 return __atomic_and_fetch(var, ~bits, __ATOMIC_SEQ_CST); 00793 } 00794 #elif defined(GCC_SYNC_FUNCTIONS) 00795 static inline uint32_t 00796 atomic_clear_uint32_t_bits(uint32_t *var, 00797 uint32_t bits) 00798 { 00799 return __sync_fetch_and_and(var, ~bits); 00800 } 00801 #endif 00802 00812 #ifdef GCC_ATOMIC_FUNCTIONS 00813 static inline uint32_t 00814 atomic_set_uint32_t_bits(uint32_t *var, 00815 uint32_t bits) 00816 { 00817 return __atomic_or_fetch(var, bits, __ATOMIC_SEQ_CST); 00818 } 00819 #elif defined(GCC_SYNC_FUNCTIONS) 00820 static inline uint32_t 00821 atomic_set_uint32_t_bits(uint32_t *var, 00822 uint32_t bits) 00823 { 00824 return __sync_fetch_and_or(var, bits); 00825 } 00826 #endif 00827 00837 #ifdef GCC_ATOMIC_FUNCTIONS 00838 static inline uint16_t 00839 atomic_clear_uint16_t_bits(uint16_t *var, 00840 uint16_t bits) 00841 { 00842 return __atomic_and_fetch(var, ~bits, __ATOMIC_SEQ_CST); 00843 } 00844 #elif defined(GCC_SYNC_FUNCTIONS) 00845 static inline uint16_t 00846 atomic_clear_uint16_t_bits(uint16_t *var, 00847 uint16_t bits) 00848 { 00849 return __sync_fetch_and_and(var, ~bits); 00850 } 00851 #endif 00852 00862 #ifdef GCC_ATOMIC_FUNCTIONS 00863 static inline uint16_t 00864 atomic_set_uint16_t_bits(uint16_t *var, 00865 uint16_t bits) 00866 { 00867 return __atomic_or_fetch(var, bits, __ATOMIC_SEQ_CST); 00868 } 00869 #elif defined(GCC_SYNC_FUNCTIONS) 00870 static inline uint16_t 00871 atomic_set_uint16_t_bits(uint16_t *var, 00872 uint16_t bits) 00873 { 00874 return __sync_fetch_and_or(var, bits); 00875 } 00876 #endif 00877 00887 #ifdef GCC_ATOMIC_FUNCTIONS 00888 static inline uint8_t 00889 atomic_clear_uint8_t_bits(uint8_t *var, 00890 uint8_t bits) 00891 { 00892 return __atomic_and_fetch(var, ~bits, __ATOMIC_SEQ_CST); 00893 } 00894 #elif defined(GCC_SYNC_FUNCTIONS) 00895 static inline uint8_t 00896 atomic_clear_uint8_t_bits(uint8_t *var, 00897 uint8_t bits) 00898 { 00899 return __sync_fetch_and_and(var, ~bits); 00900 } 00901 #endif 00902 00912 #ifdef GCC_ATOMIC_FUNCTIONS 00913 static inline uint8_t 00914 atomic_set_uint8_t_bits(uint8_t *var, 00915 uint8_t bits) 00916 { 00917 return __atomic_or_fetch(var, bits, __ATOMIC_SEQ_CST); 00918 } 00919 #elif defined(GCC_SYNC_FUNCTIONS) 00920 static inline uint8_t 00921 atomic_set_uint8_t_bits(uint8_t *var, 00922 uint8_t bits) 00923 { 00924 return __sync_fetch_and_or(var, bits); 00925 } 00926 #endif 00927 00928 /* 00929 * Fetch and store 00930 */ 00931 00943 #ifdef GCC_ATOMIC_FUNCTIONS 00944 static inline size_t 00945 atomic_fetch_size_t(size_t *var) 00946 { 00947 return __atomic_load_n(var, __ATOMIC_SEQ_CST); 00948 } 00949 #elif defined(GCC_SYNC_FUNCTIONS) 00950 static inline size_t 00951 atomic_fetch_size_t(size_t *var) 00952 { 00953 return __sync_fetch_and_add(var, 0); 00954 } 00955 #endif 00956 00967 #ifdef GCC_ATOMIC_FUNCTIONS 00968 static inline void 00969 atomic_store_size_t(size_t *var, size_t val) 00970 { 00971 __atomic_store_n(var, val, __ATOMIC_SEQ_CST); 00972 } 00973 #elif defined(GCC_SYNC_FUNCTIONS) 00974 static inline void 00975 atomic_store_size_t(size_t *var, size_t val) 00976 { 00977 __sync_lock_test_and_set(var, 0); 00978 } 00979 #endif 00980 00992 #ifdef GCC_ATOMIC_FUNCTIONS 00993 static inline ptrdiff_t 00994 atomic_fetch_ptrdiff_t(ptrdiff_t *var) 00995 { 00996 return __atomic_load_n(var, __ATOMIC_SEQ_CST); 00997 } 00998 #elif defined(GCC_SYNC_FUNCTIONS) 00999 static inline ptrdiff_t 01000 atomic_fetch_ptrdiff_t(ptrdiff_t *var) 01001 { 01002 return __sync_fetch_and_add(var, 0); 01003 } 01004 #endif 01005 01016 #ifdef GCC_ATOMIC_FUNCTIONS 01017 static inline void 01018 atomic_store_ptrdiff_t(ptrdiff_t *var, ptrdiff_t val) 01019 { 01020 __atomic_store_n(var, val, __ATOMIC_SEQ_CST); 01021 } 01022 #elif defined(GCC_SYNC_FUNCTIONS) 01023 static inline void 01024 atomic_store_ptrdiff_t(ptrdiff_t *var, ptrdiff_t val) 01025 { 01026 __sync_lock_test_and_set(var, 0); 01027 } 01028 #endif 01029 01041 #ifdef GCC_ATOMIC_FUNCTIONS 01042 static inline int64_t 01043 atomic_fetch_int64_t(int64_t *var) 01044 { 01045 return __atomic_load_n(var, __ATOMIC_SEQ_CST); 01046 } 01047 #elif defined(GCC_SYNC_FUNCTIONS) 01048 static inline int64_t 01049 atomic_fetch_int64_t(int64_t *var) 01050 { 01051 return __sync_fetch_and_add(var, 0); 01052 } 01053 #endif 01054 01065 #ifdef GCC_ATOMIC_FUNCTIONS 01066 static inline void 01067 atomic_store_int64_t(int64_t *var, int64_t val) 01068 { 01069 __atomic_store_n(var, val, __ATOMIC_SEQ_CST); 01070 } 01071 #elif defined(GCC_SYNC_FUNCTIONS) 01072 static inline void 01073 atomic_store_int64_t(int64_t *var, int64_t val) 01074 { 01075 __sync_lock_test_and_set(var, 0); 01076 } 01077 #endif 01078 01090 #ifdef GCC_ATOMIC_FUNCTIONS 01091 static inline uint64_t 01092 atomic_fetch_uint64_t(uint64_t *var) 01093 { 01094 return __atomic_load_n(var, __ATOMIC_SEQ_CST); 01095 } 01096 #elif defined(GCC_SYNC_FUNCTIONS) 01097 static inline uint64_t 01098 atomic_fetch_uint64_t(uint64_t *var) 01099 { 01100 return __sync_fetch_and_add(var, 0); 01101 } 01102 #endif 01103 01114 #ifdef GCC_ATOMIC_FUNCTIONS 01115 static inline void 01116 atomic_store_uint64_t(uint64_t *var, uint64_t val) 01117 { 01118 __atomic_store_n(var, val, __ATOMIC_SEQ_CST); 01119 } 01120 #elif defined(GCC_SYNC_FUNCTIONS) 01121 static inline void 01122 atomic_store_uint64_t(uint64_t *var, uint64_t val) 01123 { 01124 __sync_lock_test_and_set(var, 0); 01125 } 01126 #endif 01127 01139 #ifdef GCC_ATOMIC_FUNCTIONS 01140 static inline int32_t 01141 atomic_fetch_int32_t(int32_t *var) 01142 { 01143 return __atomic_load_n(var, __ATOMIC_SEQ_CST); 01144 } 01145 #elif defined(GCC_SYNC_FUNCTIONS) 01146 static inline int32_t 01147 atomic_fetch_int32_t(int32_t *var) 01148 { 01149 return __sync_fetch_and_add(var, 0); 01150 } 01151 #endif 01152 01163 #ifdef GCC_ATOMIC_FUNCTIONS 01164 static inline void 01165 atomic_store_int32_t(int32_t *var, int32_t val) 01166 { 01167 __atomic_store_n(var, val, __ATOMIC_SEQ_CST); 01168 } 01169 #elif defined(GCC_SYNC_FUNCTIONS) 01170 static inline void 01171 atomic_store_int32_t(int32_t *var, int32_t val) 01172 { 01173 __sync_lock_test_and_set(var, 0); 01174 } 01175 #endif 01176 01188 #ifdef GCC_ATOMIC_FUNCTIONS 01189 static inline uint32_t 01190 atomic_fetch_uint32_t(uint32_t *var) 01191 { 01192 return __atomic_load_n(var, __ATOMIC_SEQ_CST); 01193 } 01194 #elif defined(GCC_SYNC_FUNCTIONS) 01195 static inline uint32_t 01196 atomic_fetch_uint32_t(uint32_t *var) 01197 { 01198 return __sync_fetch_and_add(var, 0); 01199 } 01200 #endif 01201 01212 #ifdef GCC_ATOMIC_FUNCTIONS 01213 static inline void 01214 atomic_store_uint32_t(uint32_t *var, uint32_t val) 01215 { 01216 __atomic_store_n(var, val, __ATOMIC_SEQ_CST); 01217 } 01218 #elif defined(GCC_SYNC_FUNCTIONS) 01219 static inline void 01220 atomic_store_uint32_t(uint32_t *var, uint32_t val) 01221 { 01222 __sync_lock_test_and_set(var, 0); 01223 } 01224 #endif 01225 01237 #ifdef GCC_ATOMIC_FUNCTIONS 01238 static inline int16_t 01239 atomic_fetch_int16_t(int16_t *var) 01240 { 01241 return __atomic_load_n(var, __ATOMIC_SEQ_CST); 01242 } 01243 #elif defined(GCC_SYNC_FUNCTIONS) 01244 static inline int16_t 01245 atomic_fetch_int16_t(int16_t *var) 01246 { 01247 return __sync_fetch_and_add(var, 0); 01248 } 01249 #endif 01250 01261 #ifdef GCC_ATOMIC_FUNCTIONS 01262 static inline void 01263 atomic_store_int16_t(int16_t *var, int16_t val) 01264 { 01265 __atomic_store_n(var, val, __ATOMIC_SEQ_CST); 01266 } 01267 #elif defined(GCC_SYNC_FUNCTIONS) 01268 static inline void 01269 atomic_store_int16_t(int16_t *var, int16_t val) 01270 { 01271 __sync_lock_test_and_set(var, 0); 01272 } 01273 #endif 01274 01286 #ifdef GCC_ATOMIC_FUNCTIONS 01287 static inline uint16_t 01288 atomic_fetch_uint16_t(uint16_t *var) 01289 { 01290 return __atomic_load_n(var, __ATOMIC_SEQ_CST); 01291 } 01292 #elif defined(GCC_SYNC_FUNCTIONS) 01293 static inline uint16_t 01294 atomic_fetch_uint16_t(uint16_t *var) 01295 { 01296 return __sync_fetch_and_add(var, 0); 01297 } 01298 #endif 01299 01310 #ifdef GCC_ATOMIC_FUNCTIONS 01311 static inline void 01312 atomic_store_uint16_t(uint16_t *var, uint16_t val) 01313 { 01314 __atomic_store_n(var, val, __ATOMIC_SEQ_CST); 01315 } 01316 #elif defined(GCC_SYNC_FUNCTIONS) 01317 static inline void 01318 atomic_store_uint16_t(uint16_t *var, uint16_t val) 01319 { 01320 __sync_lock_test_and_set(var, 0); 01321 } 01322 #endif 01323 01335 #ifdef GCC_ATOMIC_FUNCTIONS 01336 static inline int8_t 01337 atomic_fetch_int8_t(int8_t *var) 01338 { 01339 return __atomic_load_n(var, __ATOMIC_SEQ_CST); 01340 } 01341 #elif defined(GCC_SYNC_FUNCTIONS) 01342 static inline int8_t 01343 atomic_fetch_int8_t(int8_t *var) 01344 { 01345 return __sync_fetch_and_add(var, 0); 01346 } 01347 #endif 01348 01359 #ifdef GCC_ATOMIC_FUNCTIONS 01360 static inline void 01361 atomic_store_int8_t(int8_t *var, int8_t val) 01362 { 01363 __atomic_store_n(var, val, __ATOMIC_SEQ_CST); 01364 } 01365 #elif defined(GCC_SYNC_FUNCTIONS) 01366 static inline void 01367 atomic_store_int8_t(int8_t *var, int8_t val) 01368 { 01369 __sync_lock_test_and_set(var, 0); 01370 } 01371 #endif 01372 01384 #ifdef GCC_ATOMIC_FUNCTIONS 01385 static inline uint8_t 01386 atomic_fetch_uint8_t(uint8_t *var) 01387 { 01388 return __atomic_load_n(var, __ATOMIC_SEQ_CST); 01389 } 01390 #elif defined(GCC_SYNC_FUNCTIONS) 01391 static inline uint8_t 01392 atomic_fetch_uint8_t(uint8_t *var) 01393 { 01394 return __sync_fetch_and_add(var, 0); 01395 } 01396 #endif 01397 01408 #ifdef GCC_ATOMIC_FUNCTIONS 01409 static inline void 01410 atomic_store_uint8_t(uint8_t *var, uint8_t val) 01411 { 01412 __atomic_store_n(var, val, __ATOMIC_SEQ_CST); 01413 } 01414 #elif defined(GCC_SYNC_FUNCTIONS) 01415 static inline void 01416 atomic_store_uint8_t(uint8_t *var, uint8_t val) 01417 { 01418 __sync_lock_test_and_set(var, 0); 01419 } 01420 #endif 01421 #endif /* !_ABSTRACT_ATOMIC_H */