GCC Code Coverage Report


Directory: ./
File: pdcom5/src/msrproto/Subscription.cpp
Date: 2024-12-15 04:08:34
Exec Total Coverage
Lines: 26 31 83.9%
Branches: 15 34 44.1%

Line Branch Exec Source
1 /*****************************************************************************
2 *
3 * Copyright (C) 2021 Richard Hacker (lerichi at gmx dot net),
4 * Florian Pose (fp at igh dot de),
5 * Bjarne von Horn (vh at igh dot de).
6 *
7 * This file is part of the PdCom library.
8 *
9 * The PdCom library is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU Lesser General Public License as published by
11 * the Free Software Foundation, either version 3 of the License, or (at your
12 * option) any later version.
13 *
14 * The PdCom library is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
17 * License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public License
20 * along with the PdCom library. If not, see <http://www.gnu.org/licenses/>.
21 *
22 *****************************************************************************/
23
24 #include "Subscription.h"
25
26 #include "../Process.h"
27 #include "ProtocolHandler.h"
28 #include "Variable.h"
29
30 #include <cstring>
31 #include <pdcom5/Exception.h>
32 #include <pdcom5/Process.h>
33 #include <pdcom5/details.h>
34
35 using PdCom::impl::MsrProto::EventSubscription;
36 using PdCom::impl::MsrProto::InvalidSubscription;
37 using PdCom::impl::MsrProto::PendingSubscription;
38 using PdCom::impl::MsrProto::PeriodicSubscription;
39 using PdCom::impl::MsrProto::PollSubscription;
40 using PdCom::impl::MsrProto::ProtocolHandler;
41
42 template <typename T>
43 79 void InvalidSubscription::unsubscribe(T &This)
44 {
45
2/4
✓ Branch 3 taken 46 times.
✗ Branch 4 not taken.
✓ Branch 10 taken 33 times.
✗ Branch 11 not taken.
158 if (const auto p = This.process_.lock()) {
46 79 const auto ph = p->template castProtocolHandler<ProtocolHandler>();
47
2/4
✓ Branch 0 taken 46 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 33 times.
✗ Branch 3 not taken.
79 if (ph)
48 79 ph->unsubscribe(This);
49 }
50 79 }
51
52 void InvalidSubscription::poll()
53 {
54 throw PdCom::InvalidSubscription();
55 }
56
57 const void *InvalidSubscription::getData() const
58 {
59 throw PdCom::InvalidSubscription();
60 }
61
62 66 EventSubscription::~EventSubscription()
63 {
64 33 unsubscribe(*this);
65 33 }
66
67 92 PeriodicSubscription::~PeriodicSubscription()
68 {
69 46 unsubscribe(*this);
70 46 }
71
72 83 PollSubscription::PollSubscription(
73 std::shared_ptr<const PdCom::impl::MsrProto::Variable> variable,
74 PdCom::Subscription *This,
75 PdCom::Subscriber &subscriber,
76 std::weak_ptr<PdCom::impl::Process> process,
77 83 const PdCom::Selector &selector) :
78 InvalidSubscription(
79 This,
80 subscriber,
81 process,
82 166 std::static_pointer_cast<const PdCom::impl::Variable>(variable)),
83
1/2
✗ Branch 4 not taken.
✓ Branch 5 taken 83 times.
166 is_parameter_(variable->is_parameter_),
84 83 copy_function_(selector.impl_->getCopyFunction(*variable)),
85
3/6
✓ Branch 18 taken 83 times.
✗ Branch 19 not taken.
✓ Branch 33 taken 83 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 83 times.
✗ Branch 37 not taken.
498 data_(selector.impl_->getRequiredSize(*variable) + 2)
86 83 {}
87
88 13 void PollSubscription::poll()
89 {
90
1/2
✓ Branch 3 taken 13 times.
✗ Branch 4 not taken.
26 if (const auto p = process_.lock()) {
91
1/2
✓ Branch 5 taken 13 times.
✗ Branch 6 not taken.
13 auto &h = p->template protocolHandler<ProtocolHandler>();
92
3/4
✗ Branch 3 not taken.
✓ Branch 4 taken 13 times.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 7 times.
13 if (is_parameter_)
93
1/2
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
6 h.pollParameter(*this);
94 else
95
1/2
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
7 h.pollChannel(*this);
96 }
97 else
98 throw ProcessGoneAway();
99 13 }
100