Xamarin Public Jenkins (auto-signing) e46a49ecf1 Imported Upstream version 5.10.0.47
Former-commit-id: d0813289fa2d35e1f8ed77530acb4fb1df441bc0
2018-01-24 17:04:36 +00:00

143 lines
2.4 KiB
C

/**
* \file
* Contains inline functions to explicitly mark data races that should not be changed.
* This way, instruments like Clang's ThreadSanitizer can be told to ignore very specific instructions.
*
* Please keep this file and its methods organised:
* * Increment, Decrement, Add, Subtract, Write, Read
* * gint32 (""), guint32 ("Unsigned"),
* gint64 ("64"), guint64 ("Unsigned64"),
* gsize ("Size"), gboolean ("Bool"),
* gpointer ("Pointer")
*
* Licensed under the MIT license. See LICENSE file in the project root for full license information.
*/
#ifndef _UNLOCKED_H_
#define _UNLOCKED_H_
#include <glib.h>
#include <mono/utils/mono-compiler.h>
#if MONO_HAS_CLANG_THREAD_SANITIZER
#define MONO_UNLOCKED_ATTRS MONO_NO_SANITIZE_THREAD MONO_NEVER_INLINE static
#elif defined(_MSC_VER)
#define MONO_UNLOCKED_ATTRS MONO_ALWAYS_INLINE static
#else
#define MONO_UNLOCKED_ATTRS MONO_ALWAYS_INLINE static inline
#endif
MONO_UNLOCKED_ATTRS
gint32
UnlockedIncrement (volatile gint32 *val)
{
return ++*val;
}
MONO_UNLOCKED_ATTRS
gint64
UnlockedIncrement64 (volatile gint64 *val)
{
return ++*val;
}
MONO_UNLOCKED_ATTRS
gint64
UnlockedDecrement64 (volatile gint64 *val)
{
return --*val;
}
MONO_UNLOCKED_ATTRS
gint32
UnlockedDecrement (volatile gint32 *val)
{
return --*val;
}
MONO_UNLOCKED_ATTRS
gint32
UnlockedAdd (volatile gint32 *dest, gint32 add)
{
return *dest += add;
}
MONO_UNLOCKED_ATTRS
gint64
UnlockedAdd64 (volatile gint64 *dest, gint64 add)
{
return *dest += add;
}
MONO_UNLOCKED_ATTRS
gdouble
UnlockedAddDouble (volatile gdouble *dest, gdouble add)
{
return *dest += add;
}
MONO_UNLOCKED_ATTRS
gint64
UnlockedSubtract64 (volatile gint64 *dest, gint64 sub)
{
return *dest -= sub;
}
MONO_UNLOCKED_ATTRS
void
UnlockedWrite (volatile gint32 *dest, gint32 val)
{
*dest = val;
}
MONO_UNLOCKED_ATTRS
void
UnlockedWrite64 (volatile gint64 *dest, gint64 val)
{
*dest = val;
}
MONO_UNLOCKED_ATTRS
void
UnlockedWriteBool (volatile gboolean *dest, gboolean val)
{
*dest = val;
}
MONO_UNLOCKED_ATTRS
void
UnlockedWritePointer (volatile gpointer *dest, gpointer val)
{
*dest = val;
}
MONO_UNLOCKED_ATTRS
gint32
UnlockedRead (volatile gint32 *src)
{
return *src;
}
MONO_UNLOCKED_ATTRS
gint64
UnlockedRead64 (volatile gint64 *src)
{
return *src;
}
MONO_UNLOCKED_ATTRS
gboolean
UnlockedReadBool (volatile gboolean *src)
{
return *src;
}
MONO_UNLOCKED_ATTRS
gpointer
UnlockedReadPointer (volatile gpointer *src)
{
return *src;
}
#endif /* _UNLOCKED_H_ */