// SPDX-License-Identifier: GPL-3.0-or-later

#ifndef DBENGINE_PDC_H
#define DBENGINE_PDC_H

#include "../engine/rrdengine.h"

struct rrdeng_cmd;

#ifdef PDC_USE_JULYL
#define PDCJudyLIns             JulyLIns
#define PDCJudyLGet             JulyLGet
#define PDCJudyLFirst           JulyLFirst
#define PDCJudyLNext            JulyLNext
#define PDCJudyLLast            JulyLLast
#define PDCJudyLPrev            JulyLPrev
#define PDCJudyLFirstThenNext   JulyLFirstThenNext
#define PDCJudyLLastThenPrev    JulyLLastThenPrev
#define PDCJudyLFreeArray       JulyLFreeArray
#else
#define PDCJudyLIns             JudyLIns
#define PDCJudyLGet             JudyLGet
#define PDCJudyLFirst           JudyLFirst
#define PDCJudyLNext            JudyLNext
#define PDCJudyLLast            JudyLLast
#define PDCJudyLPrev            JudyLPrev
#define PDCJudyLFirstThenNext   JudyLFirstThenNext
#define PDCJudyLLastThenPrev    JudyLLastThenPrev
#define PDCJudyLFreeArray       JudyLFreeArray
#endif

typedef struct extent_page_details_list EPDL;
typedef void (*execute_extent_page_details_list_t)(struct rrdengine_instance *ctx, EPDL *epdl, enum storage_priority priority);
void pdc_to_epdl_router(struct rrdengine_instance *ctx, struct page_details_control *pdc, execute_extent_page_details_list_t exec_first_extent_list, execute_extent_page_details_list_t exec_rest_extent_list);
void epdl_find_extent_and_populate_pages(struct rrdengine_instance *ctx, EPDL *epdl, bool worker);

size_t pdc_cache_size(void);
size_t pd_cache_size(void);
size_t epdl_cache_size(void);
size_t deol_cache_size(void);
size_t extent_buffer_cache_size(void);

void pdc_init(void);
void page_details_init(void);
void epdl_init(void);
void deol_init(void);
void extent_buffer_cleanup1(void);

void epdl_cmd_dequeued(void *epdl_ptr);
void epdl_cmd_queued(void *epdl_ptr, struct rrdeng_cmd *cmd);

struct extent_buffer {
    size_t bytes;

    struct {
        struct extent_buffer *prev;
        struct extent_buffer *next;
    } cache;

    uint8_t data[];
};

void extent_buffer_init(void);
struct extent_buffer *extent_buffer_get(size_t size);
void extent_buffer_release(struct extent_buffer *eb);

#endif // DBENGINE_PDC_H
