SFProtoRecvBuffer enhanced (add SFProtoRBufferFixedWrapper)

storage_pool
YuQing 2021-04-07 14:57:52 +08:00
parent b49a3370f5
commit f563bb17ef
2 changed files with 45 additions and 8 deletions

View File

@ -304,18 +304,33 @@ int sf_recv_vary_response(ConnectionInfo *conn, SFResponseInfo *response,
return EINVAL;
}
if (response->header.body_len <= sizeof(buffer->fixed)) {
if (response->header.body_len <= buffer->alloc_size) {
if (response->header.body_len == 0) {
return 0;
}
} 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) {
free(buffer->buff);
}
buffer->buff = (char *)fc_malloc(response->header.body_len);
if (buffer->buff == NULL) {
return ENOMEM;
}
buffer->buff = buff;
buffer->alloc_size = alloc_size;
}
if ((result=tcprecvdata_nb_ex(conn->sock, buffer->buff, response->

View File

@ -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 struct {
char fixed[64 * 1024];
int alloc_size;
int fixed_size;
char *fixed;
char *buff;
} SFProtoRecvBuffer;
typedef struct {
char fixed[64 * 1024];
SFProtoRecvBuffer buffer;
} SFProtoRBufferFixedWrapper;
typedef struct {
sf_get_cmd_caption_func get_cmd_caption;
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,
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)
@ -353,6 +374,7 @@ static inline void sf_free_recv_buffer(SFProtoRecvBuffer *buffer)
if (buffer->buff != NULL) {
free(buffer->buff);
}
buffer->alloc_size = buffer->fixed_size;
buffer->buff = buffer->fixed;
}
}