make ot_iovecs fix last interface more sane, also add a convenience function that handles the task of fixing, allocating and - if necessary - freeing

dynamic-accesslists
erdgeist 17 years ago
parent b1c8723609
commit 616302c139

@ -34,23 +34,36 @@ void iovec_free( int *iovec_entries, struct iovec **iovector ) {
*iovec_entries = 0; *iovec_entries = 0;
} }
void iovec_fixlast( int *iovec_entries, struct iovec **iovector, size_t new_alloc ) { void iovec_fixlast( int *iovec_entries, struct iovec **iovector, void *last_ptr ) {
int page_size = getpagesize(); int page_size = getpagesize();
size_t old_alloc, old_pages, new_pages; size_t old_alloc, new_alloc, old_pages, new_pages;
char * base = (char*)((*iovector)[ *iovec_entries - 1 ]).iov_base;
if( !*iovec_entries ) return; if( !*iovec_entries ) return;
old_alloc = ((*iovector)[ *iovec_entries - 1 ]).iov_len; old_alloc = ((*iovector)[ *iovec_entries - 1 ]).iov_len;
new_alloc = ((char*)last_ptr) - base;
old_pages = 1 + old_alloc / page_size; old_pages = 1 + old_alloc / page_size;
new_pages = 1 + new_alloc / page_size; new_pages = 1 + new_alloc / page_size;
if( old_pages != new_pages ) { if( old_pages != new_pages ) {
munmap( ((char*)((*iovector)[ *iovec_entries - 1 ]).iov_base ) + new_pages * page_size, munmap( base + new_pages * page_size, old_alloc - new_pages * page_size );
old_alloc - new_pages * page_size );
} }
((*iovector)[*iovec_entries - 1 ]).iov_len = new_alloc; ((*iovector)[*iovec_entries - 1 ]).iov_len = new_alloc;
} }
void *iovec_fix_increase_or_free( int *iovec_entries, struct iovec **iovector, void *last_ptr, size_t new_alloc ) {
void *new_ptr;
iovec_fixlast( iovec_entries, iovector, last_ptr );
if( !( new_ptr = iovec_increase( iovec_entries, iovector, new_alloc ) ) )
iovec_free( iovec_entries, iovector );
return new_ptr;
}
size_t iovec_length( int *iovec_entries, struct iovec **iovector ) { size_t iovec_length( int *iovec_entries, struct iovec **iovector ) {
size_t length = 0; size_t length = 0;
int i; int i;

@ -7,8 +7,11 @@
#include <sys/uio.h> #include <sys/uio.h>
void *iovec_increase( int *iovec_entries, struct iovec **iovector, size_t new_alloc ); void *iovec_increase( int *iovec_entries, struct iovec **iovector, size_t new_alloc );
void iovec_fixlast( int *iovec_entries, struct iovec **iovector, size_t new_alloc ); void iovec_fixlast( int *iovec_entries, struct iovec **iovector, void *last_ptr );
void iovec_free( int *iovec_entries, struct iovec **iovector ); void iovec_free( int *iovec_entries, struct iovec **iovector );
size_t iovec_length( int *iovec_entries, struct iovec **iovector ); size_t iovec_length( int *iovec_entries, struct iovec **iovector );
void *iovec_fix_increase_or_free( int *iovec_entries, struct iovec **iovector, void *last_ptr, size_t new_alloc );
#endif #endif

Loading…
Cancel
Save