169
170
171
172
173
174
175
176
177
178
179
180
181
182
|
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
|
+
+
+
+
+
+
+
+
+
+
|
return !pthread_key_delete(key);
#elif defined(OF_WINDOWS)
return TlsFree(key);
#else
# error of_tlskey_free not implemented!
#endif
}
static OF_INLINE void
of_thread_yield(void)
{
#if defined(OF_HAVE_SCHED_YIELD)
sched_yield();
#elif defined(OF_WINDOWS)
Sleep(0);
#endif
}
static OF_INLINE bool
of_spinlock_new(of_spinlock_t *spinlock)
{
#if defined(OF_HAVE_ATOMIC_OPS)
*spinlock = 0;
return true;
|
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
|
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
|
-
-
-
+
-
-
-
-
-
-
|
#endif
}
static OF_INLINE bool
of_spinlock_lock(of_spinlock_t *spinlock)
{
#if defined(OF_HAVE_ATOMIC_OPS)
# if defined(OF_HAVE_SCHED_YIELD) || defined(OF_WINDOWS)
size_t i;
for (i = 0; i < OF_SPINCOUNT; i++)
if (of_spinlock_trylock(spinlock))
return true;
while (!of_spinlock_trylock(spinlock))
# ifndef OF_WINDOWS
sched_yield();
of_thread_yield();
# else
Sleep(0);
# endif
# else
while (!of_spinlock_trylock(spinlock));
# endif
return true;
#elif defined(OF_HAVE_PTHREAD_SPINLOCKS)
return !pthread_spin_lock(spinlock);
#else
return of_mutex_lock(spinlock);
#endif
|