Changeset 391 for python/trunk/Python/thread_atheos.h
- Timestamp:
- Mar 19, 2014, 11:31:01 PM (11 years ago)
- Location:
- python/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
python/trunk
-
Property svn:mergeinfo
set to
/python/vendor/Python-2.7.6 merged eligible /python/vendor/current merged eligible
-
Property svn:mergeinfo
set to
-
python/trunk/Python/thread_atheos.h
r2 r391 20 20 /* Use an atomic counter and a semaphore for maximum speed. */ 21 21 typedef struct fastmutex { 22 23 22 sem_id sem; 23 atomic_t count; 24 24 } fastmutex_t; 25 25 … … 34 34 static int fastmutex_create(const char *name, fastmutex_t * mutex) 35 35 { 36 37 38 36 mutex->count = 0; 37 mutex->sem = create_semaphore(name, 0, 0); 38 return (mutex->sem < 0) ? -1 : 0; 39 39 } 40 40 … … 42 42 static int fastmutex_destroy(fastmutex_t * mutex) 43 43 { 44 45 46 47 44 if (fastmutex_timedlock(mutex, 0) == 0 || errno == EWOULDBLOCK) { 45 return delete_semaphore(mutex->sem); 46 } 47 return 0; 48 48 } 49 49 … … 51 51 static int fastmutex_lock(fastmutex_t * mutex) 52 52 { 53 54 55 56 53 atomic_t prev = atomic_add(&mutex->count, 1); 54 if (prev > 0) 55 return lock_semaphore(mutex->sem); 56 return 0; 57 57 } 58 58 … … 60 60 static int fastmutex_timedlock(fastmutex_t * mutex, bigtime_t timeout) 61 61 { 62 63 64 65 62 atomic_t prev = atomic_add(&mutex->count, 1); 63 if (prev > 0) 64 return lock_semaphore_x(mutex->sem, 1, 0, timeout); 65 return 0; 66 66 } 67 67 … … 69 69 static int fastmutex_unlock(fastmutex_t * mutex) 70 70 { 71 72 73 74 75 } 76 77 78 #endif 71 atomic_t prev = atomic_add(&mutex->count, -1); 72 if (prev > 1) 73 return unlock_semaphore(mutex->sem); 74 return 0; 75 } 76 77 78 #endif /* FASTLOCK */ 79 79 80 80 … … 85 85 static void PyThread__init_thread(void) 86 86 { 87 88 87 /* Do nothing. */ 88 return; 89 89 } 90 90 … … 99 99 long PyThread_start_new_thread(void (*func) (void *), void *arg) 100 100 { 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 101 status_t success = -1; 102 thread_id tid; 103 char name[OS_NAME_LENGTH]; 104 atomic_t this_thread; 105 106 dprintf(("PyThread_start_new_thread called\n")); 107 108 this_thread = atomic_add(&thread_count, 1); 109 PyOS_snprintf(name, sizeof(name), "python thread (%d)", this_thread); 110 111 tid = spawn_thread(name, func, NORMAL_PRIORITY, 0, arg); 112 if (tid < 0) { 113 dprintf(("PyThread_start_new_thread spawn_thread failed: %s\n", strerror(errno))); 114 } else { 115 success = resume_thread(tid); 116 if (success < 0) { 117 dprintf(("PyThread_start_new_thread resume_thread failed: %s\n", strerror(errno))); 118 } 119 } 120 121 return (success < 0 ? -1 : tid); 122 122 } 123 123 … … 125 125 long PyThread_get_thread_ident(void) 126 126 { 127 return get_thread_id(NULL); 128 } 129 130 131 static void do_PyThread_exit_thread(int no_cleanup) 132 { 133 dprintf(("PyThread_exit_thread called\n")); 134 135 /* Thread-safe way to read a variable without a mutex: */ 136 if (atomic_add(&thread_count, 0) == 0) { 137 /* No threads around, so exit main(). */ 138 if (no_cleanup) 139 _exit(0); 140 else 141 exit(0); 142 } else { 143 /* We're a thread */ 144 exit_thread(0); 145 } 127 return get_thread_id(NULL); 146 128 } 147 129 … … 149 131 void PyThread_exit_thread(void) 150 132 { 151 do_PyThread_exit_thread(0); 152 } 153 154 155 void PyThread__exit_thread(void) 156 { 157 do_PyThread_exit_thread(1); 158 } 159 160 161 #ifndef NO_EXIT_PROG 162 static void do_PyThread_exit_prog(int status, int no_cleanup) 163 { 164 dprintf(("PyThread_exit_prog(%d) called\n", status)); 165 166 /* No need to do anything, the threads get torn down if main()exits. */ 167 if (no_cleanup) 168 _exit(status); 169 else 170 exit(status); 171 } 172 173 174 void PyThread_exit_prog(int status) 175 { 176 do_PyThread_exit_prog(status, 0); 177 } 178 179 180 void PyThread__exit_prog(int status) 181 { 182 do_PyThread_exit_prog(status, 1); 183 } 184 #endif /* NO_EXIT_PROG */ 133 dprintf(("PyThread_exit_thread called\n")); 134 135 /* Thread-safe way to read a variable without a mutex: */ 136 if (atomic_add(&thread_count, 0) == 0) { 137 /* No threads around, so exit main(). */ 138 exit(0); 139 } else { 140 /* We're a thread */ 141 exit_thread(0); 142 } 143 } 185 144 186 145 … … 195 154 { 196 155 #ifdef FASTLOCK 197 198 #else 199 200 #endif 201 202 203 204 205 206 #ifdef FASTLOCK 207 208 209 210 211 212 #endif 213 214 215 216 #ifdef FASTLOCK 217 218 219 220 221 222 223 224 225 #else 226 227 228 229 230 231 232 233 156 fastmutex_t *lock; 157 #else 158 sem_id sema; 159 #endif 160 char name[OS_NAME_LENGTH]; 161 atomic_t this_lock; 162 163 dprintf(("PyThread_allocate_lock called\n")); 164 165 #ifdef FASTLOCK 166 lock = (fastmutex_t *) malloc(sizeof(fastmutex_t)); 167 if (lock == NULL) { 168 dprintf(("PyThread_allocate_lock failed: out of memory\n")); 169 return (PyThread_type_lock) NULL; 170 } 171 #endif 172 this_lock = atomic_add(&lock_count, 1); 173 PyOS_snprintf(name, sizeof(name), "python lock (%d)", this_lock); 174 175 #ifdef FASTLOCK 176 if (fastmutex_create(name, lock) < 0) { 177 dprintf(("PyThread_allocate_lock failed: %s\n", 178 strerror(errno))); 179 free(lock); 180 lock = NULL; 181 } 182 dprintf(("PyThread_allocate_lock()-> %p\n", lock)); 183 return (PyThread_type_lock) lock; 184 #else 185 sema = create_semaphore(name, 1, 0); 186 if (sema < 0) { 187 dprintf(("PyThread_allocate_lock failed: %s\n", 188 strerror(errno))); 189 sema = 0; 190 } 191 dprintf(("PyThread_allocate_lock()-> %p\n", sema)); 192 return (PyThread_type_lock) sema; 234 193 #endif 235 194 } … … 238 197 void PyThread_free_lock(PyThread_type_lock lock) 239 198 { 240 241 242 #ifdef FASTLOCK 243 244 245 246 247 248 #else 249 250 251 252 199 dprintf(("PyThread_free_lock(%p) called\n", lock)); 200 201 #ifdef FASTLOCK 202 if (fastmutex_destroy((fastmutex_t *) lock) < 0) { 203 dprintf(("PyThread_free_lock(%p) failed: %s\n", lock, 204 strerror(errno))); 205 } 206 free(lock); 207 #else 208 if (delete_semaphore((sem_id) lock) < 0) { 209 dprintf(("PyThread_free_lock(%p) failed: %s\n", lock, 210 strerror(errno))); 211 } 253 212 #endif 254 213 } … … 257 216 int PyThread_acquire_lock(PyThread_type_lock lock, int waitflag) 258 217 { 259 260 261 262 263 264 #ifdef FASTLOCK 265 266 267 268 269 #else 270 271 272 273 274 #endif 275 276 277 278 279 280 281 218 int retval; 219 220 dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, 221 waitflag)); 222 223 #ifdef FASTLOCK 224 if (waitflag) 225 retval = fastmutex_lock((fastmutex_t *) lock); 226 else 227 retval = fastmutex_timedlock((fastmutex_t *) lock, 0); 228 #else 229 if (waitflag) 230 retval = lock_semaphore((sem_id) lock); 231 else 232 retval = lock_semaphore_x((sem_id) lock, 1, 0, 0); 233 #endif 234 if (retval < 0) { 235 dprintf(("PyThread_acquire_lock(%p, %d) failed: %s\n", 236 lock, waitflag, strerror(errno))); 237 } 238 dprintf(("PyThread_acquire_lock(%p, %d)-> %d\n", lock, waitflag, 239 retval)); 240 return retval < 0 ? 0 : 1; 282 241 } 283 242 … … 285 244 void PyThread_release_lock(PyThread_type_lock lock) 286 245 { 287 288 289 #ifdef FASTLOCK 290 291 292 293 294 #else 295 296 297 298 299 #endif 300 } 246 dprintf(("PyThread_release_lock(%p) called\n", lock)); 247 248 #ifdef FASTLOCK 249 if (fastmutex_unlock((fastmutex_t *) lock) < 0) { 250 dprintf(("PyThread_release_lock(%p) failed: %s\n", lock, 251 strerror(errno))); 252 } 253 #else 254 if (unlock_semaphore((sem_id) lock) < 0) { 255 dprintf(("PyThread_release_lock(%p) failed: %s\n", lock, 256 strerror(errno))); 257 } 258 #endif 259 }
Note:
See TracChangeset
for help on using the changeset viewer.