This repository has been archived by the owner on Mar 22, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 25
/
Copy pathvmemcache_heap.h
72 lines (54 loc) · 1.92 KB
/
vmemcache_heap.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// SPDX-License-Identifier: BSD-3-Clause
/* Copyright 2018-2019, Intel Corporation */
/*
* vmemcache_heap.h -- internal definitions for vmemcache allocator module
*/
#ifndef VMEMCACHE_HEAP_H
#define VMEMCACHE_HEAP_H 1
#include <stddef.h>
#include <sys/types.h>
/* type of the statistics */
typedef unsigned long long stat_t;
#ifdef __cplusplus
extern "C" {
#endif
#define HEAP_ENTRY_IS_NULL(he) ((he.ptr) == NULL)
/* just for type safety - see 'ptr' field in 'struct extent' below */
struct ptr_ext;
typedef struct ptr_ext ptr_ext_t;
/* extent structure ('struct heap_entry' without header and footer ) */
struct extent {
ptr_ext_t *ptr;
size_t size;
};
struct heap;
struct heap *vmcache_heap_create(void *addr, size_t size, size_t extent_size);
void vmcache_heap_destroy(struct heap *heap);
ssize_t vmcache_alloc(struct heap *heap, size_t size,
ptr_ext_t **first_extent,
ptr_ext_t **small_extent);
void vmcache_free(struct heap *heap, ptr_ext_t *first_extent);
stat_t vmcache_get_heap_used_size(struct heap *heap);
stat_t vmcache_get_heap_entries_count(struct heap *heap);
ptr_ext_t *vmcache_extent_get_next(ptr_ext_t *ptr);
size_t vmcache_extent_get_size(ptr_ext_t *ptr);
/* unsafe variant - the headers of extents cannot be modified */
#define EXTENTS_FOREACH(ext, extents) \
for ((ext).ptr = (extents), \
(ext).size = vmcache_extent_get_size((ext).ptr); \
(ext).ptr != NULL; \
(ext).ptr = vmcache_extent_get_next((ext).ptr), \
(ext).size = vmcache_extent_get_size((ext).ptr))
/* safe variant - the headers of extents can be modified (freed for example) */
#define EXTENTS_FOREACH_SAFE(ext, extents, __next) \
for ((ext).ptr = (extents), \
(ext).size = vmcache_extent_get_size((ext).ptr), \
(__next) = vmcache_extent_get_next((ext).ptr); \
(ext).ptr != NULL; \
(ext).ptr = (__next), \
(ext).size = vmcache_extent_get_size((ext).ptr), \
(__next) = vmcache_extent_get_next((__next)))
#ifdef __cplusplus
}
#endif
#endif