Changeset 391 for python/trunk/Python/thread_beos.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_beos.h
r2 r391 8 8 */ 9 9 typedef struct benaphore { 10 11 10 sem_id _sem; 11 int32 _atom; 12 12 } benaphore_t; 13 13 … … 20 20 static status_t benaphore_create( const char *name, benaphore_t *ben ) 21 21 { 22 23 24 25 26 27 28 29 30 31 32 33 22 if( ben != NULL ) { 23 ben->_atom = 0; 24 ben->_sem = create_sem( 0, name ); 25 26 if( ben->_sem < B_NO_ERROR ) { 27 return B_BAD_SEM_ID; 28 } 29 } else { 30 return EFAULT; 31 } 32 33 return EOK; 34 34 } 35 35 36 36 static status_t benaphore_destroy( benaphore_t *ben ) 37 37 { 38 39 40 41 42 43 44 45 46 47 48 38 if( ben->_sem >= B_NO_ERROR ) { 39 status_t retval = benaphore_timedlock( ben, 0 ); 40 41 if( retval == EOK || retval == EWOULDBLOCK ) { 42 status_t del_retval = delete_sem( ben->_sem ); 43 44 return del_retval; 45 } 46 } 47 48 return B_BAD_SEM_ID; 49 49 } 50 50 51 51 static status_t benaphore_lock( benaphore_t *ben ) 52 52 { 53 54 55 56 57 58 59 53 int32 prev = atomic_add( &(ben->_atom), 1 ); 54 55 if( prev > 0 ) { 56 return acquire_sem( ben->_sem ); 57 } 58 59 return EOK; 60 60 } 61 61 62 62 static status_t benaphore_timedlock( benaphore_t *ben, bigtime_t micros ) 63 63 { 64 65 66 67 68 69 70 case B_WOULD_BLOCK:/* Fall through... */71 72 73 74 75 76 77 78 79 80 81 82 83 64 int32 prev = atomic_add( &(ben->_atom), 1 ); 65 66 if( prev > 0 ) { 67 status_t retval = acquire_sem_etc( ben->_sem, 1, B_TIMEOUT, micros ); 68 69 switch( retval ) { 70 case B_WOULD_BLOCK: /* Fall through... */ 71 case B_TIMED_OUT: 72 return EWOULDBLOCK; 73 break; 74 case B_OK: 75 return EOK; 76 break; 77 default: 78 return retval; 79 break; 80 } 81 } 82 83 return EOK; 84 84 } 85 85 86 86 static status_t benaphore_unlock( benaphore_t *ben ) 87 87 { 88 89 90 91 92 93 94 88 int32 prev = atomic_add( &(ben->_atom), -1 ); 89 90 if( prev > 1 ) { 91 return release_sem( ben->_sem ); 92 } 93 94 return EOK; 95 95 } 96 96 … … 100 100 static void PyThread__init_thread( void ) 101 101 { 102 103 102 /* Do nothing. */ 103 return; 104 104 } 105 105 … … 115 115 long PyThread_start_new_thread( void (*func)(void *), void *arg ) 116 116 { 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 117 status_t success = 0; 118 thread_id tid; 119 char name[B_OS_NAME_LENGTH]; 120 int32 this_thread; 121 122 dprintf(("PyThread_start_new_thread called\n")); 123 124 /* We are so very thread-safe... */ 125 this_thread = atomic_add( &thread_count, 1 ); 126 PyOS_snprintf(name, sizeof(name), 127 "python thread (%d)", this_thread ); 128 129 tid = spawn_thread( (thread_func)func, name, 130 B_NORMAL_PRIORITY, arg ); 131 if( tid > B_NO_ERROR ) { 132 success = resume_thread( tid ); 133 } 134 135 return ( success == B_NO_ERROR ? tid : -1 ); 136 136 } 137 137 138 138 long PyThread_get_thread_ident( void ) 139 139 { 140 /* Presumed to return the current thread's ID... */ 141 thread_id tid; 142 tid = find_thread( NULL ); 143 144 return ( tid != B_NAME_NOT_FOUND ? tid : -1 ); 145 } 146 147 static void do_PyThread_exit_thread( int no_cleanup ) 148 { 149 int32 threads; 150 151 dprintf(("PyThread_exit_thread called\n")); 152 153 /* Thread-safe way to read a variable without a mutex: */ 154 threads = atomic_add( &thread_count, 0 ); 155 156 if( threads == 0 ) { 157 /* No threads around, so exit main(). */ 158 if( no_cleanup ) { 159 _exit(0); 160 } else { 161 exit(0); 162 } 163 } else { 164 /* Oh, we're a thread, let's try to exit gracefully... */ 165 exit_thread( B_NO_ERROR ); 166 } 140 /* Presumed to return the current thread's ID... */ 141 thread_id tid; 142 tid = find_thread( NULL ); 143 144 return ( tid != B_NAME_NOT_FOUND ? tid : -1 ); 167 145 } 168 146 169 147 void PyThread_exit_thread( void ) 170 148 { 171 do_PyThread_exit_thread(0); 172 } 173 174 void PyThread__exit_thread( void ) 175 { 176 do_PyThread_exit_thread(1); 177 } 178 179 #ifndef NO_EXIT_PROG 180 static void do_PyThread_exit_prog( int status, int no_cleanup ) 181 { 182 dprintf(("PyThread_exit_prog(%d) called\n", status)); 183 184 /* No need to do anything, the threads get torn down if main() exits. */ 185 186 if (no_cleanup) { 187 _exit(status); 188 } else { 189 exit(status); 190 } 191 } 192 193 void PyThread_exit_prog( int status ) 194 { 195 do_PyThread_exit_prog(status, 0); 196 } 197 198 void PyThread__exit_prog( int status ) 199 { 200 do_PyThread_exit_prog(status, 1); 201 } 202 #endif /* NO_EXIT_PROG */ 149 int32 threads; 150 151 dprintf(("PyThread_exit_thread called\n")); 152 153 /* Thread-safe way to read a variable without a mutex: */ 154 threads = atomic_add( &thread_count, 0 ); 155 156 if( threads == 0 ) { 157 /* No threads around, so exit main(). */ 158 exit(0); 159 } else { 160 /* Oh, we're a thread, let's try to exit gracefully... */ 161 exit_thread( B_NO_ERROR ); 162 } 163 } 203 164 204 165 /* ---------------------------------------------------------------------- … … 210 171 PyThread_type_lock PyThread_allocate_lock( void ) 211 172 { 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 173 benaphore_t *lock; 174 status_t retval; 175 char name[B_OS_NAME_LENGTH]; 176 int32 this_lock; 177 178 dprintf(("PyThread_allocate_lock called\n")); 179 180 lock = (benaphore_t *)malloc( sizeof( benaphore_t ) ); 181 if( lock == NULL ) { 182 /* TODO: that's bad, raise MemoryError */ 183 return (PyThread_type_lock)NULL; 184 } 185 186 this_lock = atomic_add( &lock_count, 1 ); 187 PyOS_snprintf(name, sizeof(name), "python lock (%d)", this_lock); 188 189 retval = benaphore_create( name, lock ); 190 if( retval != EOK ) { 191 /* TODO: that's bad, raise an exception */ 192 return (PyThread_type_lock)NULL; 193 } 194 195 dprintf(("PyThread_allocate_lock() -> %p\n", lock)); 196 return (PyThread_type_lock) lock; 236 197 } 237 198 238 199 void PyThread_free_lock( PyThread_type_lock lock ) 239 200 { 240 241 242 243 244 245 246 247 248 201 status_t retval; 202 203 dprintf(("PyThread_free_lock(%p) called\n", lock)); 204 205 retval = benaphore_destroy( (benaphore_t *)lock ); 206 if( retval != EOK ) { 207 /* TODO: that's bad, raise an exception */ 208 return; 209 } 249 210 } 250 211 251 212 int PyThread_acquire_lock( PyThread_type_lock lock, int waitflag ) 252 213 { 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 214 int success; 215 status_t retval; 216 217 dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag)); 218 219 if( waitflag ) { 220 retval = benaphore_lock( (benaphore_t *)lock ); 221 } else { 222 retval = benaphore_timedlock( (benaphore_t *)lock, 0 ); 223 } 224 225 if( retval == EOK ) { 226 success = 1; 227 } else { 228 success = 0; 229 230 /* TODO: that's bad, raise an exception */ 231 } 232 233 dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success)); 234 return success; 274 235 } 275 236 276 237 void PyThread_release_lock( PyThread_type_lock lock ) 277 238 { 278 279 280 281 282 283 284 285 286 287 } 239 status_t retval; 240 241 dprintf(("PyThread_release_lock(%p) called\n", lock)); 242 243 retval = benaphore_unlock( (benaphore_t *)lock ); 244 if( retval != EOK ) { 245 /* TODO: that's bad, raise an exception */ 246 return; 247 } 248 }
Note:
See TracChangeset
for help on using the changeset viewer.