GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/fd_refcount_mgr.cc
Date: 2026-08-30 02:40:36
Exec Total Coverage
Lines: 80 80 100.0%
Branches: 45 76 59.2%

Line Branch Exec Source
1 /**
2 * This file is part of the CernVM File System.
3 */
4
5 #include "fd_refcount_mgr.h"
6
7 #include <fcntl.h>
8 #include <unistd.h>
9
10 #include <cassert>
11 #include <string>
12
13 #include "util/mutex.h"
14 #include "util/smalloc.h"
15
16
17 4966 int FdRefcountMgr::Open(const shash::Any id, const std::string &path) {
18 4966 int result = -1;
19 4966 const MutexLockGuard lock_guard(lock_cache_refcount_);
20
3/4
✓ Branch 1 taken 4966 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4770 times.
✓ Branch 4 taken 196 times.
4966 if (!map_fd_.Lookup(id, &result)) {
21
1/2
✓ Branch 2 taken 4770 times.
✗ Branch 3 not taken.
4770 result = open(path.c_str(), O_RDONLY);
22
2/2
✓ Branch 0 taken 1794 times.
✓ Branch 1 taken 2976 times.
4770 if (result >= 0) {
23
1/2
✓ Branch 1 taken 1794 times.
✗ Branch 2 not taken.
1794 map_fd_.Insert(id, result);
24 }
25 }
26
2/2
✓ Branch 0 taken 1990 times.
✓ Branch 1 taken 2976 times.
4966 if (result >= 0) {
27
1/2
✓ Branch 1 taken 1990 times.
✗ Branch 2 not taken.
1990 FdRefcountInfo refc_info;
28
3/4
✓ Branch 1 taken 1990 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 196 times.
✓ Branch 4 taken 1794 times.
1990 if (map_refcount_.Lookup(result, &refc_info)) {
29 196 refc_info.refcount++;
30 } else {
31 1794 refc_info.refcount = 1;
32 1794 refc_info.id = id;
33 }
34
1/2
✓ Branch 1 taken 1990 times.
✗ Branch 2 not taken.
1990 map_refcount_.Insert(result, refc_info);
35 }
36 4966 return result;
37 4966 }
38
39 1814 int FdRefcountMgr::Close(int fd) {
40 1814 int retval = -1;
41 1814 const MutexLockGuard lock_guard(lock_cache_refcount_);
42
1/2
✓ Branch 1 taken 1814 times.
✗ Branch 2 not taken.
1814 FdRefcountInfo refc_info;
43
3/4
✓ Branch 1 taken 1814 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1812 times.
✓ Branch 4 taken 2 times.
1814 if (map_refcount_.Lookup(fd, &refc_info)) {
44
2/2
✓ Branch 0 taken 138 times.
✓ Branch 1 taken 1674 times.
1812 if (refc_info.refcount > 1) {
45 138 refc_info.refcount -= 1;
46
1/2
✓ Branch 1 taken 138 times.
✗ Branch 2 not taken.
138 map_refcount_.Insert(fd, refc_info);
47 138 retval = 0;
48 } else {
49
1/2
✓ Branch 1 taken 1674 times.
✗ Branch 2 not taken.
1674 retval = close(fd);
50
1/2
✓ Branch 1 taken 1674 times.
✗ Branch 2 not taken.
1674 map_fd_.Erase(refc_info.id);
51
1/2
✓ Branch 1 taken 1674 times.
✗ Branch 2 not taken.
1674 map_refcount_.Erase(fd);
52 }
53 } else {
54 // fd not present in our table - this should only happen
55 // when reloading from the normal posix cache manager!
56
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 LogCvmfs(kLogCache, kLogDebug,
57 "WARNING: trying to close fd that "
58 " is not in refcount tables");
59
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 retval = close(fd);
60 }
61 1814 return retval;
62 1814 }
63
64 64 int FdRefcountMgr::Dup(int fd) {
65 64 int retval = -1;
66 64 const MutexLockGuard lock_guard(lock_cache_refcount_);
67
1/2
✓ Branch 1 taken 64 times.
✗ Branch 2 not taken.
64 FdRefcountInfo refc_info;
68
3/4
✓ Branch 1 taken 64 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 32 times.
✓ Branch 4 taken 32 times.
64 if (map_refcount_.Lookup(fd, &refc_info)) {
69 32 refc_info.refcount += 1;
70
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
32 map_refcount_.Insert(fd, refc_info);
71 32 retval = fd;
72 } else {
73 // fd not present in our table - this should
74 // not happen in the current usage of Dup
75
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
32 LogCvmfs(kLogCache, kLogDebug,
76 "WARNING: trying to dup fd that "
77 " is not in refcount tables");
78 32 retval = dup(fd);
79 }
80 64 return retval;
81 64 }
82
83 2 FdRefcountMgr *FdRefcountMgr::Clone() {
84
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 FdRefcountMgr *clone = new FdRefcountMgr(map_refcount_, map_fd_);
85 2 return clone;
86 }
87
88 2 SmallHashDynamic<shash::Any, int> *FdRefcountMgr::GetFdMapPtr() {
89 2 return &map_fd_;
90 }
91
92 SmallHashDynamic<int, FdRefcountMgr::FdRefcountInfo> *
93 2 FdRefcountMgr::GetRefcountMapPtr() {
94 2 return &map_refcount_;
95 }
96
97 2 void FdRefcountMgr::AssignFrom(FdRefcountMgr *other) {
98 2 map_fd_ = *other->GetFdMapPtr();
99 2 map_refcount_ = *other->GetRefcountMapPtr();
100 2 }
101
102 4867 FdRefcountMgr::~FdRefcountMgr() {
103 4867 pthread_mutex_destroy(lock_cache_refcount_);
104 4867 free(lock_cache_refcount_);
105 4867 }
106
107
1/2
✓ Branch 2 taken 4874 times.
✗ Branch 3 not taken.
4874 FdRefcountMgr::FdRefcountMgr() {
108
1/2
✓ Branch 1 taken 4874 times.
✗ Branch 2 not taken.
4874 const shash::Any hash_null;
109
1/2
✓ Branch 1 taken 4874 times.
✗ Branch 2 not taken.
4874 map_fd_.Init(16, hash_null, hasher_any);
110
1/2
✓ Branch 1 taken 4874 times.
✗ Branch 2 not taken.
4874 map_refcount_.Init(16, -1, hasher_int);
111 4874 lock_cache_refcount_ = reinterpret_cast<pthread_mutex_t *>(
112 4874 smalloc(sizeof(pthread_mutex_t)));
113 4874 const int retval = pthread_mutex_init(lock_cache_refcount_, NULL);
114
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4874 times.
4874 assert(retval == 0);
115 4874 }
116
117 2 FdRefcountMgr::FdRefcountMgr(
118 const SmallHashDynamic<int, FdRefcountMgr::FdRefcountInfo> &map_refcount,
119
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 const SmallHashDynamic<shash::Any, int> &map_fd) {
120
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 const shash::Any hash_null;
121
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 map_fd_.Init(16, hash_null, hasher_any);
122
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 map_refcount_.Init(16, -1, hasher_int);
123
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 map_refcount_ = map_refcount;
124
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 map_fd_ = map_fd;
125 2 lock_cache_refcount_ = reinterpret_cast<pthread_mutex_t *>(
126 2 smalloc(sizeof(pthread_mutex_t)));
127 2 const int retval = pthread_mutex_init(lock_cache_refcount_, NULL);
128
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 assert(retval == 0);
129 2 }
130