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
Этот коммит содержится в:
родитель
77603dbc5a
Коммит
1fce8c72e7
@ -52,6 +52,18 @@ void buffer_free(BUFFER *buffer){
|
|||||||
free(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
|
/* \internal
|
||||||
* \brief reinitialize a buffer
|
* \brief reinitialize a buffer
|
||||||
* \param buffer buffer
|
* \param buffer buffer
|
||||||
@ -60,15 +72,11 @@ void buffer_reinit(BUFFER *buffer){
|
|||||||
memset(buffer->data,0,buffer->used);
|
memset(buffer->data,0,buffer->used);
|
||||||
buffer->used=0;
|
buffer->used=0;
|
||||||
buffer->pos=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
|
/** \internal
|
||||||
* \brief add data at tail of the buffer
|
* \brief add data at tail of the buffer
|
||||||
* \param buffer buffer
|
* \param buffer buffer
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user