#ifndef LIBPMEMOBJ_MEMBLOCK_H
#define LIBPMEMOBJ_MEMBLOCK_H 1
#include <stddef.h>
#include <stdint.h>
#include "os_thread.h"
#include "heap_layout.h"
#include "memops.h"
#include "palloc.h"
#define MEMORY_BLOCK_NONE \
(struct memory_block)\
{0, 0, 0, 0, 0, NULL, NULL, MAX_HEADER_TYPES, MAX_MEMORY_BLOCK}
#define MEMORY_BLOCK_IS_NONE(_m)\
((_m).heap == NULL)
#define MEMORY_BLOCK_EQUALS(lhs, rhs)\
((lhs).zone_id == (rhs).zone_id && (lhs).chunk_id == (rhs).chunk_id &&\
(lhs).block_off == (rhs).block_off && (lhs).heap == (rhs).heap)
enum memory_block_type {
MEMORY_BLOCK_HUGE,
MEMORY_BLOCK_RUN,
MAX_MEMORY_BLOCK
};
enum memblock_state {
MEMBLOCK_STATE_UNKNOWN,
MEMBLOCK_ALLOCATED,
MEMBLOCK_FREE,
MAX_MEMBLOCK_STATE,
};
enum header_type {
HEADER_LEGACY,
HEADER_COMPACT,
HEADER_NONE,
MAX_HEADER_TYPES
};
extern const size_t header_type_to_size[MAX_HEADER_TYPES];
extern const enum chunk_flags header_type_to_flag[MAX_HEADER_TYPES];
struct memory_block_ops {
size_t (*block_size)(const struct memory_block *m);
void (*prep_hdr)(const struct memory_block *m,
enum memblock_state dest_state, struct operation_context *ctx);
os_mutex_t *(*get_lock)(const struct memory_block *m);
enum memblock_state (*get_state)(const struct memory_block *m);
void *(*get_user_data)(const struct memory_block *m);
size_t (*get_user_size)(const struct memory_block *m);
void *(*get_real_data)(const struct memory_block *m);
size_t (*get_real_size)(const struct memory_block *m);
void (*write_header)(const struct memory_block *m,
uint64_t extra_field, uint16_t flags);
void (*flush_header)(const struct memory_block *m);
void (*invalidate_header)(const struct memory_block *m);
void (*ensure_header_type)(const struct memory_block *m,
enum header_type t);
void (*reinit_header)(const struct memory_block *m);
uint64_t (*get_extra)(const struct memory_block *m);
uint16_t (*get_flags)(const struct memory_block *m);
};
struct memory_block {
uint32_t chunk_id;
uint32_t zone_id;
uint32_t size_idx;
uint16_t block_off;
uint16_t padding;
const struct memory_block_ops *m_ops;
struct palloc_heap *heap;
enum header_type header_type;
enum memory_block_type type;
};
struct memory_block_reserved {
struct memory_block m;
int nresv;
};
enum memblock_state memblock_validate_offset(struct palloc_heap *heap,
uint64_t off);
struct memory_block memblock_from_offset(struct palloc_heap *heap,
uint64_t off);
struct memory_block memblock_from_offset_opt(struct palloc_heap *heap,
uint64_t off, int size);
void memblock_rebuild_state(struct palloc_heap *heap, struct memory_block *m);
#endif