File: /Users/paulross/dev/linux/linux-3.13/include/asm-generic/atomic-long.h

Green shading in the line number column means the source is part of the translation unit, red means it is conditionally excluded. Highlighted line numbers link to the translation unit page. Highlighted macros link to the macro page.

       1: #ifndef _ASM_GENERIC_ATOMIC_LONG_H
       2: #define _ASM_GENERIC_ATOMIC_LONG_H
       3: /*
       4:  * Copyright (C) 2005 Silicon Graphics, Inc.
       5:  *    Christoph Lameter
       6:  *
       7:  * Allows to provide arch independent atomic definitions without the need to
       8:  * edit all arch specific atomic.h files.
       9:  */
      10: 
      11: #include <asm/types.h>
      12: 
      13: /*
      14:  * Suppport for atomic_long_t
      15:  *
      16:  * Casts for parameters are avoided for existing atomic functions in order to
      17:  * avoid issues with cast-as-lval under gcc 4.x and other limitations that the
      18:  * macros of a platform may have.
      19:  */
      20: 
      21: #if BITS_PER_LONG == 64
      22: 
      23: typedef atomic64_t atomic_long_t;
      24: 
      25: #define ATOMIC_LONG_INIT(i)    ATOMIC64_INIT(i)
      26: 
      27: static inline long atomic_long_read(atomic_long_t *l)
      28: {
      29:     atomic64_t *v = (atomic64_t *)l;
      30: 
      31:     return (long)atomic64_read(v);
      32: }
      33: 
      34: static inline void atomic_long_set(atomic_long_t *l, long i)
      35: {
      36:     atomic64_t *v = (atomic64_t *)l;
      37: 
      38:     atomic64_set(v, i);
      39: }
      40: 
      41: static inline void atomic_long_inc(atomic_long_t *l)
      42: {
      43:     atomic64_t *v = (atomic64_t *)l;
      44: 
      45:     atomic64_inc(v);
      46: }
      47: 
      48: static inline void atomic_long_dec(atomic_long_t *l)
      49: {
      50:     atomic64_t *v = (atomic64_t *)l;
      51: 
      52:     atomic64_dec(v);
      53: }
      54: 
      55: static inline void atomic_long_add(long i, atomic_long_t *l)
      56: {
      57:     atomic64_t *v = (atomic64_t *)l;
      58: 
      59:     atomic64_add(i, v);
      60: }
      61: 
      62: static inline void atomic_long_sub(long i, atomic_long_t *l)
      63: {
      64:     atomic64_t *v = (atomic64_t *)l;
      65: 
      66:     atomic64_sub(i, v);
      67: }
      68: 
      69: static inline int atomic_long_sub_and_test(long i, atomic_long_t *l)
      70: {
      71:     atomic64_t *v = (atomic64_t *)l;
      72: 
      73:     return atomic64_sub_and_test(i, v);
      74: }
      75: 
      76: static inline int atomic_long_dec_and_test(atomic_long_t *l)
      77: {
      78:     atomic64_t *v = (atomic64_t *)l;
      79: 
      80:     return atomic64_dec_and_test(v);
      81: }
      82: 
      83: static inline int atomic_long_inc_and_test(atomic_long_t *l)
      84: {
      85:     atomic64_t *v = (atomic64_t *)l;
      86: 
      87:     return atomic64_inc_and_test(v);
      88: }
      89: 
      90: static inline int atomic_long_add_negative(long i, atomic_long_t *l)
      91: {
      92:     atomic64_t *v = (atomic64_t *)l;
      93: 
      94:     return atomic64_add_negative(i, v);
      95: }
      96: 
      97: static inline long atomic_long_add_return(long i, atomic_long_t *l)
      98: {
      99:     atomic64_t *v = (atomic64_t *)l;
     100: 
     101:     return (long)atomic64_add_return(i, v);
     102: }
     103: 
     104: static inline long atomic_long_sub_return(long i, atomic_long_t *l)
     105: {
     106:     atomic64_t *v = (atomic64_t *)l;
     107: 
     108:     return (long)atomic64_sub_return(i, v);
     109: }
     110: 
     111: static inline long atomic_long_inc_return(atomic_long_t *l)
     112: {
     113:     atomic64_t *v = (atomic64_t *)l;
     114: 
     115:     return (long)atomic64_inc_return(v);
     116: }
     117: 
     118: static inline long atomic_long_dec_return(atomic_long_t *l)
     119: {
     120:     atomic64_t *v = (atomic64_t *)l;
     121: 
     122:     return (long)atomic64_dec_return(v);
     123: }
     124: 
     125: static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u)
     126: {
     127:     atomic64_t *v = (atomic64_t *)l;
     128: 
     129:     return (long)atomic64_add_unless(v, a, u);
     130: }
     131: 
     132: #define atomic_long_inc_not_zero(l) atomic64_inc_not_zero((atomic64_t *)(l))
     133: 
     134: #define atomic_long_cmpxchg(l, old, new) \
     135:     (atomic64_cmpxchg((atomic64_t *)(l), (old), (new)))
     136: #define atomic_long_xchg(v, new) \
     137:     (atomic64_xchg((atomic64_t *)(v), (new)))
     138: 
     139: #else  /*  BITS_PER_LONG == 64  */
     140: 
     141: typedef atomic_t atomic_long_t;
     142: 
     143: #define ATOMIC_LONG_INIT(i)    ATOMIC_INIT(i)
     144: static inline long atomic_long_read(atomic_long_t *l)
     145: {
     146:     atomic_t *v = (atomic_t *)l;
     147: 
     148:     return (long)atomic_read(v);
     149: }
     150: 
     151: static inline void atomic_long_set(atomic_long_t *l, long i)
     152: {
     153:     atomic_t *v = (atomic_t *)l;
     154: 
     155:     atomic_set(v, i);
     156: }
     157: 
     158: static inline void atomic_long_inc(atomic_long_t *l)
     159: {
     160:     atomic_t *v = (atomic_t *)l;
     161: 
     162:     atomic_inc(v);
     163: }
     164: 
     165: static inline void atomic_long_dec(atomic_long_t *l)
     166: {
     167:     atomic_t *v = (atomic_t *)l;
     168: 
     169:     atomic_dec(v);
     170: }
     171: 
     172: static inline void atomic_long_add(long i, atomic_long_t *l)
     173: {
     174:     atomic_t *v = (atomic_t *)l;
     175: 
     176:     atomic_add(i, v);
     177: }
     178: 
     179: static inline void atomic_long_sub(long i, atomic_long_t *l)
     180: {
     181:     atomic_t *v = (atomic_t *)l;
     182: 
     183:     atomic_sub(i, v);
     184: }
     185: 
     186: static inline int atomic_long_sub_and_test(long i, atomic_long_t *l)
     187: {
     188:     atomic_t *v = (atomic_t *)l;
     189: 
     190:     return atomic_sub_and_test(i, v);
     191: }
     192: 
     193: static inline int atomic_long_dec_and_test(atomic_long_t *l)
     194: {
     195:     atomic_t *v = (atomic_t *)l;
     196: 
     197:     return atomic_dec_and_test(v);
     198: }
     199: 
     200: static inline int atomic_long_inc_and_test(atomic_long_t *l)
     201: {
     202:     atomic_t *v = (atomic_t *)l;
     203: 
     204:     return atomic_inc_and_test(v);
     205: }
     206: 
     207: static inline int atomic_long_add_negative(long i, atomic_long_t *l)
     208: {
     209:     atomic_t *v = (atomic_t *)l;
     210: 
     211:     return atomic_add_negative(i, v);
     212: }
     213: 
     214: static inline long atomic_long_add_return(long i, atomic_long_t *l)
     215: {
     216:     atomic_t *v = (atomic_t *)l;
     217: 
     218:     return (long)atomic_add_return(i, v);
     219: }
     220: 
     221: static inline long atomic_long_sub_return(long i, atomic_long_t *l)
     222: {
     223:     atomic_t *v = (atomic_t *)l;
     224: 
     225:     return (long)atomic_sub_return(i, v);
     226: }
     227: 
     228: static inline long atomic_long_inc_return(atomic_long_t *l)
     229: {
     230:     atomic_t *v = (atomic_t *)l;
     231: 
     232:     return (long)atomic_inc_return(v);
     233: }
     234: 
     235: static inline long atomic_long_dec_return(atomic_long_t *l)
     236: {
     237:     atomic_t *v = (atomic_t *)l;
     238: 
     239:     return (long)atomic_dec_return(v);
     240: }
     241: 
     242: static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u)
     243: {
     244:     atomic_t *v = (atomic_t *)l;
     245: 
     246:     return (long)atomic_add_unless(v, a, u);
     247: }
     248: 
     249: #define atomic_long_inc_not_zero(l) atomic_inc_not_zero((atomic_t *)(l))
     250: 
     251: #define atomic_long_cmpxchg(l, old, new) \
     252:     (atomic_cmpxchg((atomic_t *)(l), (old), (new)))
     253: #define atomic_long_xchg(v, new) \
     254:     (atomic_xchg((atomic_t *)(v), (new)))
     255: 
     256: #endif  /*  BITS_PER_LONG == 64  */
     257: 
     258: #endif  /*  _ASM_GENERIC_ATOMIC_LONG_H  */
     259: