1
0
Fork 0
mirror of https://github.com/transmission/transmission synced 2025-03-11 22:52:53 +00:00

add Win32 implementations of tr_thread_t, tr_mutex_t, and tr_cond_t

This commit is contained in:
Charles Kerr 2007-07-31 19:56:40 +00:00
parent ba3dc008fc
commit 497856e6e4

View file

@ -58,13 +58,21 @@ struct tr_thread_s
#ifdef SYS_BEOS
thread_id thread;
#elif defined(WIN32)
HANDLE thread;
#else
pthread_t thread;
#endif
};
static void
#ifdef WIN32
#define ThreadFuncReturnType unsigned WINAPI
#else
#define ThreadFuncReturnType void
#endif
static ThreadFuncReturnType
ThreadFunc( void * _t )
{
tr_thread_t * t = _t;
@ -79,7 +87,13 @@ ThreadFunc( void * _t )
tr_dbg( "Thread '%s' started", name );
t->func( t->arg );
tr_dbg( "Thread '%s' exited", name );
tr_free( name );
#ifdef WIN32
_endthreadex( 0 );
return 0;
#endif
}
tr_thread_t *
@ -95,6 +109,8 @@ tr_threadNew( void (*func)(void *),
#ifdef SYS_BEOS
t->thread = spawn_thread( (void*)ThreadFunc, name, B_NORMAL_PRIORITY, t );
resume_thread( t->thread );
#elif defined(WIN32)
t->thread = (HANDLE) _beginthreadex( NULL, 0, &ThreadFunc, NULL, 0, NULL );
#else
pthread_create( &t->thread, NULL, (void * (*) (void *)) ThreadFunc, t );
#endif
@ -110,6 +126,9 @@ tr_threadJoin( tr_thread_t * t )
#ifdef SYS_BEOS
long exit;
wait_for_thread( t->thread, &exit );
#elif defined(WIN32)
WaitForSingleObject(thread->handle, INFINITE);
CloseHandle( t->thread );
#else
pthread_join( t->thread, NULL );
#endif
@ -130,6 +149,8 @@ struct tr_lock_s
{
#ifdef SYS_BEOS
sem_id lock;
#elif defined(WIN32)
CRITICAL_SECTION lock;
#else
pthread_mutex_t lock;
#endif
@ -142,6 +163,8 @@ tr_lockNew( void )
#ifdef SYS_BEOS
l->lock = create_sem( 1, "" );
#elif defined(WIN32)
InitializeCriticalSection( &l->lock );
#else
pthread_mutex_init( &l->lock, NULL );
#endif
@ -154,6 +177,8 @@ tr_lockFree( tr_lock_t * l )
{
#ifdef SYS_BEOS
delete_sem( l->lock );
#elif defined(WIN32)
DeleteCriticalSection( &l->lock );
#else
pthread_mutex_destroy( &l->lock );
#endif
@ -161,12 +186,13 @@ tr_lockFree( tr_lock_t * l )
}
int
tr_lockTryLock( tr_lock_t * l )
tr_lockTryLock( tr_lock_t * l ) /* success on zero! */
{
#ifdef SYS_BEOS
return acquire_sem_etc( l->lock, 1, B_RELATIVE_TIMEOUT, 0 );
#elif defined(WIN32)
return !TryEnterCriticalSection( &l->lock );
#else
/* success on zero! */
return pthread_mutex_trylock( &l->lock );
#endif
}
@ -176,6 +202,8 @@ tr_lockLock( tr_lock_t * l )
{
#ifdef SYS_BEOS
acquire_sem( l->lock );
#elif defined(WIN32)
EnterCriticalSection( &l->lock );
#else
pthread_mutex_lock( &l->lock );
#endif
@ -186,6 +214,8 @@ tr_lockUnlock( tr_lock_t * l )
{
#ifdef SYS_BEOS
release_sem( l->lock );
#elif defined(WIN32)
DeleteCriticalSection( &l->lock );
#else
pthread_mutex_unlock( &l->lock );
#endif
@ -311,6 +341,8 @@ struct tr_cond_s
sem_id sem;
thread_id theads[BEOS_MAX_THREADS];
int start, end;
#elif defined(WIN32)
CONDITION_VARIABLE cond;
#else
pthread_cond_t cond;
#endif
@ -324,6 +356,8 @@ tr_condNew( void )
c->sem = create_sem( 1, "" );
c->start = 0;
c->end = 0;
#elif defined(WIN32)
InitializeConditionVariable( &c->cond );
#else
pthread_cond_init( &c->cond, NULL );
#endif
@ -343,6 +377,8 @@ void tr_condWait( tr_cond_t * c, tr_lock_t * l )
release_sem( *l );
suspend_thread( find_thread( NULL ) ); /* Wait for signal */
acquire_sem( *l );
#elif defined(WIN32)
SleepConditionVariableCS( &c->cond, &l->lock, INFINITE );
#else
pthread_cond_wait( &c->cond, &l->lock );
#endif
@ -378,6 +414,8 @@ void tr_condSignal( tr_cond_t * c )
acquire_sem( c->sem );
condTrySignal( c );
release_sem( c->sem );
#elif defined(WIN32)
WakeConditionVariable( &c->cond );
#else
pthread_cond_signal( &c->cond );
#endif
@ -388,6 +426,8 @@ void tr_condBroadcast( tr_cond_t * c )
acquire_sem( c->sem );
while( !condTrySignal( c ) );
release_sem( c->sem );
#elif defined(WIN32)
WakeAllConditionVariable( &c->cond );
#else
pthread_cond_broadcast( &c->cond );
#endif
@ -398,6 +438,8 @@ tr_condFree( tr_cond_t * c )
{
#ifdef SYS_BEOS
delete_sem( c->sem );
#elif defined(WIN32)
/* a no-op, apparently */
#else
pthread_cond_destroy( &c->cond );
#endif