Line
Link Here
|
0 |
-- vlc-2.2.3.orig/include/vlc_atomic.h |
0 |
++ vlc-2.2.3/include/vlc_atomic.h |
Lines 26-38
Link Here
|
26 |
* Atomic operations do not require locking, but they are not very powerful. |
26 |
* Atomic operations do not require locking, but they are not very powerful. |
27 |
*/ |
27 |
*/ |
28 |
|
28 |
|
29 |
# if !defined (__cplusplus) && (__STDC_VERSION__ >= 201112L) \ |
29 |
/* Clang older versions support atomics but lacks the stdatomic.h header */ |
30 |
&& !defined (__STDC_NO_ATOMICS__) |
30 |
#if defined(__clang__) |
|
|
31 |
# if !defined(__has_include) || !__has_include(<stdatomic.h>) |
32 |
# define __STDC_NO_ATOMICS__ 1 |
33 |
# endif |
34 |
#endif |
31 |
|
35 |
|
|
|
36 |
# if !defined(__cplusplus) || !defined (__STDC_NO_ATOMICS__) |
37 |
# if (__STDC_VERSION__ >= 201112L) |
32 |
/*** Native C11 atomics ***/ |
38 |
/*** Native C11 atomics ***/ |
33 |
# include <stdatomic.h> |
39 |
# include <stdatomic.h> |
34 |
|
40 |
|
35 |
# else |
41 |
# else |
|
|
42 |
/*** Intel/GCC atomics ***/ |
36 |
|
43 |
|
37 |
# define ATOMIC_FLAG_INIT false |
44 |
# define ATOMIC_FLAG_INIT false |
38 |
|
45 |
|
Lines 53-74
Link Here
|
53 |
# define atomic_is_lock_free(obj) \ |
60 |
# define atomic_is_lock_free(obj) \ |
54 |
false |
61 |
false |
55 |
|
62 |
|
56 |
/* In principles, __sync_*() only supports int, long and long long and their |
|
|
57 |
* unsigned equivalents, i.e. 4-bytes and 8-bytes types, although GCC also |
58 |
* supports 1 and 2-bytes types. Some non-x86 architectures do not support |
59 |
* 8-byte atomic types (or not efficiently). */ |
60 |
# if defined (_MSC_VER) |
61 |
/* Some atomic operations of the Interlocked API are only |
62 |
available for desktop apps. Thus we define the atomic types to |
63 |
be at least 32 bits wide. */ |
64 |
typedef int_least32_t atomic_flag; |
65 |
typedef int_least32_t atomic_bool; |
66 |
typedef int_least32_t atomic_char; |
67 |
typedef int_least32_t atomic_schar; |
68 |
typedef uint_least32_t atomic_uchar; |
69 |
typedef int_least32_t atomic_short; |
70 |
typedef uint_least32_t atomic_ushort; |
71 |
# else |
72 |
typedef bool atomic_flag; |
63 |
typedef bool atomic_flag; |
73 |
typedef bool atomic_bool; |
64 |
typedef bool atomic_bool; |
74 |
typedef char atomic_char; |
65 |
typedef char atomic_char; |
Lines 76-82
typedef signed char atomic_schar;
Link Here
|
76 |
typedef unsigned char atomic_uchar; |
67 |
typedef unsigned char atomic_uchar; |
77 |
typedef short atomic_short; |
68 |
typedef short atomic_short; |
78 |
typedef unsigned short atomic_ushort; |
69 |
typedef unsigned short atomic_ushort; |
79 |
# endif |
|
|
80 |
typedef int atomic_int; |
70 |
typedef int atomic_int; |
81 |
typedef unsigned int atomic_uint; |
71 |
typedef unsigned int atomic_uint; |
82 |
typedef long atomic_long; |
72 |
typedef long atomic_long; |
Lines 109-118
typedef ptrdiff_t atomic_ptrdiff
Link Here
|
109 |
typedef intmax_t atomic_intmax_t; |
99 |
typedef intmax_t atomic_intmax_t; |
110 |
typedef uintmax_t atomic_uintmax_t; |
100 |
typedef uintmax_t atomic_uintmax_t; |
111 |
|
101 |
|
112 |
# if defined (__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) || (defined (__clang__) && (defined (__x86_64__) || defined (__i386__))) |
|
|
113 |
|
114 |
/*** Intel/GCC atomics ***/ |
115 |
|
116 |
# define atomic_store(object,desired) \ |
102 |
# define atomic_store(object,desired) \ |
117 |
do { \ |
103 |
do { \ |
118 |
*(object) = (desired); \ |
104 |
*(object) = (desired); \ |
Lines 203-406
typedef uintmax_t atomic_uintmax
Link Here
|
203 |
# define atomic_flag_clear_explicit(object,order) \ |
189 |
# define atomic_flag_clear_explicit(object,order) \ |
204 |
atomic_flag_clear(object) |
190 |
atomic_flag_clear(object) |
205 |
|
191 |
|
206 |
# elif defined (__GNUC__) |
192 |
# endif /* !C11 */ |
207 |
|
|
|
208 |
/*** No atomics ***/ |
209 |
|
210 |
# define atomic_store(object,desired) \ |
211 |
do { \ |
212 |
typeof (object) _obj = (object); \ |
213 |
typeof (*object) _des = (desired); \ |
214 |
vlc_global_lock(VLC_ATOMIC_MUTEX); \ |
215 |
*_obj = _des; \ |
216 |
vlc_global_unlock(VLC_ATOMIC_MUTEX); \ |
217 |
} while (0) |
218 |
# define atomic_store_explicit(object,desired,order) \ |
219 |
atomic_store(object,desired) |
220 |
|
221 |
# define atomic_load(object) \ |
222 |
({ \ |
223 |
typeof (object) _obj = (object); \ |
224 |
typeof (*object) _old; \ |
225 |
vlc_global_lock(VLC_ATOMIC_MUTEX); \ |
226 |
_old = *_obj; \ |
227 |
vlc_global_unlock(VLC_ATOMIC_MUTEX); \ |
228 |
_old; \ |
229 |
}) |
230 |
# define atomic_load_explicit(object,order) \ |
231 |
atomic_load(object) |
232 |
|
233 |
# define atomic_exchange(object,desired) \ |
234 |
({ \ |
235 |
typeof (object) _obj = (object); \ |
236 |
typeof (*object) _des = (desired); \ |
237 |
typeof (*object) _old; \ |
238 |
vlc_global_lock(VLC_ATOMIC_MUTEX); \ |
239 |
_old = *_obj; \ |
240 |
*_obj = _des; \ |
241 |
vlc_global_unlock(VLC_ATOMIC_MUTEX); \ |
242 |
_old; \ |
243 |
}) |
244 |
# define atomic_exchange_explicit(object,desired,order) \ |
245 |
atomic_exchange(object,desired) |
246 |
|
247 |
# define atomic_compare_exchange_strong(object,expected,desired) \ |
248 |
({ \ |
249 |
typeof (object) _obj = (object); \ |
250 |
typeof (object) _exp = (expected); \ |
251 |
typeof (*object) _des = (desired); \ |
252 |
bool ret; \ |
253 |
vlc_global_lock(VLC_ATOMIC_MUTEX); \ |
254 |
ret = *_obj == *_exp; \ |
255 |
if (ret) \ |
256 |
*_obj = _des; \ |
257 |
else \ |
258 |
*_exp = *_obj; \ |
259 |
vlc_global_unlock(VLC_ATOMIC_MUTEX); \ |
260 |
ret; \ |
261 |
}) |
262 |
# define atomic_compare_exchange_strong_explicit(object,expected,desired,order) \ |
263 |
atomic_compare_exchange_strong(object, expected, desired) |
264 |
# define atomic_compare_exchange_weak(object,expected,desired) \ |
265 |
atomic_compare_exchange_strong(object, expected, desired) |
266 |
# define atomic_compare_exchange_weak_explicit(object,expected,desired,order) \ |
267 |
atomic_compare_exchange_weak(object, expected, desired) |
268 |
|
269 |
# define atomic_fetch_OP(object,desired,op) \ |
270 |
({ \ |
271 |
typeof (object) _obj = (object); \ |
272 |
typeof (*object) _des = (desired); \ |
273 |
typeof (*object) _old; \ |
274 |
vlc_global_lock(VLC_ATOMIC_MUTEX); \ |
275 |
_old = *_obj; \ |
276 |
*_obj = (*_obj) op (_des); \ |
277 |
vlc_global_unlock(VLC_ATOMIC_MUTEX); \ |
278 |
_old; \ |
279 |
}) |
280 |
|
281 |
# define atomic_fetch_add(object,operand) \ |
282 |
atomic_fetch_OP(object,operand,+) |
283 |
# define atomic_fetch_add_explicit(object,operand,order) \ |
284 |
atomic_fetch_add(object,operand) |
285 |
|
286 |
# define atomic_fetch_sub(object,operand) \ |
287 |
atomic_fetch_OP(object,operand,-) |
288 |
# define atomic_fetch_sub_explicit(object,operand,order) \ |
289 |
atomic_fetch_sub(object,operand) |
290 |
|
291 |
# define atomic_fetch_or(object,operand) \ |
292 |
atomic_fetch_OP(object,operand,|) |
293 |
# define atomic_fetch_or_explicit(object,operand,order) \ |
294 |
atomic_fetch_or(object,operand) |
295 |
|
296 |
# define atomic_fetch_xor(object,operand) \ |
297 |
atomic_fetch_OP(object,operand,^) |
298 |
# define atomic_fetch_xor_explicit(object,operand,order) \ |
299 |
atomic_fetch_sub(object,operand) |
300 |
|
301 |
# define atomic_fetch_and(object,operand) \ |
302 |
atomic_fetch_OP(object,operand,&) |
303 |
# define atomic_fetch_and_explicit(object,operand,order) \ |
304 |
atomic_fetch_and(object,operand) |
305 |
|
306 |
# define atomic_flag_test_and_set(object) \ |
307 |
atomic_exchange(object, true) |
308 |
|
309 |
# define atomic_flag_test_and_set_explicit(object,order) \ |
310 |
atomic_flag_test_and_set(object) |
311 |
|
312 |
# define atomic_flag_clear(object) \ |
313 |
atomic_store(object, false) |
314 |
|
315 |
# define atomic_flag_clear_explicit(object,order) \ |
316 |
atomic_flag_clear(object) |
317 |
|
318 |
# elif defined (_MSC_VER) |
319 |
|
320 |
# include <windows.h> |
321 |
|
322 |
/*** Use the Interlocked API. ***/ |
323 |
|
324 |
/* Define macros in order to dispatch to the correct function depending on the type. |
325 |
Several ranges are need because some operations are not implemented for all types. */ |
326 |
# define atomic_type_dispatch_32_64(operation, object, ...) \ |
327 |
(sizeof(*object) == 4 ? operation((LONG *)object, __VA_ARGS__) : \ |
328 |
sizeof(*object) == 8 ? operation##64((LONGLONG *)object, __VA_ARGS__) : \ |
329 |
(abort(), 0)) |
330 |
|
331 |
# define atomic_type_dispatch_16_64(operation, object, ...) \ |
332 |
(sizeof(*object) == 2 ? operation##16((short *)object, __VA_ARGS__) : \ |
333 |
atomic_type_dispatch_32_64(operation, object, __VA_ARGS__)) |
334 |
|
335 |
# define atomic_type_dispatch_8_64(operation, object, ...) \ |
336 |
(sizeof(*object) == 1 ? operation##8((char *)object, __VA_ARGS__) : \ |
337 |
atomic_type_dispatch_16_64(operation, object, __VA_ARGS__)) |
338 |
|
339 |
# define atomic_store(object,desired) \ |
340 |
atomic_type_dispatch_16_64(InterlockedExchange, object, desired) |
341 |
# define atomic_store_explicit(object,desired,order) \ |
342 |
atomic_store(object, desired) |
343 |
|
344 |
# define atomic_load(object) \ |
345 |
atomic_type_dispatch_16_64(InterlockedCompareExchange, object, 0, 0) |
346 |
# define atomic_load_explicit(object,order) \ |
347 |
atomic_load(object) |
348 |
|
349 |
# define atomic_exchange(object,desired) \ |
350 |
atomic_type_dispatch_16_64(InterlockedExchange, object, desired) |
351 |
# define atomic_exchange_explicit(object,desired,order) \ |
352 |
atomic_exchange(object, desired) |
353 |
|
354 |
# define atomic_compare_exchange_strong(object,expected,desired) \ |
355 |
atomic_type_dispatch_16_64(InterlockedCompareExchange, object, *expected, desired) == *expected |
356 |
# define atomic_compare_exchange_strong_explicit(object,expected,desired,order) \ |
357 |
atomic_compare_exchange_strong(object, expected, desired) |
358 |
# define atomic_compare_exchange_weak(object,expected,desired) \ |
359 |
atomic_compare_exchange_strong(object, expected, desired) |
360 |
# define atomic_compare_exchange_weak_explicit(object,expected,desired,order) \ |
361 |
atomic_compare_exchange_weak(object, expected, desired) |
362 |
|
363 |
# define atomic_fetch_add(object,operand) \ |
364 |
atomic_type_dispatch_32_64(InterlockedExchangeAdd, object, operand) |
365 |
# define atomic_fetch_add_explicit(object,operand,order) \ |
366 |
atomic_fetch_add(object, operand) |
367 |
|
368 |
# define atomic_fetch_sub(object,operand) \ |
369 |
atomic_type_dispatch_32_64(InterlockedExchangeAdd, object, -(LONGLONG)operand) |
370 |
# define atomic_fetch_sub_explicit(object,operand,order) \ |
371 |
atomic_fetch_sub(object, operand) |
372 |
|
373 |
# define atomic_fetch_or(object,operand) \ |
374 |
atomic_type_dispatch_8_64(InterlockedOr, object, operand) |
375 |
# define atomic_fetch_or_explicit(object,operand,order) \ |
376 |
atomic_fetch_or(object, operand) |
377 |
|
378 |
# define atomic_fetch_xor(object,operand) \ |
379 |
atomic_type_dispatch_8_64(InterlockedXor, object, operand) |
380 |
# define atomic_fetch_xor_explicit(object,operand,order) \ |
381 |
atomic_fetch_sub(object, operand) |
382 |
|
383 |
# define atomic_fetch_and(object,operand) \ |
384 |
atomic_type_dispatch_8_64(InterlockedAnd, object, operand) |
385 |
# define atomic_fetch_and_explicit(object,operand,order) \ |
386 |
atomic_fetch_and(object, operand) |
387 |
|
388 |
# define atomic_flag_test_and_set(object) \ |
389 |
atomic_exchange(object, true) |
390 |
|
391 |
# define atomic_flag_test_and_set_explicit(object,order) \ |
392 |
atomic_flag_test_and_set(object) |
393 |
|
394 |
# define atomic_flag_clear(object) \ |
395 |
atomic_store(object, false) |
396 |
|
397 |
# define atomic_flag_clear_explicit(object,order) \ |
398 |
atomic_flag_clear(object) |
399 |
|
400 |
# else |
401 |
# error FIXME: implement atomic operations for this compiler. |
402 |
# endif |
403 |
# endif |
404 |
|
193 |
|
405 |
typedef atomic_uint_least32_t vlc_atomic_float; |
194 |
typedef atomic_uint_least32_t vlc_atomic_float; |
406 |
|
195 |
|
Lines 427-430
static inline void vlc_atomic_store_floa
Link Here
|
427 |
atomic_store(atom, u.i); |
216 |
atomic_store(atom, u.i); |
428 |
} |
217 |
} |
429 |
|
218 |
|
|
|
219 |
# else /* C++ */ |
220 |
/*** Native C++11 atomics ***/ |
221 |
# include <atomic> |
222 |
# endif /* C++ */ |
223 |
|
430 |
#endif |
224 |
#endif |
431 |
-- vlc-2.2.3.orig/include/vlc_spu.h |
225 |
++ vlc-2.2.3/include/vlc_spu.h |
Lines 45-53
extern "C" {
Link Here
|
45 |
|
45 |
|
46 |
typedef struct spu_private_t spu_private_t; |
46 |
typedef struct spu_private_t spu_private_t; |
47 |
|
47 |
|
48 |
/* Default subpicture channel ID */ |
|
|
49 |
#define SPU_DEFAULT_CHANNEL (1) |
50 |
|
51 |
/** |
48 |
/** |
52 |
* Subpicture unit descriptor |
49 |
* Subpicture unit descriptor |
53 |
*/ |
50 |
*/ |
54 |
-- vlc-2.2.3.orig/include/vlc_vout_osd.h |
51 |
++ vlc-2.2.3/include/vlc_vout_osd.h |
Lines 26-37
Link Here
|
26 |
#ifndef VLC_VOUT_OSD_H |
26 |
#ifndef VLC_VOUT_OSD_H |
27 |
#define VLC_VOUT_OSD_H 1 |
27 |
#define VLC_VOUT_OSD_H 1 |
28 |
|
28 |
|
29 |
#include <vlc_spu.h> |
|
|
30 |
|
31 |
#ifdef __cplusplus |
29 |
#ifdef __cplusplus |
32 |
extern "C" { |
30 |
extern "C" { |
33 |
#endif |
31 |
#endif |
34 |
|
32 |
|
|
|
33 |
//* Default subpicture channel ID */ |
34 |
#define SPU_DEFAULT_CHANNEL (1) |
35 |
|
35 |
/** |
36 |
/** |
36 |
* OSD menu position and picture type defines |
37 |
* OSD menu position and picture type defines |
37 |
*/ |
38 |
*/ |
38 |
-- vlc-2.2.3.orig/src/video_output/video_output.c |
39 |
++ vlc-2.2.3/src/video_output/video_output.c |
Lines 43-48
Link Here
|
43 |
#include <vlc_vout.h> |
43 |
#include <vlc_vout.h> |
44 |
|
44 |
|
45 |
#include <vlc_filter.h> |
45 |
#include <vlc_filter.h> |
|
|
46 |
#include <vlc_spu.h> |
46 |
#include <vlc_vout_osd.h> |
47 |
#include <vlc_vout_osd.h> |
47 |
#include <vlc_image.h> |
48 |
#include <vlc_image.h> |
48 |
|
49 |
|
49 |
-- vlc-2.2.3.orig/modules/gui/qt4/dialogs/messages.hpp |
50 |
++ vlc-2.2.3/modules/gui/qt4/dialogs/messages.hpp |
Lines 28-35
Link Here
|
28 |
#include "util/singleton.hpp" |
28 |
#include "util/singleton.hpp" |
29 |
#include "ui/messages_panel.h" |
29 |
#include "ui/messages_panel.h" |
30 |
#include <stdarg.h> |
30 |
#include <stdarg.h> |
31 |
#include <vlc_atomic.h> |
|
|
32 |
#include <QMutex> |
31 |
#include <QMutex> |
|
|
32 |
#include <QAtomicInt> |
33 |
|
33 |
|
34 |
class QTabWidget; |
34 |
class QTabWidget; |
35 |
class QPushButton; |
35 |
class QPushButton; |
Lines 55-61
private:
Link Here
|
55 |
void sinkMessage( const MsgEvent * ); |
55 |
void sinkMessage( const MsgEvent * ); |
56 |
bool matchFilter( const QString& ); |
56 |
bool matchFilter( const QString& ); |
57 |
|
57 |
|
58 |
atomic_uint verbosity; |
58 |
QAtomicInt verbosity; |
59 |
static void MsgCallback( void *, int, const vlc_log_t *, const char *, |
59 |
static void MsgCallback( void *, int, const vlc_log_t *, const char *, |
60 |
va_list ); |
60 |
va_list ); |
61 |
|
61 |
|
62 |
-- vlc-2.2.3.orig/modules/gui/qt4/dialogs/messages.cpp |
62 |
++ vlc-2.2.3/modules/gui/qt4/dialogs/messages.cpp |
Lines 143-149
MessagesDialog::~MessagesDialog()
Link Here
|
143 |
|
143 |
|
144 |
void MessagesDialog::changeVerbosity( int i_verbosity ) |
144 |
void MessagesDialog::changeVerbosity( int i_verbosity ) |
145 |
{ |
145 |
{ |
146 |
atomic_store( &this->verbosity, i_verbosity ); |
146 |
verbosity = i_verbosity; |
147 |
} |
147 |
} |
148 |
|
148 |
|
149 |
void MessagesDialog::updateConfig() |
149 |
void MessagesDialog::updateConfig() |
Lines 337-343
void MessagesDialog::MsgCallback( void *
Link Here
|
337 |
{ |
337 |
{ |
338 |
MessagesDialog *dialog = (MessagesDialog *)self; |
338 |
MessagesDialog *dialog = (MessagesDialog *)self; |
339 |
char *str; |
339 |
char *str; |
340 |
int verbosity = atomic_load( &dialog->verbosity ); |
340 |
int verbosity = dialog->verbosity; |
341 |
|
341 |
|
342 |
if( verbosity < 0 || verbosity < (type - VLC_MSG_ERR) |
342 |
if( verbosity < 0 || verbosity < (type - VLC_MSG_ERR) |
343 |
|| unlikely(vasprintf( &str, format, ap ) == -1) ) |
343 |
|| unlikely(vasprintf( &str, format, ap ) == -1) ) |