deltamud/deltamud/
deltamud/deltamud/bin/
deltamud/deltamud/cnf/
deltamud/deltamud/lib/
deltamud/deltamud/lib/etc/
deltamud/deltamud/lib/misc/
deltamud/deltamud/lib/plrobjs/
deltamud/deltamud/lib/text/
deltamud/deltamud/lib/text/help/
deltamud/deltamud/lib/world/
deltamud/deltamud/lib/world/trg/
#if !defined(_BUFFER_H_)
#define _BUFFER_H_

/* Do NOT define this. */
/* #define BUFFER_TEST	1 */

/*
 * #if 1 = use buffer system for memory allocations. (not done, don't use)
 * #if 0 = use standard calloc/realloc
 */
#if 0
#define BUFFER_MEMORY	1
#endif

/*
 * #if 1 = use a threaded buffer system. (You must have pthreads.)
 * #if 0 = use the standard heartbeat() method.
 */
#if 1
#define THREADED	1
#endif

/*
 * #if 1 = return a pointer to the buffer structures
 * #if 0 = return only the data buffer (define this or all hell will break)
 */
#if 0
#define BUFFER_SNPRINTF	1
typedef struct buf_data buffer;
#else
typedef char buffer;
#endif

/*
 * #if 1 = Include original CircleMUD buffers too.
 * #if 0 = Use only new buffer system.
 */
#if 1
#define USE_CIRCLE_BUFFERS 1
#endif

/*
 * #if 1 = maintain a variable of how large a buffer the function requested.
 *      This will keep better track of buffer overruns when we give them a
 *      bigger buffer than requested.  An overrun with this on does not
 *      necessarily mean anything has been corrupted, but it does mean that
 *      it will happen and you have a serious problem. (recommended)
 * #if 0 = save sizeof(int) bytes per buffer structure and only check for
 *      overruns that corrupt memory past the buffer and do bad things.
 *
 * I'm thinking of removing this in favor of always being picky.
 */
#if 1
#define PICKY_BUFFERS   1
#else
#define req_size	size
#endif

/* *** No tweakables below *** */

/*
 * Handle GCC-isms.
 */
#if !defined(__GNUC__)
#define __attribute__(x)
#define __FUNCTION__	__FILE__
#endif

/*
 * Some macros to imitate C++ class styles. release_buffer() automatically
 * NULL's a pointer to prevent further use.
 */
#define get_buffer(a)		acquire_buffer((a), BT_STACK, __FUNCTION__, __LINE__)
#define release_buffer(a)	do { detach_buffer((a), __FUNCTION__, __LINE__); (a) = NULL; } while(0)
#define release_my_buffers()	detach_my_buffers(__FUNCTION__, __LINE__)

/*
 * Types for the memory to allocate.
 */
#define BT_STACK	0	/* Stack type memory			*/
#define BT_PERSIST	1	/* A buffer that doesn't time out	*/
#define BT_MALLOC	2	/* A malloc() implementation		*/

#define PULSE_BUFFER	(5 RL_SEC)

/*
 * Assorted lock types.
 */
#define LOCK_NONE	0
#define LOCK_OPEN	0
#define LOCK_RO		1
#define LOCK_CLOSED	2
#define LOCK_ACQUIRE	9
#define LOCK_WILL_CLEAR	10
#define LOCK_WILL_FREE	11
#define LOCK_WILL_REMOVE	12

/*
 * Public functions for outside use.
 */
#if defined(BUFFER_SNPRINTF)
buffer *str_cpy(buffer *d, buffer*s);
int bprintf(buffer *buf, const char *format, ...);
#endif
#if defined(BUFFER_MEMORY)
void *debug_calloc(size_t number, size_t size, char *func, int line);
void *debug_realloc(void *ptr, size_t size, const char *func, int line);
void debug_free(void *ptr);
#endif
void init_buffers(void);
void exit_buffers(void);
void release_all_buffers(void);
int detach_buffer(buffer *data, const char *func, const int line_n);
void detach_my_buffers(const char *func, const int line_n);

/* had to change this, won't compile under linux -Mike- 6/15/00 */
/* buffer *acquire_buffer(size_t size, int type, const char *who, ulong line); */

buffer *acquire_buffer(size_t size, int type, const char *who, int line);

void show_buffers(struct char_data *ch);

extern int buffer_cache_hits;
extern int buffer_cache_misses;

#if defined(BUFFER_SNPRINTF) || defined(_BUFFER_C_)
struct buf_data {
  bool locked;		/* Don't touch this buffer.		*/
  bool used;            /* Is someone using this buffer?        */
  byte type;		/* What type of buffer are we?		*/
  size_t size;          /* How large is this buffer?            */
  ulong line;         /* What source code line is using this. */
  long life;          /* An idle counter to free unused ones. */
#if defined(PICKY_BUFFERS)
  long req_size;      /* How much did the function request?   */
#endif
  char *data;           /* The buffer passed back to functions. */
  const char *who;      /* Name of the function using this.     */
  struct buf_data *next;        /* The next structure.          */
};
#endif

#endif