Coverage Report

Created: 2026-05-06 07:53

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/tmp/bitcoin/src/ipc/libmultiprocess/include/mp/type-interface.h
Line
Count
Source
1
// Copyright (c) The Bitcoin Core developers
2
// Distributed under the MIT software license, see the accompanying
3
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5
#ifndef MP_PROXY_TYPE_INTERFACE_H
6
#define MP_PROXY_TYPE_INTERFACE_H
7
8
#include <mp/util.h>
9
10
namespace mp {
11
template <typename Interface, typename Impl>
12
kj::Own<typename Interface::Server> MakeProxyServer(InvokeContext& context, std::shared_ptr<Impl> impl)
13
10
{
14
10
    return kj::heap<ProxyServer<Interface>>(std::move(impl), context.connection);
15
10
}
kj::Own<ipc::capnp::messages::Echo::Server, std::nullptr_t> mp::MakeProxyServer<ipc::capnp::messages::Echo, interfaces::Echo>(mp::InvokeContext&, std::shared_ptr<interfaces::Echo>)
Line
Count
Source
13
6
{
14
6
    return kj::heap<ProxyServer<Interface>>(std::move(impl), context.connection);
15
6
}
Unexecuted instantiation: kj::Own<ipc::capnp::messages::Mining::Server, std::nullptr_t> mp::MakeProxyServer<ipc::capnp::messages::Mining, interfaces::Mining>(mp::InvokeContext&, std::shared_ptr<interfaces::Mining>)
kj::Own<ipc::capnp::messages::Rpc::Server, std::nullptr_t> mp::MakeProxyServer<ipc::capnp::messages::Rpc, interfaces::Rpc>(mp::InvokeContext&, std::shared_ptr<interfaces::Rpc>)
Line
Count
Source
13
4
{
14
4
    return kj::heap<ProxyServer<Interface>>(std::move(impl), context.connection);
15
4
}
Unexecuted instantiation: kj::Own<ipc::capnp::messages::BlockTemplate::Server, std::nullptr_t> mp::MakeProxyServer<ipc::capnp::messages::BlockTemplate, interfaces::BlockTemplate>(mp::InvokeContext&, std::shared_ptr<interfaces::BlockTemplate>)
16
17
template <typename Interface, typename Impl>
18
kj::Own<typename Interface::Server> CustomMakeProxyServer(InvokeContext& context, std::shared_ptr<Impl>&& impl)
19
10
{
20
10
    return MakeProxyServer<Interface, Impl>(context, std::move(impl));
21
10
}
kj::Own<ipc::capnp::messages::Echo::Server, std::nullptr_t> mp::CustomMakeProxyServer<ipc::capnp::messages::Echo, interfaces::Echo>(mp::InvokeContext&, std::shared_ptr<interfaces::Echo>&&)
Line
Count
Source
19
6
{
20
6
    return MakeProxyServer<Interface, Impl>(context, std::move(impl));
21
6
}
Unexecuted instantiation: kj::Own<ipc::capnp::messages::Mining::Server, std::nullptr_t> mp::CustomMakeProxyServer<ipc::capnp::messages::Mining, interfaces::Mining>(mp::InvokeContext&, std::shared_ptr<interfaces::Mining>&&)
kj::Own<ipc::capnp::messages::Rpc::Server, std::nullptr_t> mp::CustomMakeProxyServer<ipc::capnp::messages::Rpc, interfaces::Rpc>(mp::InvokeContext&, std::shared_ptr<interfaces::Rpc>&&)
Line
Count
Source
19
4
{
20
4
    return MakeProxyServer<Interface, Impl>(context, std::move(impl));
21
4
}
Unexecuted instantiation: kj::Own<ipc::capnp::messages::BlockTemplate::Server, std::nullptr_t> mp::CustomMakeProxyServer<ipc::capnp::messages::BlockTemplate, interfaces::BlockTemplate>(mp::InvokeContext&, std::shared_ptr<interfaces::BlockTemplate>&&)
22
23
template <typename Impl, typename Value, typename Output>
24
void CustomBuildField(TypeList<std::unique_ptr<Impl>>,
25
    Priority<1>,
26
    InvokeContext& invoke_context,
27
    Value&& value,
28
    Output&& output,
29
    typename Decay<decltype(output.get())>::Calls* enable = nullptr)
30
10
{
31
10
    if (value) {
32
10
        using Interface = typename decltype(output.get())::Calls;
33
10
        output.set(CustomMakeProxyServer<Interface, Impl>(invoke_context, std::shared_ptr<Impl>(value.release())));
34
10
    }
35
10
}
void mp::CustomBuildField<interfaces::Echo, std::unique_ptr<interfaces::Echo, std::default_delete<interfaces::Echo>>, mp::StructField<mp::Accessor<mp::init_fields::Result, 18>, ipc::capnp::messages::Init::MakeEchoResults::Builder>&>(mp::TypeList<std::unique_ptr<interfaces::Echo, std::default_delete<interfaces::Echo>>>, mp::Priority<1>, mp::InvokeContext&, std::unique_ptr<interfaces::Echo, std::default_delete<interfaces::Echo>>&&, mp::StructField<mp::Accessor<mp::init_fields::Result, 18>, ipc::capnp::messages::Init::MakeEchoResults::Builder>&, std::decay<decltype(fp3.get())>::type::Calls*)
Line
Count
Source
30
6
{
31
6
    if (value) {
32
6
        using Interface = typename decltype(output.get())::Calls;
33
6
        output.set(CustomMakeProxyServer<Interface, Impl>(invoke_context, std::shared_ptr<Impl>(value.release())));
34
6
    }
35
6
}
Unexecuted instantiation: void mp::CustomBuildField<interfaces::Mining, std::unique_ptr<interfaces::Mining, std::default_delete<interfaces::Mining>>, mp::StructField<mp::Accessor<mp::init_fields::Result, 18>, ipc::capnp::messages::Init::MakeMiningResults::Builder>&>(mp::TypeList<std::unique_ptr<interfaces::Mining, std::default_delete<interfaces::Mining>>>, mp::Priority<1>, mp::InvokeContext&, std::unique_ptr<interfaces::Mining, std::default_delete<interfaces::Mining>>&&, mp::StructField<mp::Accessor<mp::init_fields::Result, 18>, ipc::capnp::messages::Init::MakeMiningResults::Builder>&, std::decay<decltype(fp3.get())>::type::Calls*)
void mp::CustomBuildField<interfaces::Rpc, std::unique_ptr<interfaces::Rpc, std::default_delete<interfaces::Rpc>>, mp::StructField<mp::Accessor<mp::init_fields::Result, 18>, ipc::capnp::messages::Init::MakeRpcResults::Builder>&>(mp::TypeList<std::unique_ptr<interfaces::Rpc, std::default_delete<interfaces::Rpc>>>, mp::Priority<1>, mp::InvokeContext&, std::unique_ptr<interfaces::Rpc, std::default_delete<interfaces::Rpc>>&&, mp::StructField<mp::Accessor<mp::init_fields::Result, 18>, ipc::capnp::messages::Init::MakeRpcResults::Builder>&, std::decay<decltype(fp3.get())>::type::Calls*)
Line
Count
Source
30
4
{
31
4
    if (value) {
32
4
        using Interface = typename decltype(output.get())::Calls;
33
4
        output.set(CustomMakeProxyServer<Interface, Impl>(invoke_context, std::shared_ptr<Impl>(value.release())));
34
4
    }
35
4
}
Unexecuted instantiation: void mp::CustomBuildField<interfaces::BlockTemplate, std::unique_ptr<interfaces::BlockTemplate, std::default_delete<interfaces::BlockTemplate>>, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, ipc::capnp::messages::Mining::CreateNewBlockResults::Builder>&>(mp::TypeList<std::unique_ptr<interfaces::BlockTemplate, std::default_delete<interfaces::BlockTemplate>>>, mp::Priority<1>, mp::InvokeContext&, std::unique_ptr<interfaces::BlockTemplate, std::default_delete<interfaces::BlockTemplate>>&&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, ipc::capnp::messages::Mining::CreateNewBlockResults::Builder>&, std::decay<decltype(fp3.get())>::type::Calls*)
Unexecuted instantiation: void mp::CustomBuildField<interfaces::BlockTemplate, std::unique_ptr<interfaces::BlockTemplate, std::default_delete<interfaces::BlockTemplate>>, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, ipc::capnp::messages::BlockTemplate::WaitNextResults::Builder>&>(mp::TypeList<std::unique_ptr<interfaces::BlockTemplate, std::default_delete<interfaces::BlockTemplate>>>, mp::Priority<1>, mp::InvokeContext&, std::unique_ptr<interfaces::BlockTemplate, std::default_delete<interfaces::BlockTemplate>>&&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, ipc::capnp::messages::BlockTemplate::WaitNextResults::Builder>&, std::decay<decltype(fp3.get())>::type::Calls*)
36
37
template <typename Impl, typename Value, typename Output>
38
void CustomBuildField(TypeList<std::shared_ptr<Impl>>,
39
    Priority<2>,
40
    InvokeContext& invoke_context,
41
    Value&& value,
42
    Output&& output,
43
    typename Decay<decltype(output.get())>::Calls* enable = nullptr)
44
{
45
    if (value) {
46
        using Interface = typename decltype(output.get())::Calls;
47
        output.set(CustomMakeProxyServer<Interface, Impl>(invoke_context, std::forward<Value>(value)));
48
    }
49
}
50
51
template <typename Impl, typename Output>
52
void CustomBuildField(TypeList<Impl&>,
53
    Priority<1>,
54
    InvokeContext& invoke_context,
55
    Impl& value,
56
    Output&& output,
57
    typename decltype(output.get())::Calls* enable = nullptr)
58
{
59
    // Disable deleter so proxy server object doesn't attempt to delete the
60
    // wrapped implementation when the proxy client is destroyed or
61
    // disconnected.
62
    using Interface = typename decltype(output.get())::Calls;
63
    output.set(CustomMakeProxyServer<Interface, Impl>(invoke_context, std::shared_ptr<Impl>(&value, [](Impl*){})));
64
}
65
66
template <typename Interface, typename Impl>
67
std::unique_ptr<Impl> MakeProxyClient(InvokeContext& context, typename Interface::Client&& client)
68
10
{
69
10
    return std::make_unique<ProxyClient<Interface>>(
70
10
        std::move(client), &context.connection, /* destroy_connection= */ false);
71
10
}
std::unique_ptr<interfaces::Echo, std::default_delete<interfaces::Echo>> mp::MakeProxyClient<ipc::capnp::messages::Echo, interfaces::Echo>(mp::InvokeContext&, ipc::capnp::messages::Echo::Client&&)
Line
Count
Source
68
6
{
69
6
    return std::make_unique<ProxyClient<Interface>>(
70
6
        std::move(client), &context.connection, /* destroy_connection= */ false);
71
6
}
Unexecuted instantiation: std::unique_ptr<interfaces::Mining, std::default_delete<interfaces::Mining>> mp::MakeProxyClient<ipc::capnp::messages::Mining, interfaces::Mining>(mp::InvokeContext&, ipc::capnp::messages::Mining::Client&&)
std::unique_ptr<interfaces::Rpc, std::default_delete<interfaces::Rpc>> mp::MakeProxyClient<ipc::capnp::messages::Rpc, interfaces::Rpc>(mp::InvokeContext&, ipc::capnp::messages::Rpc::Client&&)
Line
Count
Source
68
4
{
69
4
    return std::make_unique<ProxyClient<Interface>>(
70
4
        std::move(client), &context.connection, /* destroy_connection= */ false);
71
4
}
Unexecuted instantiation: std::unique_ptr<interfaces::BlockTemplate, std::default_delete<interfaces::BlockTemplate>> mp::MakeProxyClient<ipc::capnp::messages::BlockTemplate, interfaces::BlockTemplate>(mp::InvokeContext&, ipc::capnp::messages::BlockTemplate::Client&&)
72
73
template <typename Interface, typename Impl>
74
std::unique_ptr<Impl> CustomMakeProxyClient(InvokeContext& context, typename Interface::Client&& client)
75
10
{
76
10
    return MakeProxyClient<Interface, Impl>(context, kj::mv(client));
77
10
}
std::unique_ptr<interfaces::Echo, std::default_delete<interfaces::Echo>> mp::CustomMakeProxyClient<ipc::capnp::messages::Echo, interfaces::Echo>(mp::InvokeContext&, ipc::capnp::messages::Echo::Client&&)
Line
Count
Source
75
6
{
76
6
    return MakeProxyClient<Interface, Impl>(context, kj::mv(client));
77
6
}
Unexecuted instantiation: std::unique_ptr<interfaces::Mining, std::default_delete<interfaces::Mining>> mp::CustomMakeProxyClient<ipc::capnp::messages::Mining, interfaces::Mining>(mp::InvokeContext&, ipc::capnp::messages::Mining::Client&&)
std::unique_ptr<interfaces::Rpc, std::default_delete<interfaces::Rpc>> mp::CustomMakeProxyClient<ipc::capnp::messages::Rpc, interfaces::Rpc>(mp::InvokeContext&, ipc::capnp::messages::Rpc::Client&&)
Line
Count
Source
75
4
{
76
4
    return MakeProxyClient<Interface, Impl>(context, kj::mv(client));
77
4
}
Unexecuted instantiation: std::unique_ptr<interfaces::BlockTemplate, std::default_delete<interfaces::BlockTemplate>> mp::CustomMakeProxyClient<ipc::capnp::messages::BlockTemplate, interfaces::BlockTemplate>(mp::InvokeContext&, ipc::capnp::messages::BlockTemplate::Client&&)
78
79
template <typename LocalType, typename Input, typename ReadDest>
80
decltype(auto) CustomReadField(TypeList<std::unique_ptr<LocalType>>,
81
    Priority<1>,
82
    InvokeContext& invoke_context,
83
    Input&& input,
84
    ReadDest&& read_dest,
85
    typename Decay<decltype(input.get())>::Calls* enable = nullptr)
86
10
{
87
10
    using Interface = typename Decay<decltype(input.get())>::Calls;
88
10
    if (CustomHasField(TypeList<LocalType>(), invoke_context, input)) {
89
10
        return read_dest.construct(
90
10
                                   CustomMakeProxyClient<Interface, LocalType>(invoke_context, std::move(input.get())));
91
10
    }
92
0
    return read_dest.construct();
93
10
}
decltype(auto) mp::CustomReadField<interfaces::Echo, mp::StructField<mp::Accessor<mp::init_fields::Result, 18>, capnp::Response<ipc::capnp::messages::Init::MakeEchoResults>>, mp::ReadDestUpdate<std::unique_ptr<interfaces::Echo, std::default_delete<interfaces::Echo>>>>(mp::TypeList<std::unique_ptr<interfaces::Echo, std::default_delete<interfaces::Echo>>>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::init_fields::Result, 18>, capnp::Response<ipc::capnp::messages::Init::MakeEchoResults>>&&, mp::ReadDestUpdate<std::unique_ptr<interfaces::Echo, std::default_delete<interfaces::Echo>>>&&, std::decay<decltype(fp2.get())>::type::Calls*)
Line
Count
Source
86
6
{
87
6
    using Interface = typename Decay<decltype(input.get())>::Calls;
88
6
    if (CustomHasField(TypeList<LocalType>(), invoke_context, input)) {
89
6
        return read_dest.construct(
90
6
                                   CustomMakeProxyClient<Interface, LocalType>(invoke_context, std::move(input.get())));
91
6
    }
92
0
    return read_dest.construct();
93
6
}
Unexecuted instantiation: decltype(auto) mp::CustomReadField<interfaces::Mining, mp::StructField<mp::Accessor<mp::init_fields::Result, 18>, capnp::Response<ipc::capnp::messages::Init::MakeMiningResults>>, mp::ReadDestUpdate<std::unique_ptr<interfaces::Mining, std::default_delete<interfaces::Mining>>>>(mp::TypeList<std::unique_ptr<interfaces::Mining, std::default_delete<interfaces::Mining>>>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::init_fields::Result, 18>, capnp::Response<ipc::capnp::messages::Init::MakeMiningResults>>&&, mp::ReadDestUpdate<std::unique_ptr<interfaces::Mining, std::default_delete<interfaces::Mining>>>&&, std::decay<decltype(fp2.get())>::type::Calls*)
decltype(auto) mp::CustomReadField<interfaces::Rpc, mp::StructField<mp::Accessor<mp::init_fields::Result, 18>, capnp::Response<ipc::capnp::messages::Init::MakeRpcResults>>, mp::ReadDestUpdate<std::unique_ptr<interfaces::Rpc, std::default_delete<interfaces::Rpc>>>>(mp::TypeList<std::unique_ptr<interfaces::Rpc, std::default_delete<interfaces::Rpc>>>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::init_fields::Result, 18>, capnp::Response<ipc::capnp::messages::Init::MakeRpcResults>>&&, mp::ReadDestUpdate<std::unique_ptr<interfaces::Rpc, std::default_delete<interfaces::Rpc>>>&&, std::decay<decltype(fp2.get())>::type::Calls*)
Line
Count
Source
86
4
{
87
4
    using Interface = typename Decay<decltype(input.get())>::Calls;
88
4
    if (CustomHasField(TypeList<LocalType>(), invoke_context, input)) {
89
4
        return read_dest.construct(
90
4
                                   CustomMakeProxyClient<Interface, LocalType>(invoke_context, std::move(input.get())));
91
4
    }
92
0
    return read_dest.construct();
93
4
}
Unexecuted instantiation: decltype(auto) mp::CustomReadField<interfaces::BlockTemplate, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::Mining::CreateNewBlockResults>>, mp::ReadDestUpdate<std::unique_ptr<interfaces::BlockTemplate, std::default_delete<interfaces::BlockTemplate>>>>(mp::TypeList<std::unique_ptr<interfaces::BlockTemplate, std::default_delete<interfaces::BlockTemplate>>>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::Mining::CreateNewBlockResults>>&&, mp::ReadDestUpdate<std::unique_ptr<interfaces::BlockTemplate, std::default_delete<interfaces::BlockTemplate>>>&&, std::decay<decltype(fp2.get())>::type::Calls*)
Unexecuted instantiation: decltype(auto) mp::CustomReadField<interfaces::BlockTemplate, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::BlockTemplate::WaitNextResults>>, mp::ReadDestUpdate<std::unique_ptr<interfaces::BlockTemplate, std::default_delete<interfaces::BlockTemplate>>>>(mp::TypeList<std::unique_ptr<interfaces::BlockTemplate, std::default_delete<interfaces::BlockTemplate>>>, mp::Priority<1>, mp::InvokeContext&, mp::StructField<mp::Accessor<mp::mining_fields::Result, 18>, capnp::Response<ipc::capnp::messages::BlockTemplate::WaitNextResults>>&&, mp::ReadDestUpdate<std::unique_ptr<interfaces::BlockTemplate, std::default_delete<interfaces::BlockTemplate>>>&&, std::decay<decltype(fp2.get())>::type::Calls*)
94
95
template <typename LocalType, typename Input, typename ReadDest>
96
decltype(auto) CustomReadField(TypeList<std::shared_ptr<LocalType>>,
97
    Priority<1>,
98
    InvokeContext& invoke_context,
99
    Input&& input,
100
    ReadDest&& read_dest,
101
    typename Decay<decltype(input.get())>::Calls* enable = nullptr)
102
{
103
    using Interface = typename Decay<decltype(input.get())>::Calls;
104
    if (CustomHasField(TypeList<LocalType>(), invoke_context, input)) {
105
        return read_dest.construct(
106
            CustomMakeProxyClient<Interface, LocalType>(invoke_context, std::move(input.get())));
107
    }
108
    return read_dest.construct();
109
}
110
} // namespace mp
111
112
#endif // MP_PROXY_TYPE_INTERFACE_H