From 1fce8c72e79a69b0478b2f3bf84d058ebaf5211c Mon Sep 17 00:00:00 2001 From: Aris Adamantiadis Date: Mon, 16 Jun 2008 23:19:29 +0000 Subject: [PATCH] more efficient allocation algorithm for buffer.c git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@170 7dcaeef0-15fb-0310-b436-a5af3365683c --- libssh/buffer.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/libssh/buffer.c b/libssh/buffer.c index 3dea65d1..12d43c78 100644 --- a/libssh/buffer.c +++ b/libssh/buffer.c @@ -52,6 +52,18 @@ void buffer_free(BUFFER *buffer){ free(buffer); } +static void realloc_buffer(BUFFER *buffer,int needed){ + int smallest=1; + // find the smallest power of two which is greater or equal to needed + while(smallest<=needed) + smallest <<= 1; + needed=smallest; +// printf("buffer %p : realloc(%x,%d)=",buffer,buffer->data,needed); + buffer->data=realloc(buffer->data,needed); +// printf("%p\n",buffer->data); + buffer->allocated=needed; +} + /* \internal * \brief reinitialize a buffer * \param buffer buffer @@ -60,15 +72,11 @@ void buffer_reinit(BUFFER *buffer){ memset(buffer->data,0,buffer->used); buffer->used=0; buffer->pos=0; + if(buffer->allocated > 127){ + realloc_buffer(buffer,127); + } } -static void realloc_buffer(BUFFER *buffer,int needed){ - needed=(needed+0x7f) & ~0x7f; -// printf("buffer %p : realloc(%x,%d)=",buffer,buffer->data,needed); - buffer->data=realloc(buffer->data,needed); -// printf("%p\n",buffer->data); - buffer->allocated=needed; -} /** \internal * \brief add data at tail of the buffer * \param buffer buffer