History

Add a compat stdatomic.h implementation based on pthreads

Adapted from the code by Rémi Denis-Courmont from VLC This merges libav commit f9a6a80e065cdb95b233978f1d96ec9bc863daa1.

Anton Khirnov committed 9 years ago

Commit 74b5f101 parent 70faadc3 files · +239 −0Browse files

Unified · Split

3 files
  1. compat/atomics/pthread/stdatomic.c +39 −0
  2. compat/atomics/pthread/stdatomic.h +197 −0
  3. configure +3 −0
compat/atomics/pthread/stdatomic.c+39−0
@@ -0,0 +1,39 @@
1+/*
2+ * This file is part of FFmpeg.
3+ *
4+ * FFmpeg is free software; you can redistribute it and/or
5+ * modify it under the terms of the GNU Lesser General Public
6+ * License as published by the Free Software Foundation; either
7+ * version 2.1 of the License, or (at your option) any later version.
8+ *
9+ * FFmpeg is distributed in the hope that it will be useful,
10+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12+ * Lesser General Public License for more details.
13+ *
14+ * You should have received a copy of the GNU Lesser General Public
15+ * License along with FFmpeg; if not, write to the Free Software
16+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17+ */
18+
19+/*
20+ * based on vlc_atomic.h from VLC
21+ * Copyright (C) 2010 Rémi Denis-Courmont
22+ */
23+
24+#include <pthread.h>
25+#include <stdint.h>
26+
27+#include "stdatomic.h"
28+
29+static pthread_mutex_t atomic_lock = PTHREAD_MUTEX_INITIALIZER;
30+
31+void avpriv_atomic_lock(void)
32+{
33+ pthread_mutex_lock(&atomic_lock);
34+}
35+
36+void avpriv_atomic_unlock(void)
37+{
38+ pthread_mutex_unlock(&atomic_lock);
39+}
compat/atomics/pthread/stdatomic.h+197−0
@@ -0,0 +1,197 @@
1+/*
2+ * This file is part of FFmpeg.
3+ *
4+ * FFmpeg is free software; you can redistribute it and/or
5+ * modify it under the terms of the GNU Lesser General Public
6+ * License as published by the Free Software Foundation; either
7+ * version 2.1 of the License, or (at your option) any later version.
8+ *
9+ * FFmpeg is distributed in the hope that it will be useful,
10+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12+ * Lesser General Public License for more details.
13+ *
14+ * You should have received a copy of the GNU Lesser General Public
15+ * License along with FFmpeg; if not, write to the Free Software
16+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17+ */
18+
19+/*
20+ * based on vlc_atomic.h from VLC
21+ * Copyright (C) 2010 Rémi Denis-Courmont
22+ */
23+
24+#ifndef FFMPEG_COMPAT_ATOMICS_PTHREAD_STDATOMIC_H
25+#define FFMPEG_COMPAT_ATOMICS_PTHREAD_STDATOMIC_H
26+
27+#include <stdint.h>
28+
29+#define ATOMIC_FLAG_INIT 0
30+
31+#define ATOMIC_VAR_INIT(value) (value)
32+
33+#define atomic_init(obj, value) \
34+do { \
35+ *(obj) = (value); \
36+} while(0)
37+
38+#define kill_dependency(y) ((void)0)
39+
40+#define atomic_signal_fence(order) \
41+ ((void)0)
42+
43+#define atomic_is_lock_free(obj) 0
44+
45+typedef intptr_t atomic_flag;
46+typedef intptr_t atomic_bool;
47+typedef intptr_t atomic_char;
48+typedef intptr_t atomic_schar;
49+typedef intptr_t atomic_uchar;
50+typedef intptr_t atomic_short;
51+typedef intptr_t atomic_ushort;
52+typedef intptr_t atomic_int;
53+typedef intptr_t atomic_uint;
54+typedef intptr_t atomic_long;
55+typedef intptr_t atomic_ulong;
56+typedef intptr_t atomic_llong;
57+typedef intptr_t atomic_ullong;
58+typedef intptr_t atomic_wchar_t;
59+typedef intptr_t atomic_int_least8_t;
60+typedef intptr_t atomic_uint_least8_t;
61+typedef intptr_t atomic_int_least16_t;
62+typedef intptr_t atomic_uint_least16_t;
63+typedef intptr_t atomic_int_least32_t;
64+typedef intptr_t atomic_uint_least32_t;
65+typedef intptr_t atomic_int_least64_t;
66+typedef intptr_t atomic_uint_least64_t;
67+typedef intptr_t atomic_int_fast8_t;
68+typedef intptr_t atomic_uint_fast8_t;
69+typedef intptr_t atomic_int_fast16_t;
70+typedef intptr_t atomic_uint_fast16_t;
71+typedef intptr_t atomic_int_fast32_t;
72+typedef intptr_t atomic_uint_fast32_t;
73+typedef intptr_t atomic_int_fast64_t;
74+typedef intptr_t atomic_uint_fast64_t;
75+typedef intptr_t atomic_intptr_t;
76+typedef intptr_t atomic_uintptr_t;
77+typedef intptr_t atomic_size_t;
78+typedef intptr_t atomic_ptrdiff_t;
79+typedef intptr_t atomic_intmax_t;
80+typedef intptr_t atomic_uintmax_t;
81+
82+void avpriv_atomic_lock(void);
83+void avpriv_atomic_unlock(void);
84+
85+static inline void atomic_thread_fence(int order)
86+{
87+ avpriv_atomic_lock();
88+ avpriv_atomic_unlock();
89+}
90+
91+static inline void atomic_store(intptr_t *object, intptr_t desired)
92+{
93+ avpriv_atomic_lock();
94+ *object = desired;
95+ avpriv_atomic_unlock();
96+}
97+
98+#define atomic_store_explicit(object, desired, order) \
99+ atomic_store(object, desired)
100+
101+static inline intptr_t atomic_load(intptr_t *object)
102+{
103+ intptr_t ret;
104+ avpriv_atomic_lock();
105+ ret = *object;
106+ avpriv_atomic_unlock();
107+ return ret;
108+}
109+
110+#define atomic_load_explicit(object, order) \
111+ atomic_load(object)
112+
113+static inline intptr_t atomic_exchange(intptr_t *object, intptr_t desired)
114+{
115+ intptr_t ret;
116+ avpriv_atomic_lock();
117+ ret = *object;
118+ *object = desired;
119+ avpriv_atomic_unlock();
120+ return ret;
121+}
122+
123+#define atomic_exchange_explicit(object, desired, order) \
124+ atomic_exchange(object, desired)
125+
126+static inline int atomic_compare_exchange_strong(intptr_t *object, intptr_t *expected,
127+ intptr_t desired)
128+{
129+ int ret;
130+ avpriv_atomic_lock();
131+ if (*object == *expected) {
132+ ret = 1;
133+ *object = desired;
134+ } else {
135+ ret = 0;
136+ *expected = *object;
137+ }
138+ avpriv_atomic_unlock();
139+ return ret;
140+}
141+
142+#define atomic_compare_exchange_strong_explicit(object, expected, desired, success, failure) \
143+ atomic_compare_exchange_strong(object, expected, desired)
144+
145+#define atomic_compare_exchange_weak(object, expected, desired) \
146+ atomic_compare_exchange_strong(object, expected, desired)
147+
148+#define atomic_compare_exchange_weak_explicit(object, expected, desired, success, failure) \
149+ atomic_compare_exchange_weak(object, expected, desired)
150+
151+#define FETCH_MODIFY(opname, op) \
152+static inline intptr_t atomic_fetch_ ## opname(intptr_t *object, intptr_t operand) \
153+{ \
154+ intptr_t ret; \
155+ avpriv_atomic_lock(); \
156+ ret = *object; \
157+ *object = *object op operand; \
158+ avpriv_atomic_unlock(); \
159+ return ret; \
160+}
161+
162+FETCH_MODIFY(add, +)
163+FETCH_MODIFY(sub, -)
164+FETCH_MODIFY(or, |)
165+FETCH_MODIFY(xor, ^)
166+FETCH_MODIFY(and, &)
167+
168+#undef FETCH_MODIFY
169+
170+#define atomic_fetch_add_explicit(object, operand, order) \
171+ atomic_fetch_add(object, operand)
172+
173+#define atomic_fetch_sub_explicit(object, operand, order) \
174+ atomic_fetch_sub(object, operand)
175+
176+#define atomic_fetch_or_explicit(object, operand, order) \
177+ atomic_fetch_or(object, operand)
178+
179+#define atomic_fetch_xor_explicit(object, operand, order) \
180+ atomic_fetch_sub(object, operand)
181+
182+#define atomic_fetch_and_explicit(object, operand, order) \
183+ atomic_fetch_and(object, operand)
184+
185+#define atomic_flag_test_and_set(object) \
186+ atomic_exchange(object, 1)
187+
188+#define atomic_flag_test_and_set_explicit(object, order) \
189+ atomic_flag_test_and_set(object)
190+
191+#define atomic_flag_clear(object) \
192+ atomic_store(object, 0)
193+
194+#define atomic_flag_clear_explicit(object, order) \
195+ atomic_flag_clear(object)
196+
197+#endif /* FFMPEG_COMPAT_ATOMICS_PTHREAD_STDATOMIC_H */
configure+3−0
@@ -6388,6 +6388,9 @@ if disabled stdatomic_h; then · 6387 unmodified lines
63886388 add_cppflags '-I\$(SRC_PATH)/compat/atomics/win32'
63896389 elif enabled atomics_suncc; then
63906390 add_cppflags '-I\$(SRC_PATH)/compat/atomics/suncc'
6391+ elif enabled pthreads; then
6392+ add_compat atomics/pthread/stdatomic.o
6393+ add_cppflags '-I\$(SRC_PATH)/compat/atomics/pthread'
63916394 fi
63926395 fi
63936396

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t