/*
 * bufmgr/internal.h --
 *	Internal definitions.
 *
 * Note:
 *	If BUFFERPAGE0 is defined, then 0 will be used as a
 *	valid buffer page number.
 *
 * Identification:
 *	$Header: internal.h,v 1.2 89/02/02 13:47:27 dillon Exp $
 */

#ifndef	bufmgr_internal
#define bufmgr_internal 1

#define LATEWRITE	1

#include "bufmgr.h"
#include "rel.h"
#include "relcache.h"
#include "lmgr.h"
#include "pladt.h"

#define NDBUFS 16
#define BUFDEB -5

typedef bits16 BufFlags;

typedef struct s_buf_desc {
    int next,prev;	/* ptr to next and prev (free) */
    int             data;		/* pointer to the frame in shm */
    LRelId          reln_oid;		/* relation id */
    BlockNumber       blknum;		/* blknum relative to begin of reln */
    BlockSize         blksz;		/* for now, always BLCKSZ */
    BufFlags	      flags;		/* dirty,invalid or nil */    
    unsigned	      refcount;		/* # of pins on this */
} Sbufdesc;
    
typedef struct l_buf_desc {
    struct l_buf_desc *next,*prev;
    Sbufdesc *shared;                   /* if not shared, null */
    Block    data;                     /* if shared, null */
    Relation reln;
    BufFlags flags;
    unsigned refcount;
/*    TransactionIdData xid;              /* transaction which 'opened'
					   this frame */
} Lbufdesc;

/* functions in buf_sync.c */
extern Sbufdesc *ReadSharedBuffer();
extern void WriteSharedBuffer();
extern void ReleaseSharedBuffer();
extern void FlushSharedBuffer();

#define BM_INIT    0x00
#define BM_PINNED  BM_INIT
#define BM_SHARED  BM_INIT
#define BM_DIRTY   0x01
#define BM_PRIVATE 0x02
#define BM_INVALID 0x04

typedef struct Stack {
    int datum;
    struct Stack *next;
} Stack;

#define LRelIdGetRelation(lrel) \
RelationIdGetRelation(LRelIdGetRelationId(lrel))

#endif	/* !defined(InternalDefined) */
