1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker *
4*fb1b10abSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker */
10*fb1b10abSAndroid Build Coastguard Worker
11*fb1b10abSAndroid Build Coastguard Worker #ifndef VPX_VP8_COMMON_THREADING_H_
12*fb1b10abSAndroid Build Coastguard Worker #define VPX_VP8_COMMON_THREADING_H_
13*fb1b10abSAndroid Build Coastguard Worker
14*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_config.h"
15*fb1b10abSAndroid Build Coastguard Worker
16*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus
17*fb1b10abSAndroid Build Coastguard Worker extern "C" {
18*fb1b10abSAndroid Build Coastguard Worker #endif
19*fb1b10abSAndroid Build Coastguard Worker
20*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_OS_SUPPORT && CONFIG_MULTITHREAD
21*fb1b10abSAndroid Build Coastguard Worker
22*fb1b10abSAndroid Build Coastguard Worker #if defined(_WIN32) && !HAVE_PTHREAD_H
23*fb1b10abSAndroid Build Coastguard Worker /* Win32 */
24*fb1b10abSAndroid Build Coastguard Worker #include <windows.h>
25*fb1b10abSAndroid Build Coastguard Worker #else
26*fb1b10abSAndroid Build Coastguard Worker /* pthreads */
27*fb1b10abSAndroid Build Coastguard Worker #ifdef __APPLE__
28*fb1b10abSAndroid Build Coastguard Worker #include <mach/mach_init.h>
29*fb1b10abSAndroid Build Coastguard Worker #include <mach/semaphore.h>
30*fb1b10abSAndroid Build Coastguard Worker #include <mach/task.h>
31*fb1b10abSAndroid Build Coastguard Worker #include <time.h>
32*fb1b10abSAndroid Build Coastguard Worker #include <unistd.h>
33*fb1b10abSAndroid Build Coastguard Worker #else
34*fb1b10abSAndroid Build Coastguard Worker #include <semaphore.h>
35*fb1b10abSAndroid Build Coastguard Worker #endif
36*fb1b10abSAndroid Build Coastguard Worker #endif
37*fb1b10abSAndroid Build Coastguard Worker
38*fb1b10abSAndroid Build Coastguard Worker /* Synchronization macros: Win32 and Pthreads */
39*fb1b10abSAndroid Build Coastguard Worker #if defined(_WIN32) && !HAVE_PTHREAD_H
40*fb1b10abSAndroid Build Coastguard Worker #define vp8_sem_t HANDLE
41*fb1b10abSAndroid Build Coastguard Worker #define vp8_sem_init(sem, pshared, value) \
42*fb1b10abSAndroid Build Coastguard Worker (int)((*sem = CreateSemaphore(NULL, value, 32768, NULL)) == NULL)
43*fb1b10abSAndroid Build Coastguard Worker #define vp8_sem_wait(sem) \
44*fb1b10abSAndroid Build Coastguard Worker (int)(WAIT_OBJECT_0 != WaitForSingleObject(*sem, INFINITE))
45*fb1b10abSAndroid Build Coastguard Worker #define vp8_sem_post(sem) ReleaseSemaphore(*sem, 1, NULL)
46*fb1b10abSAndroid Build Coastguard Worker #define vp8_sem_destroy(sem) \
47*fb1b10abSAndroid Build Coastguard Worker if (*sem) ((int)(CloseHandle(*sem)) == TRUE)
48*fb1b10abSAndroid Build Coastguard Worker #define thread_sleep(nms) Sleep(nms)
49*fb1b10abSAndroid Build Coastguard Worker
50*fb1b10abSAndroid Build Coastguard Worker #else
51*fb1b10abSAndroid Build Coastguard Worker
52*fb1b10abSAndroid Build Coastguard Worker #ifdef __APPLE__
53*fb1b10abSAndroid Build Coastguard Worker #define vp8_sem_t semaphore_t
54*fb1b10abSAndroid Build Coastguard Worker #define vp8_sem_init(sem, pshared, value) \
55*fb1b10abSAndroid Build Coastguard Worker semaphore_create(mach_task_self(), sem, SYNC_POLICY_FIFO, value)
56*fb1b10abSAndroid Build Coastguard Worker #define vp8_sem_wait(sem) semaphore_wait(*sem)
57*fb1b10abSAndroid Build Coastguard Worker #define vp8_sem_post(sem) semaphore_signal(*sem)
58*fb1b10abSAndroid Build Coastguard Worker #define vp8_sem_destroy(sem) semaphore_destroy(mach_task_self(), *sem)
59*fb1b10abSAndroid Build Coastguard Worker #else
60*fb1b10abSAndroid Build Coastguard Worker #include <errno.h>
61*fb1b10abSAndroid Build Coastguard Worker #include <unistd.h>
62*fb1b10abSAndroid Build Coastguard Worker #include <sched.h>
63*fb1b10abSAndroid Build Coastguard Worker #define vp8_sem_t sem_t
64*fb1b10abSAndroid Build Coastguard Worker #define vp8_sem_init sem_init
65*fb1b10abSAndroid Build Coastguard Worker static INLINE int vp8_sem_wait(vp8_sem_t *sem) {
66*fb1b10abSAndroid Build Coastguard Worker int ret;
67*fb1b10abSAndroid Build Coastguard Worker while ((ret = sem_wait(sem)) == -1 && errno == EINTR) {
68*fb1b10abSAndroid Build Coastguard Worker }
69*fb1b10abSAndroid Build Coastguard Worker return ret;
70*fb1b10abSAndroid Build Coastguard Worker }
71*fb1b10abSAndroid Build Coastguard Worker #define vp8_sem_post sem_post
72*fb1b10abSAndroid Build Coastguard Worker #define vp8_sem_destroy sem_destroy
73*fb1b10abSAndroid Build Coastguard Worker #endif /* __APPLE__ */
74*fb1b10abSAndroid Build Coastguard Worker /* Not Windows. Assume pthreads */
75*fb1b10abSAndroid Build Coastguard Worker
76*fb1b10abSAndroid Build Coastguard Worker /* thread_sleep implementation: yield unless Linux/Unix. */
77*fb1b10abSAndroid Build Coastguard Worker #if defined(__unix__) || defined(__APPLE__)
78*fb1b10abSAndroid Build Coastguard Worker #define thread_sleep(nms)
79*fb1b10abSAndroid Build Coastguard Worker /* {struct timespec ts;ts.tv_sec=0;
80*fb1b10abSAndroid Build Coastguard Worker ts.tv_nsec = 1000*nms;nanosleep(&ts, NULL);} */
81*fb1b10abSAndroid Build Coastguard Worker #else
82*fb1b10abSAndroid Build Coastguard Worker #define thread_sleep(nms) sched_yield();
83*fb1b10abSAndroid Build Coastguard Worker #endif /* __unix__ || __APPLE__ */
84*fb1b10abSAndroid Build Coastguard Worker
85*fb1b10abSAndroid Build Coastguard Worker #endif
86*fb1b10abSAndroid Build Coastguard Worker
87*fb1b10abSAndroid Build Coastguard Worker #if VPX_ARCH_X86 || VPX_ARCH_X86_64
88*fb1b10abSAndroid Build Coastguard Worker #include "vpx_ports/x86.h"
89*fb1b10abSAndroid Build Coastguard Worker #else
90*fb1b10abSAndroid Build Coastguard Worker #define x86_pause_hint()
91*fb1b10abSAndroid Build Coastguard Worker #endif
92*fb1b10abSAndroid Build Coastguard Worker
93*fb1b10abSAndroid Build Coastguard Worker #include "vpx_util/vpx_atomics.h"
94*fb1b10abSAndroid Build Coastguard Worker
vp8_atomic_spin_wait(int mb_col,const vpx_atomic_int * last_row_current_mb_col,const int nsync)95*fb1b10abSAndroid Build Coastguard Worker static INLINE void vp8_atomic_spin_wait(
96*fb1b10abSAndroid Build Coastguard Worker int mb_col, const vpx_atomic_int *last_row_current_mb_col,
97*fb1b10abSAndroid Build Coastguard Worker const int nsync) {
98*fb1b10abSAndroid Build Coastguard Worker while (mb_col > (vpx_atomic_load_acquire(last_row_current_mb_col) - nsync)) {
99*fb1b10abSAndroid Build Coastguard Worker x86_pause_hint();
100*fb1b10abSAndroid Build Coastguard Worker thread_sleep(0);
101*fb1b10abSAndroid Build Coastguard Worker }
102*fb1b10abSAndroid Build Coastguard Worker }
103*fb1b10abSAndroid Build Coastguard Worker
104*fb1b10abSAndroid Build Coastguard Worker #endif /* CONFIG_OS_SUPPORT && CONFIG_MULTITHREAD */
105*fb1b10abSAndroid Build Coastguard Worker
106*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus
107*fb1b10abSAndroid Build Coastguard Worker } // extern "C"
108*fb1b10abSAndroid Build Coastguard Worker #endif
109*fb1b10abSAndroid Build Coastguard Worker
110*fb1b10abSAndroid Build Coastguard Worker #endif // VPX_VP8_COMMON_THREADING_H_
111