summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorerdgeist <>2007-10-19 05:21:01 +0000
committererdgeist <>2007-10-19 05:21:01 +0000
commitcab763d4ee209ff4cf0ee2b44ee7d1158668267c (patch)
treebb868bedbc70c3ba8cb44126baf7e43a97240355
parent714ea1b88ea4f35968e7b6c909dfa0139a20e872 (diff)
Release exactly all unused bytes in mmap allocation.
-rw-r--r--trackerlogic.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/trackerlogic.c b/trackerlogic.c
index 3f09d56..2cc1ca6 100644
--- a/trackerlogic.c
+++ b/trackerlogic.c
@@ -302,10 +302,20 @@ size_t return_peers_for_torrent( ot_torrent *torrent, size_t amount, char *reply
302 return r - reply; 302 return r - reply;
303} 303}
304 304
305/* Release memory we allocated too much */
306static void fix_mmapallocation( void *buf, size_t old_alloc, size_t new_alloc ) {
307 int res, page_size = getpagesize();
308 size_t old_pages = 1 + old_alloc / page_size;
309 size_t new_pages = 1 + new_alloc / page_size;
310
311 if( old_pages != new_pages )
312 munmap( ((char*)buf) + new_pages * page_size, old_alloc - new_pages * page_size );
313}
314
305/* Fetch full scrape info for all torrents */ 315/* Fetch full scrape info for all torrents */
306size_t return_fullscrape_for_tracker( char **reply ) { 316size_t return_fullscrape_for_tracker( char **reply ) {
307 size_t torrent_count = 0, j; 317 size_t torrent_count = 0, j;
308 size_t allocated, replysize, usedpages; 318 size_t allocated, replysize;
309 int i, k; 319 int i, k;
310 char *r; 320 char *r;
311 321
@@ -338,17 +348,14 @@ size_t return_fullscrape_for_tracker( char **reply ) {
338 *r++='e'; *r++='e'; 348 *r++='e'; *r++='e';
339 349
340 replysize = ( r - *reply ); 350 replysize = ( r - *reply );
341 if( allocated > replysize ) { 351 fix_mmapallocation( *reply, allocated, replysize );
342 usedpages = 1 + ( replysize / getpagesize() );
343 munmap( *reply + usedpages * getpagesize(), allocated - replysize );
344 }
345 352
346 return replysize; 353 return replysize;
347} 354}
348 355
349size_t return_memstat_for_tracker( char **reply ) { 356size_t return_memstat_for_tracker( char **reply ) {
350 size_t torrent_count = 0, j; 357 size_t torrent_count = 0, j;
351 size_t allocated, replysize, usedpages; 358 size_t allocated, replysize;
352 int i, k; 359 int i, k;
353 char *r; 360 char *r;
354 361
@@ -375,10 +382,7 @@ size_t return_memstat_for_tracker( char **reply ) {
375 } 382 }
376 383
377 replysize = ( r - *reply ); 384 replysize = ( r - *reply );
378 if( allocated > replysize ) { 385 fix_mmapallocation( *reply, allocated, replysize );
379 usedpages = 1 + ( replysize / getpagesize() );
380 munmap( *reply + usedpages * getpagesize(), allocated - replysize );
381 }
382 386
383 return replysize; 387 return replysize;
384} 388}