nfs-ganesha 1.4

abstract_atomic.h

Go to the documentation of this file.
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 */