add fast_buffer

pull/5/head
Yu Qing 2015-11-13 15:13:28 +08:00
parent 160ac651a9
commit b6eb0e20da
4 changed files with 217 additions and 4 deletions

View File

@ -1,5 +1,5 @@
Version 1.23 2015-11-06
Version 1.23 2015-11-13
* sched_thread.c: task can execute in a new thread
* sched_thread.c: support delay tasks
* add function get_current_time_us and get_current_time_ms
@ -9,6 +9,7 @@ Version 1.23 2015-11-06
* delay task can execute in a new thread
* fast_mblock reclaimed object pool
* add fast_allocator
* add fast_buffer
Version 1.22 2015-10-10
* export php function: fastcommon_get_first_local_ip

View File

@ -10,21 +10,24 @@ FAST_SHARED_OBJS = hash.lo chain.lo shared_func.lo ini_file_reader.lo \
http_func.lo md5.lo pthread_func.lo local_ip_func.lo \
avl_tree.lo ioevent.lo ioevent_loop.lo fast_task_queue.lo \
fast_timer.lo process_ctrl.lo fast_mblock.lo \
connection_pool.lo fast_mpool.lo fast_allocator.lo
connection_pool.lo fast_mpool.lo fast_allocator.lo \
fast_buffer.lo
FAST_STATIC_OBJS = hash.o chain.o shared_func.o ini_file_reader.o \
logger.o sockopt.o base64.o sched_thread.o \
http_func.o md5.o pthread_func.o local_ip_func.o \
avl_tree.o ioevent.o ioevent_loop.o fast_task_queue.o \
fast_timer.o process_ctrl.o fast_mblock.o \
connection_pool.o fast_mpool.o fast_allocator.o
connection_pool.o fast_mpool.o fast_allocator.o \
fast_buffer.o
HEADER_FILES = common_define.h hash.h chain.h logger.h base64.h \
shared_func.h pthread_func.h ini_file_reader.h _os_define.h \
sockopt.h sched_thread.h http_func.h md5.h local_ip_func.h \
avl_tree.h ioevent.h ioevent_loop.h fast_task_queue.h \
fast_timer.h process_ctrl.h fast_mblock.h \
connection_pool.h fast_mpool.h fast_allocator.h
connection_pool.h fast_mpool.h fast_allocator.h \
fast_buffer.h
ALL_OBJS = $(FAST_STATIC_OBJS) $(FAST_SHARED_OBJS)

156
src/fast_buffer.c Normal file
View File

@ -0,0 +1,156 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <unistd.h>
#include <inttypes.h>
#include <errno.h>
#include "logger.h"
#include "fast_buffer.h"
int fast_buffer_init_ex(FastBuffer *buffer, const int init_capacity)
{
buffer->length = 0;
if (init_capacity > 0)
{
buffer->alloc_size = init_capacity;
}
else
{
buffer->alloc_size = 256;
}
buffer->data = (char *)malloc(buffer->alloc_size);
if (buffer->data == NULL)
{
logError("file: "__FILE__", line: %d, "
"malloc %d bytes fail", __LINE__, buffer->alloc_size);
return ENOMEM;
}
*(buffer->data) = '\0';
return 0;
}
void fast_buffer_destroy(FastBuffer *buffer)
{
if (buffer->data != NULL)
{
free(buffer->data);
buffer->data = NULL;
buffer->length = 0;
}
}
static int fast_buffer_check(FastBuffer *buffer, const int inc_len)
{
int alloc_size;
char *buff;
if (buffer->alloc_size > buffer->length + inc_len)
{
return 0;
}
alloc_size = buffer->alloc_size * 2;
while (alloc_size <= buffer->length + inc_len)
{
alloc_size *= 2;
}
buff = (char *)malloc(alloc_size);
if (buff == NULL)
{
logError("file: "__FILE__", line: %d, "
"malloc %d bytes fail", __LINE__, alloc_size);
return ENOMEM;
}
if (buffer->length > 0)
{
memcpy(buff, buffer->data, buffer->length);
}
printf("alloc size: %d\n", alloc_size);
free(buffer->data);
buffer->data = buff;
buffer->alloc_size = alloc_size;
return 0;
}
int fast_buffer_append(FastBuffer *buffer, const char *format, ...)
{
va_list ap;
int result;
int len;
if ((result=fast_buffer_check(buffer, 10)) != 0)
{
return result;
}
va_start(ap, format);
len = vsnprintf(buffer->data + buffer->length,
buffer->alloc_size - buffer->length, format, ap);
va_end(ap);
if (len < buffer->alloc_size - buffer->length)
{
buffer->length += len;
}
else //maybe full, realloc and try again
{
printf("len: %d, alloc size: %d, remain: %d\n", len, buffer->alloc_size, buffer->alloc_size - buffer->length);
if ((result=fast_buffer_check(buffer, len)) == 0)
{
va_start(ap, format);
buffer->length += vsnprintf(buffer->data + buffer->length,
buffer->alloc_size - buffer->length, format, ap);
va_end(ap);
}
}
return 0;
}
int fast_buffer_append_buff(FastBuffer *buffer, const char *data, const int len)
{
int result;
if (len <= 0)
{
return 0;
}
if ((result=fast_buffer_check(buffer, len)) != 0)
{
return result;
}
memcpy(buffer->data + buffer->length, data, len);
buffer->length += len;
*(buffer->data + buffer->length) = '\0';
return 0;
}
int fast_buffer_append_int(FastBuffer *buffer, const int n)
{
int result;
if ((result=fast_buffer_check(buffer, 16)) != 0)
{
return result;
}
buffer->length += sprintf(buffer->data + buffer->length, "%d", n);
return 0;
}
int fast_buffer_append_int64(FastBuffer *buffer, const int64_t n)
{
int result;
if ((result=fast_buffer_check(buffer, 32)) != 0)
{
return result;
}
buffer->length += sprintf(buffer->data + buffer->length, "%"PRId64, n);
return 0;
}

53
src/fast_buffer.h Normal file
View File

@ -0,0 +1,53 @@
#ifndef __FAST_BUFFER_H__
#define __FAST_BUFFER_H__
#include <stdint.h>
typedef struct fast_buffer {
char *data;
int alloc_size;
int length;
} FastBuffer;
#ifdef __cplusplus
extern "C" {
#endif
static inline int fast_buffer_length(FastBuffer *buffer)
{
return buffer->length;
}
static inline char *fast_buffer_data(FastBuffer *buffer)
{
return buffer->data;
}
int fast_buffer_init_ex(FastBuffer *buffer, const int init_capacity);
static inline int fast_buffer_init(FastBuffer *buffer)
{
return fast_buffer_init_ex(buffer, 0);
}
void fast_buffer_destroy(FastBuffer *buffer);
int fast_buffer_append(FastBuffer *buffer, const char *format, ...);
int fast_buffer_append_buff(FastBuffer *buffer, const char *data, const int len);
int fast_buffer_append_int(FastBuffer *buffer, const int n);
int fast_buffer_append_int64(FastBuffer *buffer, const int64_t n);
static inline int fast_buffer_append_string(FastBuffer *buffer, const char *str)
{
return fast_buffer_append_buff(buffer, str, strlen(str));
}
#ifdef __cplusplus
}
#endif
#endif