GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/clientctx.cc
Date: 2026-10-04 02:40:33
Exec Total Coverage
Lines: 65 78 83.3%
Branches: 22 40 55.0%

Line Branch Exec Source
1 /**
2 * This file is part of the CernVM File System.
3 */
4
5 #include "clientctx.h"
6
7 #include <cassert>
8
9 #include "interrupt.h"
10 #include "util/concurrency.h"
11 #include "util/smalloc.h"
12
13 using namespace std; // NOLINT
14
15 ClientCtx *ClientCtx::instance_ = NULL;
16
17
18 1506 void ClientCtx::CleanupInstance() {
19
2/2
✓ Branch 0 taken 1372 times.
✓ Branch 1 taken 134 times.
1506 delete instance_;
20 1506 instance_ = NULL;
21 1506 }
22
23
24 1397 ClientCtx::ClientCtx() {
25 1397 lock_tls_blocks_ = reinterpret_cast<pthread_mutex_t *>(
26 1397 smalloc(sizeof(pthread_mutex_t)));
27 1397 const int retval = pthread_mutex_init(lock_tls_blocks_, NULL);
28
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1397 times.
1397 assert(retval == 0);
29 1397 }
30
31
32 1372 ClientCtx::~ClientCtx() {
33 1372 pthread_mutex_destroy(lock_tls_blocks_);
34 1372 free(lock_tls_blocks_);
35
36
2/2
✓ Branch 1 taken 429 times.
✓ Branch 2 taken 1372 times.
1801 for (unsigned i = 0; i < tls_blocks_.size(); ++i) {
37
1/2
✓ Branch 1 taken 429 times.
✗ Branch 2 not taken.
429 delete tls_blocks_[i];
38 }
39
40 1372 const int retval = pthread_key_delete(thread_local_storage_);
41
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1372 times.
1372 assert(retval == 0);
42 1372 }
43
44
45 6982 ClientCtx *ClientCtx::GetInstance() {
46
2/2
✓ Branch 0 taken 1397 times.
✓ Branch 1 taken 5585 times.
6982 if (instance_ == NULL) {
47 1397 instance_ = new ClientCtx();
48 1397 const int retval = pthread_key_create(&instance_->thread_local_storage_,
49 TlsDestructor);
50
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1397 times.
1397 assert(retval == 0);
51 }
52
53 6982 return instance_;
54 }
55
56
57 606 void ClientCtx::Get(uid_t *uid, gid_t *gid, pid_t *pid, InterruptCue **ic) {
58 ThreadLocalStorage *tls = static_cast<ThreadLocalStorage *>(
59 606 pthread_getspecific(thread_local_storage_));
60
4/4
✓ Branch 0 taken 560 times.
✓ Branch 1 taken 46 times.
✓ Branch 2 taken 46 times.
✓ Branch 3 taken 514 times.
606 if ((tls == NULL) || !tls->is_set) {
61 92 *uid = -1;
62 92 *gid = -1;
63 92 *pid = -1;
64 92 *ic = NULL;
65 } else {
66 514 *uid = tls->uid;
67 514 *gid = tls->gid;
68 514 *pid = tls->pid;
69 514 *ic = tls->interrupt_cue;
70 }
71 606 }
72
73
74 3410 bool ClientCtx::IsSet() {
75 ThreadLocalStorage *tls = static_cast<ThreadLocalStorage *>(
76 3410 pthread_getspecific(thread_local_storage_));
77
2/2
✓ Branch 0 taken 1404 times.
✓ Branch 1 taken 2006 times.
3410 if (tls == NULL)
78 1404 return false;
79
80 2006 return tls->is_set;
81 }
82
83
84 2013 void ClientCtx::Set(uid_t uid, gid_t gid, pid_t pid, InterruptCue *ic) {
85 ThreadLocalStorage *tls = static_cast<ThreadLocalStorage *>(
86 2013 pthread_getspecific(thread_local_storage_));
87
88
2/2
✓ Branch 0 taken 429 times.
✓ Branch 1 taken 1584 times.
2013 if (tls == NULL) {
89
1/2
✓ Branch 1 taken 429 times.
✗ Branch 2 not taken.
429 tls = new ThreadLocalStorage(uid, gid, pid, ic);
90 429 const int retval = pthread_setspecific(thread_local_storage_, tls);
91
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 429 times.
429 assert(retval == 0);
92 429 const MutexLockGuard lock_guard(lock_tls_blocks_);
93
1/2
✓ Branch 1 taken 429 times.
✗ Branch 2 not taken.
429 tls_blocks_.push_back(tls);
94 429 } else {
95 1584 tls->uid = uid;
96 1584 tls->gid = gid;
97 1584 tls->pid = pid;
98 1584 tls->interrupt_cue = ic;
99 1584 tls->is_set = true;
100 }
101 2013 }
102
103
104 ✗ void ClientCtx::TlsDestructor(void *data) {
105 ✗ ThreadLocalStorage *tls = static_cast<ClientCtx::ThreadLocalStorage *>(data);
106 ✗ delete tls;
107
108 ✗ assert(instance_);
109 ✗ const MutexLockGuard lock_guard(instance_->lock_tls_blocks_);
110 ✗ for (vector<ThreadLocalStorage *>::iterator
111 ✗ i = instance_->tls_blocks_.begin(),
112 ✗ iEnd = instance_->tls_blocks_.end();
113 ✗ i != iEnd;
114 ✗ ++i) {
115 ✗ if ((*i) == tls) {
116 ✗ instance_->tls_blocks_.erase(i);
117 ✗ break;
118 }
119 }
120 }
121
122
123 1737 void ClientCtx::Unset() {
124 ThreadLocalStorage *tls = static_cast<ThreadLocalStorage *>(
125 1737 pthread_getspecific(thread_local_storage_));
126
1/2
✓ Branch 0 taken 1737 times.
✗ Branch 1 not taken.
1737 if (tls != NULL) {
127 1737 tls->is_set = false;
128 1737 tls->uid = -1;
129 1737 tls->gid = -1;
130 1737 tls->pid = -1;
131 1737 tls->interrupt_cue = NULL;
132 }
133 1737 }
134