#ifndef SLRU_H
#define SLRU_H
#include "access/xlogdefs.h"
#include "storage/lwlock.h"
#include "storage/sync.h"
#define SLRU_MAX_ALLOWED_BUFFERS ((1024 * 1024 * 1024) / BLCKSZ)
#define SLRU_PAGES_PER_SEGMENT 32
typedef enum
{
SLRU_PAGE_EMPTY,
SLRU_PAGE_READ_IN_PROGRESS,
SLRU_PAGE_VALID,
SLRU_PAGE_WRITE_IN_PROGRESS,
} SlruPageStatus;
typedef struct SlruSharedData
{
int num_slots;
char **page_buffer;
SlruPageStatus *page_status;
bool *page_dirty;
int64 *page_number;
int *page_lru_count;
LWLockPadded *buffer_locks;
LWLockPadded *bank_locks;
int *bank_cur_lru_count;
XLogRecPtr *group_lsn;
int lsn_groups_per_page;
pg_atomic_uint64 latest_page_number;
int slru_stats_idx;
} SlruSharedData;
typedef SlruSharedData *SlruShared;
typedef struct SlruCtlData
{
SlruShared shared;
uint16 nbanks;
bool long_segment_names;
SyncRequestHandler sync_handler;
bool (*PagePrecedes) (int64, int64);
char Dir[64];
} SlruCtlData;
typedef SlruCtlData *SlruCtl;
static inline LWLock *
SimpleLruGetBankLock(SlruCtl ctl, int64 pageno)
{
int bankno;
bankno = pageno % ctl->nbanks;
return &(ctl->shared->bank_locks[bankno].lock);
}
extern Size SimpleLruShmemSize(int nslots, int nlsns);
extern int SimpleLruAutotuneBuffers(int divisor, int max);
extern void SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns,
const char *subdir, int buffer_tranche_id,
int bank_tranche_id, SyncRequestHandler sync_handler,
bool long_segment_names);
extern int SimpleLruZeroPage(SlruCtl ctl, int64 pageno);
extern int SimpleLruReadPage(SlruCtl ctl, int64 pageno, bool write_ok,
TransactionId xid);
extern int SimpleLruReadPage_ReadOnly(SlruCtl ctl, int64 pageno,
TransactionId xid);
extern void SimpleLruWritePage(SlruCtl ctl, int slotno);
extern void SimpleLruWriteAll(SlruCtl ctl, bool allow_redirtied);
#ifdef USE_ASSERT_CHECKING
extern void SlruPagePrecedesUnitTests(SlruCtl ctl, int per_page);
#else
#define SlruPagePrecedesUnitTests(ctl, per_page) do {} while (0)
#endif
extern void SimpleLruTruncate(SlruCtl ctl, int64 cutoffPage);
extern bool SimpleLruDoesPhysicalPageExist(SlruCtl ctl, int64 pageno);
typedef bool (*SlruScanCallback) (SlruCtl ctl, char *filename, int64 segpage,
void *data);
extern bool SlruScanDirectory(SlruCtl ctl, SlruScanCallback callback, void *data);
extern void SlruDeleteSegment(SlruCtl ctl, int64 segno);
extern int SlruSyncFileTag(SlruCtl ctl, const FileTag *ftag, char *path);
extern bool SlruScanDirCbReportPresence(SlruCtl ctl, char *filename,
int64 segpage, void *data);
extern bool SlruScanDirCbDeleteAll(SlruCtl ctl, char *filename, int64 segpage,
void *data);
extern bool check_slru_buffers(const char *name, int *newval);
#endif