SFProtoRecvBuffer enhanced (add SFProtoRBufferFixedWrapper)
parent
b49a3370f5
commit
f563bb17ef
|
|
@ -304,18 +304,33 @@ int sf_recv_vary_response(ConnectionInfo *conn, SFResponseInfo *response,
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response->header.body_len <= sizeof(buffer->fixed)) {
|
if (response->header.body_len <= buffer->alloc_size) {
|
||||||
if (response->header.body_len == 0) {
|
if (response->header.body_len == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
int alloc_size;
|
||||||
|
char *buff;
|
||||||
|
|
||||||
|
if (buffer->alloc_size > 0) {
|
||||||
|
alloc_size = 2 * buffer->alloc_size;
|
||||||
|
} else {
|
||||||
|
alloc_size = 64 * 1024;
|
||||||
|
}
|
||||||
|
while (alloc_size < response->header.body_len) {
|
||||||
|
alloc_size *= 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
buff = (char *)fc_malloc(alloc_size);
|
||||||
|
if (buff == NULL) {
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
if (buffer->buff != buffer->fixed && buffer->buff != NULL) {
|
if (buffer->buff != buffer->fixed && buffer->buff != NULL) {
|
||||||
free(buffer->buff);
|
free(buffer->buff);
|
||||||
}
|
}
|
||||||
buffer->buff = (char *)fc_malloc(response->header.body_len);
|
|
||||||
if (buffer->buff == NULL) {
|
buffer->buff = buff;
|
||||||
return ENOMEM;
|
buffer->alloc_size = alloc_size;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((result=tcprecvdata_nb_ex(conn->sock, buffer->buff, response->
|
if ((result=tcprecvdata_nb_ex(conn->sock, buffer->buff, response->
|
||||||
|
|
|
||||||
|
|
@ -172,10 +172,17 @@ typedef const char *(*sf_get_cmd_caption_func)(const int cmd);
|
||||||
typedef int (*sf_get_cmd_log_level_func)(const int cmd);
|
typedef int (*sf_get_cmd_log_level_func)(const int cmd);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char fixed[64 * 1024];
|
int alloc_size;
|
||||||
|
int fixed_size;
|
||||||
|
char *fixed;
|
||||||
char *buff;
|
char *buff;
|
||||||
} SFProtoRecvBuffer;
|
} SFProtoRecvBuffer;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char fixed[64 * 1024];
|
||||||
|
SFProtoRecvBuffer buffer;
|
||||||
|
} SFProtoRBufferFixedWrapper;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
sf_get_cmd_caption_func get_cmd_caption;
|
sf_get_cmd_caption_func get_cmd_caption;
|
||||||
sf_get_cmd_log_level_func get_cmd_log_level;
|
sf_get_cmd_log_level_func get_cmd_log_level;
|
||||||
|
|
@ -342,9 +349,23 @@ int sf_recv_vary_response(ConnectionInfo *conn, SFResponseInfo *response,
|
||||||
const int network_timeout, const unsigned char expect_cmd,
|
const int network_timeout, const unsigned char expect_cmd,
|
||||||
SFProtoRecvBuffer *buffer, const int min_body_len);
|
SFProtoRecvBuffer *buffer, const int min_body_len);
|
||||||
|
|
||||||
static inline void sf_init_recv_buffer(SFProtoRecvBuffer *buffer)
|
static inline void sf_init_recv_buffer_by_wrapper(
|
||||||
|
SFProtoRBufferFixedWrapper *wrapper)
|
||||||
{
|
{
|
||||||
buffer->buff = buffer->fixed;
|
wrapper->buffer.fixed_size = sizeof(wrapper->fixed);
|
||||||
|
wrapper->buffer.alloc_size = sizeof(wrapper->fixed);
|
||||||
|
wrapper->buffer.fixed = wrapper->fixed;
|
||||||
|
wrapper->buffer.buff = wrapper->fixed;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int sf_init_recv_buffer(SFProtoRecvBuffer *buffer,
|
||||||
|
const int init_size)
|
||||||
|
{
|
||||||
|
buffer->alloc_size = init_size;
|
||||||
|
buffer->fixed_size = 0;
|
||||||
|
buffer->fixed = NULL;
|
||||||
|
buffer->buff = (char *)fc_malloc(init_size);
|
||||||
|
return buffer->buff != NULL ? 0 : ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void sf_free_recv_buffer(SFProtoRecvBuffer *buffer)
|
static inline void sf_free_recv_buffer(SFProtoRecvBuffer *buffer)
|
||||||
|
|
@ -353,6 +374,7 @@ static inline void sf_free_recv_buffer(SFProtoRecvBuffer *buffer)
|
||||||
if (buffer->buff != NULL) {
|
if (buffer->buff != NULL) {
|
||||||
free(buffer->buff);
|
free(buffer->buff);
|
||||||
}
|
}
|
||||||
|
buffer->alloc_size = buffer->fixed_size;
|
||||||
buffer->buff = buffer->fixed;
|
buffer->buff = buffer->fixed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue