@@ -14,7 +14,7 @@ terms of the MIT license. A copy of the license can be found in the file
14
14
#define WIN32_LEAN_AND_MEAN
15
15
#endif
16
16
#include < windows.h>
17
- #elif !defined(_WIN32 ) && (defined(__EMSCRIPTEN_SHARED_MEMORY__ ) || ! defined(__wasi__ ))
17
+ #elif !defined(__wasi__ ) && (! defined(__EMSCRIPTEN__ ) || defined(__EMSCRIPTEN_PTHREADS__ ))
18
18
#define MI_USE_PTHREADS
19
19
#include < pthread.h>
20
20
#endif
@@ -35,9 +35,9 @@ terms of the MIT license. A copy of the license can be found in the file
35
35
#define mi_atomic (name ) std::atomic_##name
36
36
#define mi_memory_order (name ) std::memory_order_##name
37
37
#if (__cplusplus >= 202002L) // c++20, see issue #571
38
- #define MI_ATOMIC_VAR_INIT (x ) x
38
+ #define MI_ATOMIC_VAR_INIT (x ) x
39
39
#elif !defined(ATOMIC_VAR_INIT)
40
- #define MI_ATOMIC_VAR_INIT (x ) x
40
+ #define MI_ATOMIC_VAR_INIT (x ) x
41
41
#else
42
42
#define MI_ATOMIC_VAR_INIT (x ) ATOMIC_VAR_INIT(x)
43
43
#endif
@@ -337,6 +337,7 @@ typedef _Atomic(uintptr_t) mi_atomic_guard_t;
337
337
// ----------------------------------------------------------------------
338
338
// Yield
339
339
// ----------------------------------------------------------------------
340
+
340
341
#if defined(__cplusplus)
341
342
#include < thread>
342
343
static inline void mi_atomic_yield (void ) {
@@ -401,59 +402,73 @@ static inline void mi_atomic_yield(void) {
401
402
402
403
403
404
// ----------------------------------------------------------------------
404
- // Locks are only used for abandoned segment visiting
405
+ // Locks are only used for abandoned segment visiting in `arena.c`
405
406
// ----------------------------------------------------------------------
407
+
406
408
#if defined(_WIN32)
407
409
408
- #define mi_lock_t CRITICAL_SECTION
410
+ #define mi_lock_t CRITICAL_SECTION
409
411
410
- static inline bool _mi_prim_lock (mi_lock_t * lock) {
412
+ static inline bool mi_lock_try_acquire (mi_lock_t * lock) {
413
+ return TryEnterCriticalSection (lock);
414
+ }
415
+ static inline bool mi_lock_acquire (mi_lock_t * lock) {
411
416
EnterCriticalSection (lock);
412
417
return true ;
413
418
}
414
-
415
- static inline bool _mi_prim_try_lock (mi_lock_t * lock) {
416
- return TryEnterCriticalSection (lock);
417
- }
418
-
419
- static inline void _mi_prim_unlock (mi_lock_t * lock) {
419
+ static inline void mi_lock_release (mi_lock_t * lock) {
420
420
LeaveCriticalSection (lock);
421
421
}
422
+ static inline void mi_lock_init (mi_lock_t * lock) {
423
+ InitializeCriticalSection (lock);
424
+ }
425
+ static inline void mi_lock_done (mi_lock_t * lock) {
426
+ DeleteCriticalSection (lock);
427
+ }
422
428
423
429
424
430
#elif defined(MI_USE_PTHREADS)
425
431
426
432
#define mi_lock_t pthread_mutex_t
427
433
428
- static inline bool _mi_prim_lock (mi_lock_t * lock) {
429
- return (pthread_mutex_lock (lock) == 0 );
430
- }
431
-
432
- static inline bool _mi_prim_try_lock (mi_lock_t * lock) {
434
+ static inline bool mi_lock_try_acquire (mi_lock_t * lock) {
433
435
return (pthread_mutex_trylock (lock) == 0 );
434
436
}
435
-
436
- static inline void _mi_prim_unlock (mi_lock_t * lock) {
437
+ static inline bool mi_lock_acquire (mi_lock_t * lock) {
438
+ return (pthread_mutex_lock (lock) == 0 );
439
+ }
440
+ static inline void mi_lock_release (mi_lock_t * lock) {
437
441
pthread_mutex_unlock (lock);
438
442
}
443
+ static inline void mi_lock_init (mi_lock_t * lock) {
444
+ (void )(lock);
445
+ }
446
+ static inline void mi_lock_done (mi_lock_t * lock) {
447
+ (void )(lock);
448
+ }
449
+
439
450
440
451
#elif defined(__cplusplus)
441
452
442
453
#include < mutex>
443
454
#define mi_lock_t std::mutex
444
455
445
- static inline bool _mi_prim_lock (mi_lock_t * lock) {
456
+ static inline bool mi_lock_try_acquire (mi_lock_t * lock) {
457
+ return lock->lock_try_acquire ();
458
+ }
459
+ static inline bool mi_lock_acquire (mi_lock_t * lock) {
446
460
lock->lock ();
447
461
return true ;
448
462
}
449
-
450
- static inline bool _mi_prim_try_lock (mi_lock_t * lock) {
451
- return (lock->try_lock ();
452
- }
453
-
454
- static inline void _mi_prim_unlock (mi_lock_t * lock) {
463
+ static inline void mi_lock_release (mi_lock_t * lock) {
455
464
lock->unlock ();
456
465
}
466
+ static inline void mi_lock_init (mi_lock_t * lock) {
467
+ (void )(lock);
468
+ }
469
+ static inline void mi_lock_done (mi_lock_t * lock) {
470
+ (void )(lock);
471
+ }
457
472
458
473
#else
459
474
@@ -462,22 +477,26 @@ static inline void _mi_prim_unlock(mi_lock_t* lock) {
462
477
463
478
#define mi_lock_t _Atomic (uintptr_t )
464
479
465
- static inline bool _mi_prim_try_lock (mi_lock_t * lock) {
480
+ static inline bool mi_lock_try_acquire (mi_lock_t * lock) {
466
481
uintptr_t expected = 0 ;
467
482
return mi_atomic_cas_strong_acq_rel (lock, &expected, (uintptr_t )1 );
468
483
}
469
-
470
- static inline bool _mi_prim_lock (mi_lock_t * lock) {
484
+ static inline bool mi_lock_acquire (mi_lock_t * lock) {
471
485
for (int i = 0 ; i < 1000 ; i++) { // for at most 1000 tries?
472
- if (_mi_prim_try_lock (lock)) return true ;
486
+ if (mi_lock_try_acquire (lock)) return true ;
473
487
mi_atomic_yield ();
474
488
}
475
489
return true ;
476
490
}
477
-
478
- static inline void _mi_prim_unlock (mi_lock_t * lock) {
491
+ static inline void mi_lock_release (mi_lock_t * lock) {
479
492
mi_atomic_store_release (lock, (uintptr_t )0 );
480
493
}
494
+ static inline void mi_lock_init (mi_lock_t * lock) {
495
+ mi_lock_release (lock);
496
+ }
497
+ static inline void mi_lock_done (mi_lock_t * lock) {
498
+ (void )(lock);
499
+ }
481
500
482
501
#endif
483
502
0 commit comments