diff options
Diffstat (limited to 'ot_mutex.c')
| -rw-r--r-- | ot_mutex.c | 31 |
1 files changed, 29 insertions, 2 deletions
| @@ -1,11 +1,19 @@ | |||
| 1 | /* This software was written by Dirk Engling <erdgeist@erdgeist.org> | 1 | /* This software was written by Dirk Engling <erdgeist@erdgeist.org> |
| 2 | It is considered beerware. Prost. Skol. Cheers or whatever. */ | 2 | It is considered beerware. Prost. Skol. Cheers or whatever. */ |
| 3 | 3 | ||
| 4 | /* System */ | ||
| 4 | #include <pthread.h> | 5 | #include <pthread.h> |
| 5 | #include <stdio.h> | 6 | #include <stdio.h> |
| 6 | 7 | ||
| 8 | /* Libowfat */ | ||
| 9 | #include "byte.h" | ||
| 10 | |||
| 11 | /* Opentracker */ | ||
| 7 | #include "trackerlogic.h" | 12 | #include "trackerlogic.h" |
| 8 | #include "mutex.h" | 13 | #include "ot_mutex.h" |
| 14 | |||
| 15 | /* Our global all torrents list */ | ||
| 16 | static ot_vector all_torrents[OT_BUCKET_COUNT]; | ||
| 9 | 17 | ||
| 10 | static int bucket_locklist[ OT_MAX_THREADS ]; | 18 | static int bucket_locklist[ OT_MAX_THREADS ]; |
| 11 | static int bucket_locklist_count = 0; | 19 | static int bucket_locklist_count = 0; |
| @@ -51,12 +59,23 @@ static void bucket_remove( int bucket ) { | |||
| 51 | --bucket_locklist_count; | 59 | --bucket_locklist_count; |
| 52 | } | 60 | } |
| 53 | 61 | ||
| 54 | void mutex_bucket_lock( int bucket ) { | 62 | ot_vector *mutex_bucket_lock( int bucket ) { |
| 55 | pthread_mutex_lock( &bucket_mutex ); | 63 | pthread_mutex_lock( &bucket_mutex ); |
| 56 | while( bucket_check( bucket ) ) | 64 | while( bucket_check( bucket ) ) |
| 57 | pthread_cond_wait( &bucket_being_unlocked, &bucket_mutex ); | 65 | pthread_cond_wait( &bucket_being_unlocked, &bucket_mutex ); |
| 58 | bucket_push( bucket ); | 66 | bucket_push( bucket ); |
| 59 | pthread_mutex_unlock( &bucket_mutex ); | 67 | pthread_mutex_unlock( &bucket_mutex ); |
| 68 | return all_torrents + bucket; | ||
| 69 | } | ||
| 70 | |||
| 71 | ot_vector *mutex_bucket_lock_by_hash( ot_hash *hash ) { | ||
| 72 | unsigned char *local_hash = hash[0]; | ||
| 73 | int bucket = ( local_hash[0] << 2 ) | ( local_hash[1] >> 6 ); | ||
| 74 | |||
| 75 | /* Can block */ | ||
| 76 | mutex_bucket_lock( bucket ); | ||
| 77 | |||
| 78 | return all_torrents + bucket; | ||
| 60 | } | 79 | } |
| 61 | 80 | ||
| 62 | void mutex_bucket_unlock( int bucket ) { | 81 | void mutex_bucket_unlock( int bucket ) { |
| @@ -66,12 +85,20 @@ void mutex_bucket_unlock( int bucket ) { | |||
| 66 | pthread_mutex_unlock( &bucket_mutex ); | 85 | pthread_mutex_unlock( &bucket_mutex ); |
| 67 | } | 86 | } |
| 68 | 87 | ||
| 88 | void mutex_bucket_unlock_by_hash( ot_hash *hash ) { | ||
| 89 | unsigned char *local_hash = hash[0]; | ||
| 90 | int bucket = ( local_hash[0] << 2 ) | ( local_hash[1] >> 6 ); | ||
| 91 | mutex_bucket_unlock( bucket ); | ||
| 92 | } | ||
| 93 | |||
| 69 | void mutex_init( ) { | 94 | void mutex_init( ) { |
| 70 | pthread_mutex_init(&bucket_mutex, NULL); | 95 | pthread_mutex_init(&bucket_mutex, NULL); |
| 71 | pthread_cond_init (&bucket_being_unlocked, NULL); | 96 | pthread_cond_init (&bucket_being_unlocked, NULL); |
| 97 | byte_zero( all_torrents, sizeof( all_torrents ) ); | ||
| 72 | } | 98 | } |
| 73 | 99 | ||
| 74 | void mutex_deinit( ) { | 100 | void mutex_deinit( ) { |
| 75 | pthread_mutex_destroy(&bucket_mutex); | 101 | pthread_mutex_destroy(&bucket_mutex); |
| 76 | pthread_cond_destroy(&bucket_being_unlocked); | 102 | pthread_cond_destroy(&bucket_being_unlocked); |
| 103 | byte_zero( all_torrents, sizeof( all_torrents ) ); | ||
| 77 | } | 104 | } |
