Differences From Artifact [74fca85fa4]:
- File
src/threading.m
— part of check-in
[f58ea581f0]
at
2016-03-28 11:26:47
on branch trunk
— Move Haiku-specific include to the right file
This was forgotten when splitting threading.m into multiple files. (user: js, size: 3141) [annotate] [blame] [check-ins using]
To Artifact [cdd5b61733]:
- File src/threading.m — part of check-in [9babc44b91] at 2016-04-18 14:08:21 on branch trunk — Further clean up of the threading.m split (user: js, size: 2334) [annotate] [blame] [check-ins using]
︙ | ︙ | |||
22 23 24 25 26 27 28 29 30 31 | # include "threading_pthread.m" #elif defined(OF_WINDOWS) # include "threading_winapi.m" #else # error No threads available! #endif bool of_rmutex_new(of_rmutex_t *rmutex) { | > < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < > | 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | # include "threading_pthread.m" #elif defined(OF_WINDOWS) # include "threading_winapi.m" #else # error No threads available! #endif #if !defined(OF_HAVE_RECURSIVE_PTHREAD_MUTEXES) && !defined(OF_WINDOWS) bool of_rmutex_new(of_rmutex_t *rmutex) { if (!of_mutex_new(&rmutex->mutex)) return false; if (!of_tlskey_new(&rmutex->count)) return false; return true; } bool of_rmutex_lock(of_rmutex_t *rmutex) { uintptr_t count = (uintptr_t)of_tlskey_get(rmutex->count); if (count > 0) { if (!of_tlskey_set(rmutex->count, (void*)(count + 1))) return false; return true; } if (!of_mutex_lock(&rmutex->mutex)) return false; if (!of_tlskey_set(rmutex->count, (void*)1)) { of_mutex_unlock(&rmutex->mutex); return false; } return true; } bool of_rmutex_trylock(of_rmutex_t *rmutex) { uintptr_t count = (uintptr_t)of_tlskey_get(rmutex->count); if (count > 0) { if (!of_tlskey_set(rmutex->count, (void*)(count + 1))) return false; return true; } if (!of_mutex_trylock(&rmutex->mutex)) return false; if (!of_tlskey_set(rmutex->count, (void*)1)) { of_mutex_unlock(&rmutex->mutex); return false; } return true; } bool of_rmutex_unlock(of_rmutex_t *rmutex) { uintptr_t count = (uintptr_t)of_tlskey_get(rmutex->count); if (count > 1) { if (!of_tlskey_set(rmutex->count, (void*)(count - 1))) return false; return true; } if (!of_tlskey_set(rmutex->count, (void*)0)) return false; if (!of_mutex_unlock(&rmutex->mutex)) return false; return true; } bool of_rmutex_free(of_rmutex_t *rmutex) { if (!of_mutex_free(&rmutex->mutex)) return false; if (!of_tlskey_free(rmutex->count)) return false; return true; } #endif |