Reindent server/core/buffer.c

This commit is contained in:
Johan Wikman
2015-11-30 10:55:21 +02:00
parent 73e2d9950c
commit 17760bb3e6
2 changed files with 503 additions and 495 deletions

File diff suppressed because it is too large Load Diff

View File

@ -34,12 +34,12 @@
* @verbatim * @verbatim
* Revision History * Revision History
* *
* Date Who Description * Date Who Description
* 10/06/2013 Mark Riddoch Initial implementation * 10/06/2013 Mark Riddoch Initial implementation
* 11/07/2013 Mark Riddoch Addition of reference count in the gwbuf * 11/07/2013 Mark Riddoch Addition of reference count in the gwbuf
* 16/07/2013 Massimiliano Pinto Added command type for the queue * 16/07/2013 Massimiliano Pinto Added command type for the queue
* 10/07/2014 Mark Riddoch Addition of hints * 10/07/2014 Mark Riddoch Addition of hints
* 15/07/2014 Mark Riddoch Added buffer properties * 15/07/2014 Mark Riddoch Added buffer properties
* 03/10/2014 Martin Brampton Pointer arithmetic standard conformity * 03/10/2014 Martin Brampton Pointer arithmetic standard conformity
* Add more buffer handling macros * Add more buffer handling macros
* Add gwbuf_rtrim (handle chains) * Add gwbuf_rtrim (handle chains)
@ -60,22 +60,23 @@ EXTERN_C_BLOCK_BEGIN
* contents. This may be added at any point during the processing of the * contents. This may be added at any point during the processing of the
* data, especially in the protocol stage of the processing. * data, especially in the protocol stage of the processing.
*/ */
typedef struct buf_property { typedef struct buf_property
char *name; {
char *value; char *name;
struct buf_property *next; char *value;
struct buf_property *next;
} BUF_PROPERTY; } BUF_PROPERTY;
typedef enum typedef enum
{ {
GWBUF_TYPE_UNDEFINED = 0x00, GWBUF_TYPE_UNDEFINED = 0x00,
GWBUF_TYPE_PLAINSQL = 0x01, GWBUF_TYPE_PLAINSQL = 0x01,
GWBUF_TYPE_MYSQL = 0x02, GWBUF_TYPE_MYSQL = 0x02,
GWBUF_TYPE_SINGLE_STMT = 0x04, GWBUF_TYPE_SINGLE_STMT = 0x04,
GWBUF_TYPE_SESCMD_RESPONSE = 0x08, GWBUF_TYPE_SESCMD_RESPONSE = 0x08,
GWBUF_TYPE_RESPONSE_END = 0x10, GWBUF_TYPE_RESPONSE_END = 0x10,
GWBUF_TYPE_SESCMD = 0x20, GWBUF_TYPE_SESCMD = 0x20,
GWBUF_TYPE_HTTP = 0x40 GWBUF_TYPE_HTTP = 0x40
} gwbuf_type_t; } gwbuf_type_t;
#define GWBUF_IS_TYPE_UNDEFINED(b) (b->gwbuf_type == 0) #define GWBUF_IS_TYPE_UNDEFINED(b) (b->gwbuf_type == 0)
@ -91,37 +92,39 @@ typedef enum
* shared between multiple GWBUF's without the need to make multiple copies * shared between multiple GWBUF's without the need to make multiple copies
* but still maintain separate data pointers. * but still maintain separate data pointers.
*/ */
typedef struct { typedef struct
unsigned char *data; /*< Physical memory that was allocated */ {
int refcount; /*< Reference count on the buffer */ unsigned char *data; /*< Physical memory that was allocated */
int refcount; /*< Reference count on the buffer */
} SHARED_BUF; } SHARED_BUF;
typedef enum typedef enum
{ {
GWBUF_INFO_NONE = 0x0, GWBUF_INFO_NONE = 0x0,
GWBUF_INFO_PARSED = 0x1 GWBUF_INFO_PARSED = 0x1
} gwbuf_info_t; } gwbuf_info_t;
#define GWBUF_IS_PARSED(b) (b->gwbuf_info & GWBUF_INFO_PARSED) #define GWBUF_IS_PARSED(b) (b->gwbuf_info & GWBUF_INFO_PARSED)
/** /**
* A structure for cleaning up memory allocations of structures which are * A structure for cleaning up memory allocations of structures which are
* referred to by GWBUF and deallocated in gwbuf_free but GWBUF doesn't * referred to by GWBUF and deallocated in gwbuf_free but GWBUF doesn't
* know what they are. * know what they are.
* All functions on the list are executed before freeing memory of GWBUF struct. * All functions on the list are executed before freeing memory of GWBUF struct.
*/ */
typedef enum typedef enum
{ {
GWBUF_PARSING_INFO GWBUF_PARSING_INFO
} bufobj_id_t; } bufobj_id_t;
typedef struct buffer_object_st buffer_object_t; typedef struct buffer_object_st buffer_object_t;
struct buffer_object_st { struct buffer_object_st
bufobj_id_t bo_id; {
void* bo_data; bufobj_id_t bo_id;
void (*bo_donefun_fp)(void *); void* bo_data;
buffer_object_t* bo_next; void (*bo_donefun_fp)(void *);
buffer_object_t* bo_next;
}; };
@ -133,28 +136,29 @@ struct buffer_object_st {
* flexible data pointers is designed to minimise the need for data to * flexible data pointers is designed to minimise the need for data to
* be copied within the gateway. * be copied within the gateway.
*/ */
typedef struct gwbuf { typedef struct gwbuf
SPINLOCK gwbuf_lock; {
struct gwbuf *next; /*< Next buffer in a linked chain of buffers */ SPINLOCK gwbuf_lock;
struct gwbuf *tail; /*< Last buffer in a linked chain of buffers */ struct gwbuf *next; /*< Next buffer in a linked chain of buffers */
void *start; /*< Start of the valid data */ struct gwbuf *tail; /*< Last buffer in a linked chain of buffers */
void *end; /*< First byte after the valid data */ void *start; /*< Start of the valid data */
SHARED_BUF *sbuf; /*< The shared buffer with the real data */ void *end; /*< First byte after the valid data */
buffer_object_t *gwbuf_bufobj; /*< List of objects referred to by GWBUF */ SHARED_BUF *sbuf; /*< The shared buffer with the real data */
gwbuf_info_t gwbuf_info; /*< Info bits */ buffer_object_t *gwbuf_bufobj; /*< List of objects referred to by GWBUF */
gwbuf_type_t gwbuf_type; /*< buffer's data type information */ gwbuf_info_t gwbuf_info; /*< Info bits */
HINT *hint; /*< Hint data for this buffer */ gwbuf_type_t gwbuf_type; /*< buffer's data type information */
BUF_PROPERTY *properties; /*< Buffer properties */ HINT *hint; /*< Hint data for this buffer */
BUF_PROPERTY *properties; /*< Buffer properties */
} GWBUF; } GWBUF;
/*< /*<
* Macros to access the data in the buffers * Macros to access the data in the buffers
*/ */
/*< First valid, unconsumed byte in the buffer */ /*< First valid, unconsumed byte in the buffer */
#define GWBUF_DATA(b) ((b)->start) #define GWBUF_DATA(b) ((b)->start)
/*< Number of bytes in the individual buffer */ /*< Number of bytes in the individual buffer */
#define GWBUF_LENGTH(b) ((char *)(b)->end - (char *)(b)->start) #define GWBUF_LENGTH(b) ((char *)(b)->end - (char *)(b)->start)
/*< Return the byte at offset byte from the start of the unconsumed portion of the buffer */ /*< Return the byte at offset byte from the start of the unconsumed portion of the buffer */
#define GWBUF_DATA_CHAR(b, byte) (GWBUF_LENGTH(b) < ((byte)+1) ? -1 : *(((char *)(b)->start)+4)) #define GWBUF_DATA_CHAR(b, byte) (GWBUF_LENGTH(b) < ((byte)+1) ? -1 : *(((char *)(b)->start)+4))
@ -163,39 +167,42 @@ typedef struct gwbuf {
#define GWBUF_IS_SQL(b) (0x03 == GWBUF_DATA_CHAR(b,4)) #define GWBUF_IS_SQL(b) (0x03 == GWBUF_DATA_CHAR(b,4))
/*< True if all bytes in the buffer have been consumed */ /*< True if all bytes in the buffer have been consumed */
#define GWBUF_EMPTY(b) ((char *)(b)->start >= (char *)(b)->end) #define GWBUF_EMPTY(b) ((char *)(b)->start >= (char *)(b)->end)
/*< Consume a number of bytes in the buffer */ /*< Consume a number of bytes in the buffer */
#define GWBUF_CONSUME(b, bytes) ((b)->start = bytes > ((char *)(b)->end - (char *)(b)->start) ? (b)->end : (void *)((char *)(b)->start + (bytes))); #define GWBUF_CONSUME(b, bytes) ((b)->start = bytes > ((char *)(b)->end - (char *)(b)->start) ? (b)->end : (void *)((char *)(b)->start + (bytes)));
/*< Check if a given pointer is within the buffer */ /*< Check if a given pointer is within the buffer */
#define GWBUF_POINTER_IN_BUFFER (ptr, b) ((char *)(ptr) >= (char *)(b)->start && (char *)(ptr) < (char *)(b)->end) #define GWBUF_POINTER_IN_BUFFER (ptr, b)\
((char *)(ptr) >= (char *)(b)->start && (char *)(ptr) < (char *)(b)->end)
/*< Consume a complete buffer */ /*< Consume a complete buffer */
#define GWBUF_CONSUME_ALL(b) gwbuf_consume((b), GWBUF_LENGTH((b))) #define GWBUF_CONSUME_ALL(b) gwbuf_consume((b), GWBUF_LENGTH((b)))
#define GWBUF_RTRIM(b, bytes) ((b)->end = bytes > ((char *)(b)->end - (char *)(b)->start) ? (b)->start : (void *)((char *)(b)->end - (bytes))); #define GWBUF_RTRIM(b, bytes)\
((b)->end = bytes > ((char *)(b)->end - (char *)(b)->start) ? (b)->start : \
(void *)((char *)(b)->end - (bytes)));
#define GWBUF_TYPE(b) (b)->gwbuf_type #define GWBUF_TYPE(b) (b)->gwbuf_type
/*< /*<
* Function prototypes for the API to maniplate the buffers * Function prototypes for the API to maniplate the buffers
*/ */
extern GWBUF *gwbuf_alloc(unsigned int size); extern GWBUF *gwbuf_alloc(unsigned int size);
extern void gwbuf_free(GWBUF *buf); extern void gwbuf_free(GWBUF *buf);
extern GWBUF *gwbuf_clone(GWBUF *buf); extern GWBUF *gwbuf_clone(GWBUF *buf);
extern GWBUF *gwbuf_append(GWBUF *head, GWBUF *tail); extern GWBUF *gwbuf_append(GWBUF *head, GWBUF *tail);
extern GWBUF *gwbuf_consume(GWBUF *head, unsigned int length); extern GWBUF *gwbuf_consume(GWBUF *head, unsigned int length);
extern GWBUF *gwbuf_trim(GWBUF *head, unsigned int length); extern GWBUF *gwbuf_trim(GWBUF *head, unsigned int length);
extern GWBUF *gwbuf_rtrim(GWBUF *head, unsigned int length); extern GWBUF *gwbuf_rtrim(GWBUF *head, unsigned int length);
extern unsigned int gwbuf_length(GWBUF *head); extern unsigned int gwbuf_length(GWBUF *head);
extern GWBUF *gwbuf_clone_portion(GWBUF *head, size_t offset, size_t len); extern GWBUF *gwbuf_clone_portion(GWBUF *head, size_t offset, size_t len);
extern GWBUF *gwbuf_clone_transform(GWBUF *head, gwbuf_type_t type); extern GWBUF *gwbuf_clone_transform(GWBUF *head, gwbuf_type_t type);
extern GWBUF *gwbuf_clone_all(GWBUF* head); extern GWBUF *gwbuf_clone_all(GWBUF* head);
extern void gwbuf_set_type(GWBUF *head, gwbuf_type_t type); extern void gwbuf_set_type(GWBUF *head, gwbuf_type_t type);
extern int gwbuf_add_property(GWBUF *buf, char *name, char *value); extern int gwbuf_add_property(GWBUF *buf, char *name, char *value);
extern char *gwbuf_get_property(GWBUF *buf, char *name); extern char *gwbuf_get_property(GWBUF *buf, char *name);
extern GWBUF *gwbuf_make_contiguous(GWBUF *); extern GWBUF *gwbuf_make_contiguous(GWBUF *);
extern int gwbuf_add_hint(GWBUF *, HINT *); extern int gwbuf_add_hint(GWBUF *, HINT *);
void gwbuf_add_buffer_object(GWBUF* buf, void gwbuf_add_buffer_object(GWBUF* buf,
bufobj_id_t id, bufobj_id_t id,