Changeset 2197
- Timestamp:
- Jun 25, 2007, 9:52:18 PM (16 years ago)
- Location:
- trunk/libtransmission
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/libtransmission/platform.c
r2184 r2197 213 213 } 214 214 215 void tr_threadCreate( tr_thread_t * t, void (*func)(void *), void * arg, 216 char * name ) 215 void tr_threadCreate( tr_thread_t * t, 216 void (*func)(void *), void * arg, 217 const char * name ) 217 218 { 218 219 t->func = func; 219 220 t->arg = arg; 220 t->name = strdup( name );221 t->name = tr_strdup( name ); 221 222 #ifdef SYS_BEOS 222 223 t->thread = spawn_thread( (void *) ThreadFunc, name, … … 232 233 void tr_threadJoin( tr_thread_t * t ) 233 234 { 234 if (t->func != NULL)235 if( t->func != NULL ) 235 236 { 236 237 #ifdef SYS_BEOS … … 262 263 #else 263 264 pthread_mutex_destroy( l ); 265 #endif 266 } 267 268 int tr_lockTryLock( tr_lock_t * l ) 269 { 270 #ifdef SYS_BEOS 271 #error how is this done in beos 272 #else 273 return pthread_mutex_trylock( l ); 264 274 #endif 265 275 } … … 322 332 #else 323 333 pthread_cond_signal( c ); 334 #endif 335 } 336 void tr_condBroadcast( tr_cond_t * c ) 337 { 338 #ifdef SYS_BEOS 339 #error how is this done in beos 340 #else 341 pthread_cond_broadcast( c ); 324 342 #endif 325 343 } … … 703 721 704 722 #endif 723 724 /*** 725 **** 726 ***/ 727 728 static void 729 tr_rwSignal( tr_rwlock_t * rw ) 730 { 731 if ( rw->wantToWrite ) 732 tr_condSignal( &rw->writeCond ); 733 else if ( rw->wantToRead ) 734 tr_condBroadcast( &rw->readCond ); 735 } 736 737 void 738 tr_rwInit ( tr_rwlock_t * rw ) 739 { 740 memset( rw, 0, sizeof(tr_rwlock_t) ); 741 tr_lockInit( &rw->lock ); 742 tr_condInit( &rw->readCond ); 743 tr_condInit( &rw->writeCond ); 744 } 745 746 void 747 tr_rwReaderLock( tr_rwlock_t * rw ) 748 { 749 tr_lockLock( &rw->lock ); 750 rw->wantToRead++; 751 while( rw->haveWriter || rw->wantToWrite ) 752 tr_condWait( &rw->readCond, &rw->lock ); 753 rw->wantToRead--; 754 rw->readCount++; 755 tr_lockUnlock( &rw->lock ); 756 } 757 758 int 759 tr_rwReaderTrylock( tr_rwlock_t * rw ) 760 { 761 int ret = FALSE; 762 tr_lockLock( &rw->lock ); 763 if ( !rw->haveWriter && !rw->wantToWrite ) { 764 rw->readCount++; 765 ret = TRUE; 766 } 767 tr_lockUnlock( &rw->lock ); 768 return ret; 769 770 } 771 772 void 773 tr_rwReaderUnlock( tr_rwlock_t * rw ) 774 { 775 tr_lockLock( &rw->lock ); 776 --rw->readCount; 777 if( !rw->readCount ) 778 tr_rwSignal( rw ); 779 tr_lockUnlock( &rw->lock ); 780 } 781 782 void 783 tr_rwWriterLock( tr_rwlock_t * rw ) 784 { 785 tr_lockLock( &rw->lock ); 786 rw->wantToWrite++; 787 while( rw->haveWriter || rw->readCount ) 788 tr_condWait( &rw->writeCond, &rw->lock ); 789 rw->wantToWrite--; 790 rw->haveWriter = TRUE; 791 tr_lockUnlock( &rw->lock ); 792 } 793 794 int 795 tr_rwWriterTrylock( tr_rwlock_t * rw ) 796 { 797 int ret = FALSE; 798 tr_lockLock( &rw->lock ); 799 if( !rw->haveWriter && !rw->readCount ) 800 ret = rw->haveWriter = TRUE; 801 tr_lockUnlock( &rw->lock ); 802 return ret; 803 } 804 void 805 tr_rwWriterUnlock( tr_rwlock_t * rw ) 806 { 807 tr_lockLock( &rw->lock ); 808 rw->haveWriter = FALSE; 809 tr_rwSignal( rw ); 810 tr_lockUnlock( &rw->lock ); 811 } 812 813 void 814 tr_rwClose( tr_rwlock_t * rw ) 815 { 816 tr_condClose( &rw->writeCond ); 817 tr_condClose( &rw->readCond ); 818 tr_lockClose( &rw->lock ); 819 } -
trunk/libtransmission/platform.h
r2184 r2197 56 56 57 57 void tr_threadCreate ( tr_thread_t *, void (*func)(void *), 58 void * arg, c har * name );58 void * arg, const char * name ); 59 59 void tr_threadJoin ( tr_thread_t * ); 60 60 void tr_lockInit ( tr_lock_t * ); 61 61 void tr_lockClose ( tr_lock_t * ); 62 int tr_lockTryLock ( tr_lock_t * ); 62 63 void tr_lockLock ( tr_lock_t * ); 63 64 void tr_lockUnlock ( tr_lock_t * ); 64 65 65 void tr_condInit ( tr_cond_t * ); 66 void tr_condWait ( tr_cond_t *, tr_lock_t * ); 67 void tr_condSignal ( tr_cond_t * ); 68 void tr_condClose ( tr_cond_t * ); 66 void tr_condInit ( tr_cond_t * ); 67 void tr_condSignal ( tr_cond_t * ); 68 void tr_condBroadcast ( tr_cond_t * ); 69 void tr_condClose ( tr_cond_t * ); 70 void tr_condWait ( tr_cond_t *, tr_lock_t * ); 71 72 /*** 73 **** RW lock: 74 **** The lock can be had by one writer or any number of readers. 75 ***/ 76 77 typedef struct tr_rwlock_s 78 { 79 tr_lock_t lock; 80 tr_cond_t readCond; 81 tr_cond_t writeCond; 82 size_t readCount; 83 size_t wantToRead; 84 size_t wantToWrite; 85 int haveWriter; 86 } 87 tr_rwlock_t; 88 89 void tr_rwInit ( tr_rwlock_t * ); 90 void tr_rwClose ( tr_rwlock_t * ); 91 void tr_rwReaderLock ( tr_rwlock_t * ); 92 int tr_rwReaderTrylock ( tr_rwlock_t * ); 93 void tr_rwReaderUnlock ( tr_rwlock_t * ); 94 void tr_rwWriterLock ( tr_rwlock_t * ); 95 int tr_rwWriterTrylock ( tr_rwlock_t * ); 96 void tr_rwWriterUnlock ( tr_rwlock_t * ); 97 69 98 70 99 struct in_addr; /* forward declaration to calm gcc down */
Note: See TracChangeset
for help on using the changeset viewer.