#ifndef LIBPMEMOBJ_STATS_H
#define LIBPMEMOBJ_STATS_H 1
#include "ctl.h"
struct stats_transient {
int unused;
};
struct stats_persistent {
uint64_t heap_curr_allocated;
};
struct stats {
int enabled;
struct stats_transient *transient;
struct stats_persistent *persistent;
};
#define STATS_INC(stats, type, name, value) do {\
if (stats->enabled)\
util_fetch_and_add64((&stats->type->name), (value));\
} while (0)
#define STATS_SUB(stats, type, name, value) do {\
if (stats->enabled)\
util_fetch_and_sub64((&stats->type->name), (value));\
} while (0)
#define STATS_SET(stats, type, name, value) do {\
if (stats->enabled)\
util_atomic_store_explicit64((&stats->type->name), (value),\
memory_order_release);\
} while (0)
#define STATS_CTL_LEAF(type, name)\
{CTL_STR(name), CTL_NODE_LEAF,\
{CTL_READ_HANDLER(type##_##name), NULL, NULL},\
NULL, NULL}
#define STATS_CTL_HANDLER(type, name, varname)\
static int CTL_READ_HANDLER(type##_##name)(PMEMobjpool *pop,\
enum ctl_query_source source, void *arg, struct ctl_indexes *indexes)\
{\
uint64_t *argv = arg;\
util_atomic_load_explicit64(&pop->stats->type->varname,\
argv, memory_order_acquire);\
return 0;\
}
void stats_ctl_register(PMEMobjpool *pop);
struct stats *stats_new(PMEMobjpool *pop);
void stats_delete(PMEMobjpool *pop, struct stats *stats);
#endif