[Mesa-dev] [PATCH 2/2] util/u_atomic: Add _InterlockedExchangeAdd8/16 for older MSVC.

Roland Scheidegger sroland at vmware.com
Thu Feb 12 08:48:57 PST 2015


Series looks good to me.

Roland

Am 12.02.2015 um 17:27 schrieb Jose Fonseca:
> We need to build certain parts of Mesa (namely gallium, llvmpipe, and
> therefore util) with Windows SDK 7.0.7600, which includes MSVC 2008.
> ---
>  src/util/u_atomic.h | 32 ++++++++++++++++++++++++++++++--
>  1 file changed, 30 insertions(+), 2 deletions(-)
> 
> diff --git a/src/util/u_atomic.h b/src/util/u_atomic.h
> index e123e17..f54def3 100644
> --- a/src/util/u_atomic.h
> +++ b/src/util/u_atomic.h
> @@ -88,7 +88,7 @@
>  
>  #if _MSC_VER < 1600
>  
> -/* Implement _InterlockedCompareExchange8 in terms of InterlockedCompareExchange16 */
> +/* Implement _InterlockedCompareExchange8 in terms of _InterlockedCompareExchange16 */
>  static __inline
>  char _InterlockedCompareExchange8(char volatile *Destination8, char Exchange8, char Comparand8)
>  {
> @@ -103,7 +103,7 @@ char _InterlockedCompareExchange8(char volatile *Destination8, char Exchange8, c
>         * neighboring byte untouched */
>        short Exchange16 = (Initial16 & ~Mask8) | ((short)Exchange8 << Shift8);
>        short Comparand16 = Initial16;
> -      short Initial16 = InterlockedCompareExchange16(Destination16, Exchange16, Comparand16);
> +      short Initial16 = _InterlockedCompareExchange16(Destination16, Exchange16, Comparand16);
>        if (Initial16 == Comparand16) {
>           /* succeeded */
>           return Comparand8;
> @@ -114,6 +114,34 @@ char _InterlockedCompareExchange8(char volatile *Destination8, char Exchange8, c
>     return Initial8;
>  }
>  
> +/* Implement _InterlockedExchangeAdd16 in terms of _InterlockedCompareExchange16 */
> +static __inline
> +short _InterlockedExchangeAdd16(short volatile *Addend, short Value)
> +{
> +   short Initial = *Addend;
> +   short Comparand;
> +   do {
> +      short Exchange = Initial + Value;
> +      Comparand = Initial;
> +      Initial = _InterlockedCompareExchange16(Addend, Exchange, Comparand);
> +   } while(Initial != Comparand);
> +   return Comparand;
> +}
> +
> +/* Implement _InterlockedExchangeAdd8 in terms of _InterlockedCompareExchange8 */
> +static __inline
> +char _InterlockedExchangeAdd8(char volatile *Addend, char Value)
> +{
> +   char Initial = *Addend;
> +   char Comparand;
> +   do {
> +      char Exchange = Initial + Value;
> +      Comparand = Initial;
> +      Initial = _InterlockedCompareExchange8(Addend, Exchange, Comparand);
> +   } while(Initial != Comparand);
> +   return Comparand;
> +}
> +
>  #endif /* _MSC_VER < 1600 */
>  
>  /* MSVC supports decltype keyword, but it's only supported on C++ and doesn't
> 



More information about the mesa-dev mailing list