use the local stack region_buffer instead of heap allocation
This commit is contained in:
parent
7576daa6cc
commit
931fb9e67b
|
|
@ -41,7 +41,8 @@
|
||||||
#define xdb_vector_index_rows 256
|
#define xdb_vector_index_rows 256
|
||||||
#define xdb_vector_index_cols 256
|
#define xdb_vector_index_cols 256
|
||||||
#define xdb_vector_index_size 8
|
#define xdb_vector_index_size 8
|
||||||
#define xdb_segment_index_size 14
|
#define xdb_v4_index_size 14 // 4 + 4 + 2 + 4
|
||||||
|
#define xdb_v6_index_size 38 // 16 + 16 + 2 + 4
|
||||||
|
|
||||||
// --- ip version info
|
// --- ip version info
|
||||||
#define xdb_ipv4_id 4
|
#define xdb_ipv4_id 4
|
||||||
|
|
|
||||||
|
|
@ -132,7 +132,7 @@ XDB_PUBLIC(int) xdb_search(xdb_searcher_t *xdb, const bytes_ip_t *ip_bytes, int
|
||||||
register int seg_index_size, l, h, m, p;
|
register int seg_index_size, l, h, m, p;
|
||||||
unsigned int s_ptr, e_ptr, data_ptr, data_len;
|
unsigned int s_ptr, e_ptr, data_ptr, data_len;
|
||||||
char vector_buffer[xdb_vector_index_size];
|
char vector_buffer[xdb_vector_index_size];
|
||||||
char *segment_buffer = NULL;
|
char segment_buffer[xdb_v6_index_size];
|
||||||
|
|
||||||
// ip version check
|
// ip version check
|
||||||
if (ip_len != xdb->version->bytes) {
|
if (ip_len != xdb->version->bytes) {
|
||||||
|
|
@ -168,12 +168,8 @@ XDB_PUBLIC(int) xdb_search(xdb_searcher_t *xdb, const bytes_ip_t *ip_bytes, int
|
||||||
|
|
||||||
// printf("s_ptr=%u, e_ptr=%u\n", s_ptr, e_ptr);
|
// printf("s_ptr=%u, e_ptr=%u\n", s_ptr, e_ptr);
|
||||||
// binary search to get the final region info
|
// binary search to get the final region info
|
||||||
|
// segment_buffer = xdb_malloc(seg_index_size);
|
||||||
seg_index_size = xdb->version->segment_index_size;
|
seg_index_size = xdb->version->segment_index_size;
|
||||||
segment_buffer = xdb_malloc(seg_index_size);
|
|
||||||
if (segment_buffer == NULL) {
|
|
||||||
return -2;
|
|
||||||
}
|
|
||||||
|
|
||||||
data_len = 0, data_ptr = 0;
|
data_len = 0, data_ptr = 0;
|
||||||
l = 0, h = ((int) (e_ptr - s_ptr)) / seg_index_size;
|
l = 0, h = ((int) (e_ptr - s_ptr)) / seg_index_size;
|
||||||
while (l <= h) {
|
while (l <= h) {
|
||||||
|
|
@ -183,8 +179,7 @@ XDB_PUBLIC(int) xdb_search(xdb_searcher_t *xdb, const bytes_ip_t *ip_bytes, int
|
||||||
// read the segment index item
|
// read the segment index item
|
||||||
err = read(xdb, p, segment_buffer, seg_index_size);
|
err = read(xdb, p, segment_buffer, seg_index_size);
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
err += 20;
|
return 20 + err;
|
||||||
goto defer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// decode the data fields as needed
|
// decode the data fields as needed
|
||||||
|
|
@ -201,28 +196,18 @@ XDB_PUBLIC(int) xdb_search(xdb_searcher_t *xdb, const bytes_ip_t *ip_bytes, int
|
||||||
|
|
||||||
// printf("data_len=%u, data_ptr=%u\n", data_len, data_ptr);
|
// printf("data_len=%u, data_ptr=%u\n", data_len, data_ptr);
|
||||||
if (data_len == 0) {
|
if (data_len == 0) {
|
||||||
err = 100;
|
return 100;
|
||||||
goto defer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// buffer alloc checking
|
// buffer alloc checking
|
||||||
err = xdb_region_buffer_alloc(region, data_len);
|
err = xdb_region_buffer_alloc(region, data_len);
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
err += 100;
|
return 100 + err;
|
||||||
goto defer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
err = read(xdb, data_ptr, region->value, data_len);
|
err = read(xdb, data_ptr, region->value, data_len);
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
err += 30;
|
return 30 + err;
|
||||||
goto defer;
|
|
||||||
}
|
|
||||||
|
|
||||||
defer:
|
|
||||||
// checn and free the segment buffer
|
|
||||||
if (segment_buffer != NULL) {
|
|
||||||
xdb_free(segment_buffer);
|
|
||||||
segment_buffer = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
|
|
|
||||||
|
|
@ -305,10 +305,10 @@ XDB_PRIVATE(int) _ipv4_sub_compare(const bytes_ip_t *ip_bytes, int bytes, const
|
||||||
|
|
||||||
static xdb_version_t _ip_version_list[] = {
|
static xdb_version_t _ip_version_list[] = {
|
||||||
// 14 = 4 + 4 + 2 + 4
|
// 14 = 4 + 4 + 2 + 4
|
||||||
{xdb_ipv4_id, "IPv4", xdb_ipv4_bytes, 14, _ipv4_sub_compare},
|
{xdb_ipv4_id, "IPv4", xdb_ipv4_bytes, xdb_v4_index_size, _ipv4_sub_compare},
|
||||||
|
|
||||||
// 38 = 16 + 16 + 2 + 4
|
// 38 = 16 + 16 + 2 + 4
|
||||||
{xdb_ipv6_id, "IPv6", xdb_ipv6_bytes, 38, xdb_ip_sub_compare},
|
{xdb_ipv6_id, "IPv6", xdb_ipv6_bytes, xdb_v6_index_size, xdb_ip_sub_compare},
|
||||||
|
|
||||||
// END
|
// END
|
||||||
{0, NULL, 0, 0, NULL}
|
{0, NULL, 0, 0, NULL}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue