Coverage Report

Created: 2026-08-08 06:29

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/dovecot/src/lib/memarea.c
Line
Count
Source
1
/* Copyright (c) Dovecot authors, see top-level COPYING file */
2
3
#include "lib.h"
4
#include "memarea.h"
5
6
struct memarea {
7
  const void *data;
8
  size_t size;
9
10
  memarea_free_callback_t *callback;
11
  void *context;
12
13
  int refcount;
14
};
15
16
static struct memarea memarea_empty = {
17
  .refcount = 1,
18
};
19
20
#undef memarea_init
21
struct memarea *
22
memarea_init(const void *data, size_t size,
23
       memarea_free_callback_t *callback, void *context)
24
0
{
25
0
  struct memarea *area;
26
27
0
  i_assert(callback != NULL);
28
29
0
  area = i_new(struct memarea, 1);
30
0
  area->data = data;
31
0
  area->size = size;
32
0
  area->callback = callback;
33
0
  area->context = context;
34
0
  area->refcount = 1;
35
0
  return area;
36
0
}
37
38
struct memarea *memarea_init_empty(void)
39
0
{
40
0
  i_assert(memarea_empty.refcount > 0);
41
0
  memarea_empty.refcount++;
42
0
  return &memarea_empty;
43
0
}
44
45
void memarea_ref(struct memarea *area)
46
0
{
47
0
  i_assert(area->refcount > 0);
48
0
  area->refcount++;
49
0
}
50
51
void memarea_unref(struct memarea **_area)
52
0
{
53
0
  struct memarea *area = *_area;
54
55
0
  *_area = NULL;
56
0
  i_assert(area->refcount > 0);
57
58
0
  if (--area->refcount > 0)
59
0
    return;
60
0
  i_assert(area != &memarea_empty);
61
0
  area->callback(area->context);
62
0
  i_free(area);
63
0
}
64
65
void memarea_free_without_callback(struct memarea **_area)
66
0
{
67
0
  struct memarea *area = *_area;
68
69
0
  *_area = NULL;
70
0
  i_assert(memarea_get_refcount(area) == 1);
71
0
  i_free(area);
72
0
}
73
74
unsigned int memarea_get_refcount(struct memarea *area)
75
0
{
76
0
  i_assert(area->refcount > 0);
77
0
  return area->refcount;
78
0
}
79
80
const void *memarea_get(struct memarea *area, size_t *size_r)
81
0
{
82
0
  *size_r = area->size;
83
0
  return area->data;
84
0
}
85
86
size_t memarea_get_size(struct memarea *area)
87
0
{
88
0
  return area->size;
89
0
}
90
91
void memarea_free_callback_noop(void *context ATTR_UNUSED)
92
0
{
93
0
}