diff options
author | erdgeist <> | 2008-12-06 18:46:00 +0000 |
---|---|---|
committer | erdgeist <> | 2008-12-06 18:46:00 +0000 |
commit | 08c71627839a9134367db354c8255f7a720e1ff3 (patch) | |
tree | b429abf6b3c26c7f851b522f5d4fb6797ad02d29 /trackerlogic.c | |
parent | a4ed31d517f77a21afe12918a9cb256489daac74 (diff) |
Renamed OT_FLAG to OT_PEERFLAG to make code easier to read
Introduced READ16/32 and WRITE16/32 makros to abstract loading/storing from unaligned addresses away on cpu's that can actually load/store everywhere
Removed all unnecessary memmoves, especially where it only moved 6 bytes in inner loop. I replaced them with WRITE16/32(READ16/32()) makros
Diffstat (limited to 'trackerlogic.c')
-rw-r--r-- | trackerlogic.c | 52 |
1 files changed, 29 insertions, 23 deletions
diff --git a/trackerlogic.c b/trackerlogic.c index 4c6b5b0..d7fca69 100644 --- a/trackerlogic.c +++ b/trackerlogic.c | |||
@@ -62,8 +62,8 @@ ot_torrent *add_peer_to_torrent( ot_hash *hash, ot_peer *peer WANT_SYNC_PARAM( | |||
62 | 62 | ||
63 | if( !exactmatch ) { | 63 | if( !exactmatch ) { |
64 | /* Create a new torrent entry, then */ | 64 | /* Create a new torrent entry, then */ |
65 | memmove( &torrent->hash, hash, sizeof( ot_hash ) ); | 65 | int i; for(i=0;i<20;i+=4) WRITE32(&torrent->hash,i,READ32(hash,i)); |
66 | 66 | ||
67 | if( !( torrent->peer_list = malloc( sizeof (ot_peerlist) ) ) ) { | 67 | if( !( torrent->peer_list = malloc( sizeof (ot_peerlist) ) ) ) { |
68 | vector_remove_torrent( torrents_list, torrent ); | 68 | vector_remove_torrent( torrents_list, torrent ); |
69 | mutex_bucket_unlock_by_hash( hash ); | 69 | mutex_bucket_unlock_by_hash( hash ); |
@@ -86,8 +86,8 @@ ot_torrent *add_peer_to_torrent( ot_hash *hash, ot_peer *peer WANT_SYNC_PARAM( | |||
86 | OT_PEERTIME( peer ) = 0; | 86 | OT_PEERTIME( peer ) = 0; |
87 | 87 | ||
88 | /* Sanitize flags: Whoever claims to have completed download, must be a seeder */ | 88 | /* Sanitize flags: Whoever claims to have completed download, must be a seeder */ |
89 | if( ( OT_FLAG( peer ) & ( PEER_FLAG_COMPLETED | PEER_FLAG_SEEDING ) ) == PEER_FLAG_COMPLETED ) | 89 | if( ( OT_PEERFLAG( peer ) & ( PEER_FLAG_COMPLETED | PEER_FLAG_SEEDING ) ) == PEER_FLAG_COMPLETED ) |
90 | OT_FLAG( peer ) ^= PEER_FLAG_COMPLETED; | 90 | OT_PEERFLAG( peer ) ^= PEER_FLAG_COMPLETED; |
91 | 91 | ||
92 | /* If we hadn't had a match create peer there */ | 92 | /* If we hadn't had a match create peer there */ |
93 | if( !exactmatch ) { | 93 | if( !exactmatch ) { |
@@ -96,13 +96,13 @@ ot_torrent *add_peer_to_torrent( ot_hash *hash, ot_peer *peer WANT_SYNC_PARAM( | |||
96 | if( !from_sync ) | 96 | if( !from_sync ) |
97 | livesync_tell( hash, peer ); | 97 | livesync_tell( hash, peer ); |
98 | else | 98 | else |
99 | OT_FLAG( peer ) |= PEER_FLAG_FROM_SYNC; | 99 | OT_PEERFLAG( peer ) |= PEER_FLAG_FROM_SYNC; |
100 | #endif | 100 | #endif |
101 | 101 | ||
102 | torrent->peer_list->peer_count++; | 102 | torrent->peer_list->peer_count++; |
103 | if( OT_FLAG(peer) & PEER_FLAG_COMPLETED ) | 103 | if( OT_PEERFLAG(peer) & PEER_FLAG_COMPLETED ) |
104 | torrent->peer_list->down_count++; | 104 | torrent->peer_list->down_count++; |
105 | if( OT_FLAG(peer) & PEER_FLAG_SEEDING ) | 105 | if( OT_PEERFLAG(peer) & PEER_FLAG_SEEDING ) |
106 | torrent->peer_list->seed_count++; | 106 | torrent->peer_list->seed_count++; |
107 | 107 | ||
108 | } else { | 108 | } else { |
@@ -114,7 +114,7 @@ ot_torrent *add_peer_to_torrent( ot_hash *hash, ot_peer *peer WANT_SYNC_PARAM( | |||
114 | int i; | 114 | int i; |
115 | for( i=0;i<20;++i)printf("%02X",(*hash)[i]); | 115 | for( i=0;i<20;++i)printf("%02X",(*hash)[i]); |
116 | if( g_this_peerid_data ) g_this_peerid_data[g_this_peerid_len] = 0; | 116 | if( g_this_peerid_data ) g_this_peerid_data[g_this_peerid_len] = 0; |
117 | printf( " %d.%d.%d.%d:%d\t%d %02X %s\n", _ip[0], _ip[1], _ip[2], _ip[3], OT_PEERTIME( peer_dest ), *(uint16_t*)( ((char*)peer_dest)+4 ), OT_FLAG(peer_dest), g_this_peerid_data ? g_this_peerid_data : "-" ); | 117 | printf( " %d.%d.%d.%d:%d\t%d %02X %s\n", _ip[0], _ip[1], _ip[2], _ip[3], OT_PEERTIME( peer_dest ), *(uint16_t*)( ((char*)peer_dest)+4 ), OT_PEERFLAG(peer_dest), g_this_peerid_data ? g_this_peerid_data : "-" ); |
118 | } | 118 | } |
119 | #endif | 119 | #endif |
120 | 120 | ||
@@ -123,19 +123,19 @@ ot_torrent *add_peer_to_torrent( ot_hash *hash, ot_peer *peer WANT_SYNC_PARAM( | |||
123 | fresh "completed" reports */ | 123 | fresh "completed" reports */ |
124 | if( !from_sync ) { | 124 | if( !from_sync ) { |
125 | if( OT_PEERTIME( peer_dest ) > OT_CLIENT_SYNC_RENEW_BOUNDARY || | 125 | if( OT_PEERTIME( peer_dest ) > OT_CLIENT_SYNC_RENEW_BOUNDARY || |
126 | ( !(OT_FLAG(peer_dest) & PEER_FLAG_COMPLETED ) && (OT_FLAG(peer) & PEER_FLAG_COMPLETED ) ) ) | 126 | ( !(OT_PEERFLAG(peer_dest) & PEER_FLAG_COMPLETED ) && (OT_PEERFLAG(peer) & PEER_FLAG_COMPLETED ) ) ) |
127 | livesync_tell( hash, peer ); | 127 | livesync_tell( hash, peer ); |
128 | } | 128 | } |
129 | #endif | 129 | #endif |
130 | 130 | ||
131 | if( (OT_FLAG(peer_dest) & PEER_FLAG_SEEDING ) && !(OT_FLAG(peer) & PEER_FLAG_SEEDING ) ) | 131 | if( (OT_PEERFLAG(peer_dest) & PEER_FLAG_SEEDING ) && !(OT_PEERFLAG(peer) & PEER_FLAG_SEEDING ) ) |
132 | torrent->peer_list->seed_count--; | 132 | torrent->peer_list->seed_count--; |
133 | if( !(OT_FLAG(peer_dest) & PEER_FLAG_SEEDING ) && (OT_FLAG(peer) & PEER_FLAG_SEEDING ) ) | 133 | if( !(OT_PEERFLAG(peer_dest) & PEER_FLAG_SEEDING ) && (OT_PEERFLAG(peer) & PEER_FLAG_SEEDING ) ) |
134 | torrent->peer_list->seed_count++; | 134 | torrent->peer_list->seed_count++; |
135 | if( !(OT_FLAG(peer_dest) & PEER_FLAG_COMPLETED ) && (OT_FLAG(peer) & PEER_FLAG_COMPLETED ) ) | 135 | if( !(OT_PEERFLAG(peer_dest) & PEER_FLAG_COMPLETED ) && (OT_PEERFLAG(peer) & PEER_FLAG_COMPLETED ) ) |
136 | torrent->peer_list->down_count++; | 136 | torrent->peer_list->down_count++; |
137 | if( OT_FLAG(peer_dest) & PEER_FLAG_COMPLETED ) | 137 | if( OT_PEERFLAG(peer_dest) & PEER_FLAG_COMPLETED ) |
138 | OT_FLAG( peer ) |= PEER_FLAG_COMPLETED; | 138 | OT_PEERFLAG( peer ) |= PEER_FLAG_COMPLETED; |
139 | } | 139 | } |
140 | 140 | ||
141 | *(uint64_t*)(peer_dest) = *(uint64_t*)(peer); | 141 | *(uint64_t*)(peer_dest) = *(uint64_t*)(peer); |
@@ -163,8 +163,10 @@ static size_t return_peers_all( ot_peerlist *peer_list, char *reply ) { | |||
163 | for( bucket = 0; bucket<num_buckets; ++bucket ) { | 163 | for( bucket = 0; bucket<num_buckets; ++bucket ) { |
164 | ot_peer * peers = (ot_peer*)bucket_list[bucket].data; | 164 | ot_peer * peers = (ot_peer*)bucket_list[bucket].data; |
165 | size_t peer_count = bucket_list[bucket].size; | 165 | size_t peer_count = bucket_list[bucket].size; |
166 | while( peer_count-- ) | 166 | while( peer_count-- ) { |
167 | memmove( r+=6, peers++, 6 ); | 167 | WRITE32(r+=4,0,READ32(peers,0)); |
168 | WRITE16(r+=2,0,READ16(peers++,4)); | ||
169 | } | ||
168 | } | 170 | } |
169 | 171 | ||
170 | return r - reply; | 172 | return r - reply; |
@@ -194,6 +196,8 @@ static size_t return_peers_selection( ot_peerlist *peer_list, size_t amount, cha | |||
194 | bucket_offset = random() % peer_list->peer_count; | 196 | bucket_offset = random() % peer_list->peer_count; |
195 | 197 | ||
196 | while( amount-- ) { | 198 | while( amount-- ) { |
199 | ot_peer * peer; | ||
200 | |||
197 | /* This is the aliased, non shifted range, next value may fall into */ | 201 | /* This is the aliased, non shifted range, next value may fall into */ |
198 | unsigned int diff = ( ( ( amount + 1 ) * shifted_step ) >> shift ) - | 202 | unsigned int diff = ( ( ( amount + 1 ) * shifted_step ) >> shift ) - |
199 | ( ( amount * shifted_step ) >> shift ); | 203 | ( ( amount * shifted_step ) >> shift ); |
@@ -203,9 +207,9 @@ static size_t return_peers_selection( ot_peerlist *peer_list, size_t amount, cha | |||
203 | bucket_offset -= bucket_list[bucket_index].size; | 207 | bucket_offset -= bucket_list[bucket_index].size; |
204 | bucket_index = ( bucket_index + 1 ) % num_buckets; | 208 | bucket_index = ( bucket_index + 1 ) % num_buckets; |
205 | } | 209 | } |
206 | 210 | peer = ((ot_peer*)bucket_list[bucket_index].data) + bucket_offset; | |
207 | memmove( r, ((ot_peer*)bucket_list[bucket_index].data) + bucket_offset, 6 ); | 211 | WRITE32(r+=4,0,READ32(peer,0)); |
208 | r += 6; | 212 | WRITE16(r+=2,0,READ16(peer,4)); |
209 | } | 213 | } |
210 | return r - reply; | 214 | return r - reply; |
211 | } | 215 | } |
@@ -288,9 +292,11 @@ size_t return_tcp_scrape_for_torrent( ot_hash *hash_list, int amount, char *repl | |||
288 | if( clean_single_torrent( torrent ) ) { | 292 | if( clean_single_torrent( torrent ) ) { |
289 | vector_remove_torrent( torrents_list, torrent ); | 293 | vector_remove_torrent( torrents_list, torrent ); |
290 | } else { | 294 | } else { |
291 | memmove( r, "20:", 3 ); memmove( r+3, hash, 20 ); | 295 | int j; |
292 | r += sprintf( r+23, "d8:completei%zde10:downloadedi%zde10:incompletei%zdee", | 296 | *r++='2';*r++='0';*r++=':'; |
293 | torrent->peer_list->seed_count, torrent->peer_list->down_count, torrent->peer_list->peer_count-torrent->peer_list->seed_count ) + 23; | 297 | for(j=0;j<20;j+=4) WRITE32(r+=4,0,READ32(hash,i)); |
298 | r += sprintf( r, "d8:completei%zde10:downloadedi%zde10:incompletei%zdee", | ||
299 | torrent->peer_list->seed_count, torrent->peer_list->down_count, torrent->peer_list->peer_count-torrent->peer_list->seed_count ); | ||
294 | } | 300 | } |
295 | } | 301 | } |
296 | mutex_bucket_unlock_by_hash( hash ); | 302 | mutex_bucket_unlock_by_hash( hash ); |
@@ -310,7 +316,7 @@ size_t remove_peer_from_torrent( ot_hash *hash, ot_peer *peer, char *reply, PROT | |||
310 | 316 | ||
311 | #ifdef WANT_SYNC_LIVE | 317 | #ifdef WANT_SYNC_LIVE |
312 | if( proto != FLAG_MCA ) { | 318 | if( proto != FLAG_MCA ) { |
313 | OT_FLAG( peer ) |= PEER_FLAG_STOPPED; | 319 | OT_PEERFLAG( peer ) |= PEER_FLAG_STOPPED; |
314 | livesync_tell( hash, peer ); | 320 | livesync_tell( hash, peer ); |
315 | } | 321 | } |
316 | #endif | 322 | #endif |