diff options
author | erdgeist <> | 2007-10-19 05:21:01 +0000 |
---|---|---|
committer | erdgeist <> | 2007-10-19 05:21:01 +0000 |
commit | cab763d4ee209ff4cf0ee2b44ee7d1158668267c (patch) | |
tree | bb868bedbc70c3ba8cb44126baf7e43a97240355 | |
parent | 714ea1b88ea4f35968e7b6c909dfa0139a20e872 (diff) |
Release exactly all unused bytes in mmap allocation.
-rw-r--r-- | trackerlogic.c | 24 |
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 */ | ||
306 | static 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 */ |
306 | size_t return_fullscrape_for_tracker( char **reply ) { | 316 | size_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 | ||
349 | size_t return_memstat_for_tracker( char **reply ) { | 356 | size_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 | } |