]> git.sesse.net Git - vlc/blobdiff - include/vlc_atomic.h
Freetype: fallback to arial.ttf on Win32
[vlc] / include / vlc_atomic.h
index 9370fbc899b4d36ea70678e2daab267079a9f50a..d21c8ad3b5b7b3a42ff164aae24a7f33b8fd0045 100644 (file)
  * Atomic operations do not require locking, but they are not very powerful.
  */
 
-/**
- * Memory storage space for an atom. Never access it directly.
- */
-typedef union
-{
-    volatile uintptr_t u;
-    volatile intptr_t  s;
-} vlc_atomic_t;
+/** Static initializer for \ref vlc_atomic_t */
+# define VLC_ATOMIC_INIT(val) { (val) }
 
 /* All functions return the atom value _after_ the operation. */
 
-VLC_EXPORT(uintptr_t, vlc_atomic_get, (const vlc_atomic_t *));
-VLC_EXPORT(uintptr_t, vlc_atomic_set, (vlc_atomic_t *, uintptr_t));
-VLC_EXPORT(uintptr_t, vlc_atomic_add, (vlc_atomic_t *, uintptr_t));
+VLC_API uintptr_t vlc_atomic_get(const vlc_atomic_t *);
+VLC_API uintptr_t vlc_atomic_set(vlc_atomic_t *, uintptr_t);
+VLC_API uintptr_t vlc_atomic_add(vlc_atomic_t *, uintptr_t);
 
 static inline uintptr_t vlc_atomic_sub (vlc_atomic_t *atom, uintptr_t v)
 {
@@ -56,4 +50,24 @@ static inline uintptr_t vlc_atomic_dec (vlc_atomic_t *atom)
     return vlc_atomic_sub (atom, 1);
 }
 
+VLC_API uintptr_t vlc_atomic_swap(vlc_atomic_t *, uintptr_t);
+VLC_API uintptr_t vlc_atomic_compare_swap(vlc_atomic_t *, uintptr_t, uintptr_t);
+
+/** Helper to retrieve a single precision from an atom. */
+static inline float vlc_atomic_getf(const vlc_atomic_t *atom)
+{
+    union { float f; uintptr_t i; } u;
+    u.i = vlc_atomic_get(atom);
+    return u.f;
+}
+
+/** Helper to store a single precision into an atom. */
+static inline float vlc_atomic_setf(vlc_atomic_t *atom, float f)
+{
+    union { float f; uintptr_t i; } u;
+    u.f = f;
+    vlc_atomic_set(atom, u.i);
+    return f;
+}
+
 #endif