1
1
/*
2
2
* DISTRHO Plugin Framework (DPF)
3
- * Copyright (C) 2012-2022 Filipe Coelho <falktx@falktx.com>
4
- *
5
- * Permission to use, copy, modify, and/or distribute this software for any purpose with
6
- * or without fee is hereby granted, provided that the above copyright notice and this
7
- * permission notice appear in all copies.
8
- *
9
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
10
- * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
11
- * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
12
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
13
- * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3
+ * Copyright (C) 2012-2023 Filipe Coelho <falktx@falktx.com>
4
+ * SPDX-License-Identifier: ISC
15
5
*/
16
6
17
7
#ifndef DISTRHO_SEMAPHORE_HPP_INCLUDED
28
18
# endif
29
19
# include < winsock2.h>
30
20
# include < windows.h>
31
- #elif defined(__MOD_DEVICES__)
32
- # include < linux/futex.h>
33
- # include < sys/time.h>
34
- # include < errno.h>
35
- # include < syscall.h>
36
- # include < unistd.h>
37
21
#else
38
22
# include < semaphore.h>
39
23
# include < sys/time.h>
40
24
#endif
41
25
42
26
START_NAMESPACE_DISTRHO
43
27
44
- // -----------------------------------------------------------------------
28
+ // --------------------------------------------------------------------------------------------------------------------
45
29
46
30
class Semaphore
47
31
{
@@ -56,8 +40,6 @@ class Semaphore
56
40
#elif defined(DISTRHO_OS_WINDOWS)
57
41
handle = ::CreateSemaphoreA (nullptr , initialValue, std::max (initialValue, 1 ), nullptr );
58
42
DISTRHO_SAFE_ASSERT_RETURN (handle != INVALID_HANDLE_VALUE,);
59
- #elif defined(__MOD_DEVICES__)
60
- value = initialValue;
61
43
#else
62
44
::sem_init (&sem, 0 , initialValue);
63
45
#endif
@@ -69,8 +51,6 @@ class Semaphore
69
51
::semaphore_destroy (mach_task_self(), sem);
70
52
#elif defined(DISTRHO_OS_WINDOWS)
71
53
::CloseHandle (handle);
72
- #elif defined(__MOD_DEVICES__)
73
- // nothing here
74
54
#else
75
55
::sem_destroy (&sem);
76
56
#endif
@@ -82,10 +62,6 @@ class Semaphore
82
62
::semaphore_signal (sem);
83
63
#elif defined(DISTRHO_OS_WINDOWS)
84
64
::ReleaseSemaphore (handle, 1 , nullptr );
85
- #elif defined(__MOD_DEVICES__)
86
- // if already unlocked, do not wake futex
87
- if (::__sync_bool_compare_and_swap (&value, 0 , 1 ))
88
- ::syscall (__NR_futex, &value, FUTEX_WAKE_PRIVATE, 1 , nullptr , nullptr , 0 );
89
65
#else
90
66
::sem_post (&sem);
91
67
#endif
@@ -97,18 +73,6 @@ class Semaphore
97
73
return ::semaphore_wait (sem) == KERN_SUCCESS;
98
74
#elif defined(DISTRHO_OS_WINDOWS)
99
75
return ::WaitForSingleObject (handle, INFINITE) == WAIT_OBJECT_0;
100
- #elif defined(__MOD_DEVICES__)
101
- for (;;)
102
- {
103
- if (::__sync_bool_compare_and_swap (&value, 1 , 0 ))
104
- return true ;
105
-
106
- if (::syscall (__NR_futex, &value, FUTEX_WAIT_PRIVATE, 0 , nullptr , nullptr , 0 ) != 0 )
107
- {
108
- if (errno != EAGAIN && errno != EINTR)
109
- return false ;
110
- }
111
- }
112
76
#else
113
77
return ::sem_wait (&sem) == 0 ;
114
78
#endif
@@ -121,39 +85,25 @@ class Semaphore
121
85
return ::semaphore_timedwait (sem, time ) == KERN_SUCCESS;
122
86
#elif defined(DISTRHO_OS_WINDOWS)
123
87
return ::WaitForSingleObject (handle, numSecs * 1000 ) == WAIT_OBJECT_0;
124
- #elif defined(__MOD_DEVICES__)
125
- const struct timespec timeout = { static_cast <time_t >(numSecs), 0 };
126
- for (;;)
127
- {
128
- if (::__sync_bool_compare_and_swap (&value, 1 , 0 ))
129
- return true ;
130
-
131
- if (::syscall (__NR_futex, &value, FUTEX_WAIT_PRIVATE, 0 , &timeout, nullptr , 0 ) != 0 )
132
- {
133
- if (errno != EAGAIN && errno != EINTR)
134
- return false ;
135
- }
136
- }
137
88
#else
138
89
struct timespec timeout;
139
90
::clock_gettime (CLOCK_REALTIME, &timeout);
140
91
timeout.tv_sec += numSecs;
141
92
return ::sem_timedwait (&sem, &timeout) == 0 ;
142
93
#endif
143
94
}
95
+
144
96
private:
145
97
#if defined(DISTRHO_OS_MAC)
146
98
::semaphore_t sem;
147
99
#elif defined(DISTRHO_OS_WINDOWS)
148
100
::HANDLE handle;
149
- #elif defined(__MOD_DEVICES__)
150
- int value;
151
101
#else
152
102
::sem_t sem;
153
103
#endif
154
104
};
155
105
156
- // -----------------------------------------------------------------------
106
+ // --------------------------------------------------------------------------------------------------------------------
157
107
158
108
END_NAMESPACE_DISTRHO
159
109
0 commit comments