diff options
-rw-r--r-- | ot_http.c | 2 | ||||
-rw-r--r-- | ot_iovec.c | 57 | ||||
-rw-r--r-- | ot_iovec.h | 2 | ||||
-rw-r--r-- | ot_mutex.c | 2 |
4 files changed, 32 insertions, 31 deletions
@@ -125,7 +125,7 @@ ssize_t http_sendiovecdata( const int64 sock, struct ot_workstruct *ws, int iove | |||
125 | struct http_data *cookie = io_getcookie( sock ); | 125 | struct http_data *cookie = io_getcookie( sock ); |
126 | char *header; | 126 | char *header; |
127 | int i; | 127 | int i; |
128 | size_t header_size, size = iovec_length( &iovec_entries, &iovector ); | 128 | size_t header_size, size = iovec_length( &iovec_entries, (const struct iovec **)&iovector ); |
129 | tai6464 t; | 129 | tai6464 t; |
130 | 130 | ||
131 | /* No cookie? Bad socket. Leave. */ | 131 | /* No cookie? Bad socket. Leave. */ |
@@ -16,56 +16,57 @@ | |||
16 | #include "ot_iovec.h" | 16 | #include "ot_iovec.h" |
17 | 17 | ||
18 | void *iovec_increase( int *iovec_entries, struct iovec **iovector, size_t new_alloc ) { | 18 | void *iovec_increase( int *iovec_entries, struct iovec **iovector, size_t new_alloc ) { |
19 | void *new_ptr = realloc( *iovector, (1 + *iovec_entries ) * sizeof( struct iovec ) ); | 19 | void *new_data; |
20 | if( !new_ptr ) | 20 | int new_entries = 1 + *iovec_entries; |
21 | struct iovec *new_vec = realloc( *iovector, new_entries * sizeof( struct iovec ) ); | ||
22 | |||
23 | if( !new_vec ) | ||
21 | return NULL; | 24 | return NULL; |
22 | *iovector = new_ptr; | 25 | |
23 | new_ptr = mmap( NULL, new_alloc, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0 ); | 26 | /* Only allocate after we have a place to store the pointer */ |
24 | if( !new_ptr ) | 27 | new_data = malloc( new_alloc ); |
28 | if( !new_data ) | ||
25 | return NULL; | 29 | return NULL; |
26 | ((*iovector)[*iovec_entries]).iov_base = new_ptr; | 30 | |
27 | ((*iovector)[*iovec_entries]).iov_len = new_alloc; | 31 | new_vec[new_entries - 1].iov_base = new_data; |
32 | new_vec[new_entries - 1].iov_len = new_alloc; | ||
33 | |||
34 | *iovector = new_vec; | ||
28 | ++*iovec_entries; | 35 | ++*iovec_entries; |
29 | return new_ptr; | 36 | return new_data; |
30 | } | 37 | } |
31 | 38 | ||
32 | void iovec_free( int *iovec_entries, struct iovec **iovector ) { | 39 | void iovec_free( int *iovec_entries, struct iovec **iovector ) { |
33 | int i; | 40 | int i; |
34 | for( i=0; i<*iovec_entries; ++i ) | 41 | for( i=0; i<*iovec_entries; ++i ) |
35 | munmap( ((*iovector)[i]).iov_base, ((*iovector)[i]).iov_len ); | 42 | free( ((*iovector)[i]).iov_base ); |
43 | *iovector = NULL; | ||
36 | *iovec_entries = 0; | 44 | *iovec_entries = 0; |
37 | } | 45 | } |
38 | 46 | ||
39 | void iovec_fixlast( int *iovec_entries, struct iovec **iovector, void *last_ptr ) { | 47 | void iovec_fixlast( int *iovec_entries, struct iovec **iovector, void *last_ptr ) { |
40 | int page_size = getpagesize(); | 48 | if( *iovec_entries ) { |
41 | size_t old_alloc, new_alloc, old_pages, new_pages; | 49 | char * base = (char*)((*iovector)[ *iovec_entries - 1 ]).iov_base; |
42 | char * base = (char*)((*iovector)[ *iovec_entries - 1 ]).iov_base; | 50 | size_t new_alloc = ((char*)last_ptr) - base; |
43 | |||
44 | if( !*iovec_entries ) return; | ||
45 | |||
46 | old_alloc = ((*iovector)[ *iovec_entries - 1 ]).iov_len; | ||
47 | new_alloc = ((char*)last_ptr) - base; | ||
48 | old_pages = 1 + old_alloc / page_size; | ||
49 | new_pages = 1 + new_alloc / page_size; | ||
50 | 51 | ||
51 | if( old_pages != new_pages ) | 52 | ((*iovector)[*iovec_entries - 1 ]).iov_base = realloc( base, new_alloc ); |
52 | munmap( base + new_pages * page_size, old_alloc - new_pages * page_size ); | 53 | ((*iovector)[*iovec_entries - 1 ]).iov_len = new_alloc; |
53 | ((*iovector)[*iovec_entries - 1 ]).iov_len = new_alloc; | 54 | } |
54 | } | 55 | } |
55 | 56 | ||
56 | void *iovec_fix_increase_or_free( int *iovec_entries, struct iovec **iovector, void *last_ptr, size_t new_alloc ) { | 57 | void *iovec_fix_increase_or_free( int *iovec_entries, struct iovec **iovector, void *last_ptr, size_t new_alloc ) { |
57 | void *new_ptr; | 58 | void *new_data; |
58 | 59 | ||
59 | iovec_fixlast( iovec_entries, iovector, last_ptr ); | 60 | iovec_fixlast( iovec_entries, iovector, last_ptr ); |
60 | 61 | ||
61 | if( !( new_ptr = iovec_increase( iovec_entries, iovector, new_alloc ) ) ) | 62 | if( !( new_data = iovec_increase( iovec_entries, iovector, new_alloc ) ) ) |
62 | iovec_free( iovec_entries, iovector ); | 63 | iovec_free( iovec_entries, iovector ); |
63 | 64 | ||
64 | return new_ptr; | 65 | return new_data; |
65 | } | 66 | } |
66 | 67 | ||
67 | 68 | ||
68 | size_t iovec_length( int *iovec_entries, struct iovec **iovector ) { | 69 | size_t iovec_length( const int *iovec_entries, const struct iovec **iovector ) { |
69 | size_t length = 0; | 70 | size_t length = 0; |
70 | int i; | 71 | int i; |
71 | for( i=0; i<*iovec_entries; ++i ) | 72 | for( i=0; i<*iovec_entries; ++i ) |
@@ -12,7 +12,7 @@ void *iovec_increase( int *iovec_entries, struct iovec **iovector, size_t new_a | |||
12 | void iovec_fixlast( int *iovec_entries, struct iovec **iovector, void *last_ptr ); | 12 | void iovec_fixlast( int *iovec_entries, struct iovec **iovector, void *last_ptr ); |
13 | void iovec_free( int *iovec_entries, struct iovec **iovector ); | 13 | void iovec_free( int *iovec_entries, struct iovec **iovector ); |
14 | 14 | ||
15 | size_t iovec_length( int *iovec_entries, struct iovec **iovector ); | 15 | size_t iovec_length( const int *iovec_entries, const struct iovec **iovector ); |
16 | 16 | ||
17 | void *iovec_fix_increase_or_free( int *iovec_entries, struct iovec **iovector, void *last_ptr, size_t new_alloc ); | 17 | void *iovec_fix_increase_or_free( int *iovec_entries, struct iovec **iovector, void *last_ptr, size_t new_alloc ); |
18 | 18 | ||
@@ -126,7 +126,7 @@ void mutex_workqueue_canceltask( int64 sock ) { | |||
126 | 126 | ||
127 | /* Free task's iovec */ | 127 | /* Free task's iovec */ |
128 | for( i=0; i<(*task)->iovec_entries; ++i ) | 128 | for( i=0; i<(*task)->iovec_entries; ++i ) |
129 | munmap( iovec[i].iov_base, iovec[i].iov_len ); | 129 | free( iovec[i].iov_base ); |
130 | 130 | ||
131 | *task = (*task)->next; | 131 | *task = (*task)->next; |
132 | free( ptask ); | 132 | free( ptask ); |