Coverage Report

Created: 2024-09-06 07:53

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