@ -12,6 +12,8 @@
# define BENCODE_HASH_BUCKETS 31 /* prime numbers work best */
# define BENCODE_HASH_BUCKETS 31 /* prime numbers work best */
# define BENCODE_ALLOC_ALIGN 8
struct __bencode_buffer_piece {
struct __bencode_buffer_piece {
char * tail ;
char * tail ;
unsigned int left ;
unsigned int left ;
@ -76,7 +78,7 @@ static struct __bencode_buffer_piece *__bencode_piece_new(unsigned int size) {
if ( size < BENCODE_MIN_BUFFER_PIECE_LEN )
if ( size < BENCODE_MIN_BUFFER_PIECE_LEN )
size = BENCODE_MIN_BUFFER_PIECE_LEN ;
size = BENCODE_MIN_BUFFER_PIECE_LEN ;
ret = BENCODE_MALLOC ( sizeof ( * ret ) + size ) ;
ret = BENCODE_MALLOC ( sizeof ( * ret ) + size + BENCODE_ALLOC_ALIGN ) ;
if ( ! ret )
if ( ! ret )
return NULL ;
return NULL ;
@ -99,6 +101,7 @@ int bencode_buffer_init(bencode_buffer_t *buf) {
void * bencode_buffer_alloc ( bencode_buffer_t * buf , unsigned int size ) {
void * bencode_buffer_alloc ( bencode_buffer_t * buf , unsigned int size ) {
struct __bencode_buffer_piece * piece ;
struct __bencode_buffer_piece * piece ;
void * ret ;
void * ret ;
unsigned int align_size = ( ( size + BENCODE_ALLOC_ALIGN - 1 ) / BENCODE_ALLOC_ALIGN ) * BENCODE_ALLOC_ALIGN ;
if ( ! buf )
if ( ! buf )
return NULL ;
return NULL ;
@ -121,9 +124,12 @@ void *bencode_buffer_alloc(bencode_buffer_t *buf, unsigned int size) {
assert ( size < = piece - > left ) ;
assert ( size < = piece - > left ) ;
alloc :
alloc :
piece - > left - = size ;
if ( piece - > left > = align_size )
piece - > left - = align_size ;
else
piece - > left = 0 ;
ret = piece - > tail ;
ret = piece - > tail ;
piece - > tail + = size ;
piece - > tail + = align_ size;
return ret ;
return ret ;
}
}