
different offsets for different gwbufs Updated monitor to better handle maste/slave replication environments Split MASTER and SERVER bits in the erver bitmask so that we canhave more states, MASTER, SLAVE and NOT IN REPLICATION Updates to the read write splitter for routing commands to all nodes, diagnostic output and fixes to the algorithm to pick up a master and slave connection
97 lines
3.5 KiB
C
97 lines
3.5 KiB
C
#ifndef _BUFFER_H
|
|
#define _BUFFER_H
|
|
/*
|
|
* This file is distributed as part of the SkySQL Gateway. It is free
|
|
* software: you can redistribute it and/or modify it under the terms of the
|
|
* GNU General Public License as published by the Free Software Foundation,
|
|
* version 2.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with
|
|
* this program; if not, write to the Free Software Foundation, Inc., 51
|
|
* Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* Copyright SkySQL Ab 2013
|
|
*/
|
|
|
|
/**
|
|
* @file buffer.h Definitions relating the gateway buffer manipulation facilities.
|
|
*
|
|
* These are used to store all data coming in form or going out to the client and the
|
|
* backend structures.
|
|
*
|
|
* The buffers are designed to be used in linked lists and such that they may be passed
|
|
* from one side of the gateway to another without the need to copy data. It may be the case
|
|
* that not all of the data in the buffer is valid, to this end a start and end pointer are
|
|
* included that point to the first valid byte in the buffer and the first byte after the
|
|
* last valid byte. This allows data to be consumed from either end of the buffer whilst
|
|
* still allowing for the copy free semantics of the buffering system.
|
|
*
|
|
* @verbatim
|
|
* Revision History
|
|
*
|
|
* Date Who Description
|
|
* 10/06/13 Mark Riddoch Initial implementation
|
|
* 11/07/13 Mark Riddoch Addition of reference count in the gwbuf
|
|
*
|
|
* @endverbatim
|
|
*/
|
|
|
|
/**
|
|
* A structure to encapsualte the data in a form that the data itself can be
|
|
* shared between multiple GWBUF's without the need to make multiple copies
|
|
* but still maintain separate data pointers.
|
|
*/
|
|
typedef struct {
|
|
unsigned char *data; /**< Physical memory that was allocated */
|
|
int refcount; /**< Reference count on the buffer */
|
|
} SHARED_BUF;
|
|
|
|
/**
|
|
* The buffer structure used by the descriptor control blocks.
|
|
*
|
|
* Linked lists of buffers are created as data is read from a descriptor
|
|
* or written to a descriptor. The use of linked lists of buffers with
|
|
* flexible data pointers is designed to minimise the need for data to
|
|
* be copied within the gateway.
|
|
*/
|
|
typedef struct gwbuf {
|
|
struct gwbuf *next; /**< Next buffer in a linked chain of buffers */
|
|
void *start; /**< Start of the valid data */
|
|
void *end; /**< First byte after the valid data */
|
|
SHARED_BUF *sbuf; /**< The shared buffer with the real data */
|
|
} GWBUF;
|
|
|
|
/*
|
|
* Macros to access the data in the buffers
|
|
*/
|
|
#define GWBUF_DATA(b) ((b)->start) /**< First valid, uncomsumed
|
|
* byte in the buffer
|
|
*/
|
|
#define GWBUF_LENGTH(b) ((b)->end - (b)->start) /**< Number of bytes in the
|
|
* individual buffer
|
|
*/
|
|
#define GWBUF_EMPTY(b) ((b)->start == (b)->end) /**< True if all bytes in the
|
|
* buffer have been consumed
|
|
*/
|
|
#define GWBUF_CONSUME(b, bytes) (b)->start += bytes /**< Consume a number of bytes
|
|
* in the buffer
|
|
*/
|
|
|
|
/*
|
|
* Function prototypes for the API to maniplate the buffers
|
|
*/
|
|
extern GWBUF *gwbuf_alloc(unsigned int size);
|
|
extern void gwbuf_free(GWBUF *buf);
|
|
extern GWBUF *gwbuf_clone(GWBUF *buf);
|
|
extern GWBUF *gwbuf_append(GWBUF *head, GWBUF *tail);
|
|
extern GWBUF *gwbuf_consume(GWBUF *head, unsigned int length);
|
|
extern unsigned int gwbuf_length(GWBUF *head);
|
|
|
|
|
|
#endif
|