GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/ring_buffer.cc
Date: 2026-04-26 02:35:59
Exec Total Coverage
Lines: 59 59 100.0%
Branches: 12 14 85.7%

Line Branch Exec Source
1 /**
2 * This file is part of the CernVM File System.
3 */
4
5 #include "ring_buffer.h"
6
7 #include <algorithm>
8 #include <cassert>
9 #include <cstdlib>
10 #include <cstring>
11
12 #include "util/smalloc.h"
13
14 const RingBuffer::ObjectHandle_t RingBuffer::kInvalidObjectHandle = size_t(-1);
15
16
17 154 RingBuffer::RingBuffer(size_t total_size)
18 154 : total_size_(total_size)
19 154 , free_space_(total_size)
20 154 , front_(0)
21 154 , back_(0)
22 154 , buffer_(reinterpret_cast<unsigned char *>(sxmmap(total_size_))) {
23
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 154 times.
154 assert(total_size_ >= sizeof(size_t));
24 154 }
25
26
27 154 RingBuffer::~RingBuffer() { sxunmap(buffer_, total_size_); }
28
29
30 78232 void RingBuffer::Put(const void *data, size_t size) {
31 78232 const size_t size_head = std::min(size, total_size_ - front_);
32
2/2
✓ Branch 0 taken 78193 times.
✓ Branch 1 taken 39 times.
78232 if (size_head > 0)
33 78193 memcpy(buffer_ + front_, data, size_head);
34
35
2/2
✓ Branch 0 taken 13221 times.
✓ Branch 1 taken 65011 times.
78232 if (size_head < size) {
36 13221 const size_t size_tail = size - size_head;
37 13221 memcpy(buffer_, reinterpret_cast<const unsigned char *>(data) + size_head,
38 size_tail);
39 }
40
41 78232 front_ = (front_ + size) % total_size_;
42 78232 free_space_ -= size;
43 78232 }
44
45
46 4048042 void RingBuffer::Get(size_t from, size_t size, void *to) const {
47 4048042 const size_t size_head = std::min(size, total_size_ - from);
48
2/2
✓ Branch 0 taken 3858736 times.
✓ Branch 1 taken 189306 times.
4048042 if (size_head > 0)
49 3858736 memcpy(to, buffer_ + from, size_head);
50
51
2/2
✓ Branch 0 taken 340041 times.
✓ Branch 1 taken 3708001 times.
4048042 if (size_head < size) {
52 340041 const size_t size_tail = size - size_head;
53 340041 memcpy(reinterpret_cast<unsigned char *>(to) + size_head, buffer_,
54 size_tail);
55 }
56 4048042 }
57
58
59 77922 void RingBuffer::Shrink(size_t by) {
60 77922 back_ = (back_ + by) % total_size_;
61 77922 free_space_ += by;
62 77922 }
63
64
65 116882 size_t RingBuffer::GetObjectSize(ObjectHandle_t handle) const {
66 size_t size_tag;
67 116882 Get(handle, sizeof(size_tag), &size_tag);
68
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 116882 times.
116882 assert(size_tag <= total_size_);
69 116882 return size_tag;
70 }
71
72
73 39155 RingBuffer::ObjectHandle_t RingBuffer::PushFront(const void *obj, size_t size) {
74 39155 size_t size_tag = size;
75 39155 size += sizeof(size_tag);
76
2/2
✓ Branch 0 taken 39 times.
✓ Branch 1 taken 39116 times.
39155 if (size > free_space_) {
77 39 return kInvalidObjectHandle;
78 }
79
80 39116 const ObjectHandle_t result = front_;
81
82 39116 Put(&size_tag, sizeof(size_tag));
83 39116 Put(obj, size_tag);
84
85 39116 return result;
86 }
87
88
89 38961 RingBuffer::ObjectHandle_t RingBuffer::RemoveBack() {
90 38961 const ObjectHandle_t result = back_;
91
92 38961 const size_t size_tag = GetObjectSize(result);
93 38961 Shrink(sizeof(size_tag));
94 38961 Shrink(size_tag);
95
96 38961 return result;
97 }
98
99
100 38922 void RingBuffer::CopyObject(ObjectHandle_t handle, void *to) const {
101 38922 const size_t size_tag = GetObjectSize(handle);
102 38922 const ObjectHandle_t object = (handle + sizeof(size_tag)) % total_size_;
103 38922 Get(object, size_tag, to);
104 38922 }
105
106
107 3892238 void RingBuffer::CopySlice(ObjectHandle_t handle, size_t size, size_t offset,
108 void *to) const {
109 3892238 const ObjectHandle_t begin = (handle + sizeof(size_t) + offset) % total_size_;
110 3892238 Get(begin, size, to);
111 3892238 }
112