Coverage Report

Created: 2018-09-25 14:53

/work/obj-fuzz/dist/include/mozilla/ipc/MessageLink.h
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2
 * vim: sw=4 ts=4 et :
3
 */
4
/* This Source Code Form is subject to the terms of the Mozilla Public
5
 * License, v. 2.0. If a copy of the MPL was not distributed with this
6
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7
8
#ifndef ipc_glue_MessageLink_h
9
#define ipc_glue_MessageLink_h 1
10
11
#include "base/basictypes.h"
12
#include "base/message_loop.h"
13
14
#include "mozilla/WeakPtr.h"
15
#include "mozilla/ipc/Transport.h"
16
17
namespace mozilla {
18
namespace ipc {
19
20
class MessageChannel;
21
22
struct HasResultCodes
23
{
24
    enum Result {
25
        MsgProcessed,
26
        MsgDropped,
27
        MsgNotKnown,
28
        MsgNotAllowed,
29
        MsgPayloadError,
30
        MsgProcessingError,
31
        MsgRouteError,
32
        MsgValueError
33
    };
34
};
35
36
enum Side {
37
    ParentSide,
38
    ChildSide,
39
    UnknownSide
40
};
41
42
class MessageLink
43
{
44
  public:
45
    typedef IPC::Message Message;
46
47
    explicit MessageLink(MessageChannel *aChan);
48
    virtual ~MessageLink();
49
50
    // n.b.: These methods all require that the channel monitor is
51
    // held when they are invoked.
52
    virtual void EchoMessage(Message *msg) = 0;
53
    virtual void SendMessage(Message *msg) = 0;
54
    virtual void SendClose() = 0;
55
56
    virtual bool Unsound_IsClosed() const = 0;
57
    virtual uint32_t Unsound_NumQueuedMessages() const = 0;
58
59
  protected:
60
    MessageChannel *mChan;
61
};
62
63
class ProcessLink
64
  : public MessageLink,
65
    public Transport::Listener
66
{
67
    void OnCloseChannel();
68
    void OnChannelOpened();
69
    void OnTakeConnectedChannel();
70
    void OnEchoMessage(Message* msg);
71
72
    void AssertIOThread() const
73
0
    {
74
0
        MOZ_ASSERT(mIOLoop == MessageLoop::current(),
75
0
                   "not on I/O thread!");
76
0
    }
77
78
  public:
79
    explicit ProcessLink(MessageChannel *chan);
80
    virtual ~ProcessLink();
81
82
    // The ProcessLink will register itself as the IPC::Channel::Listener on the
83
    // transport passed here. If the transport already has a listener registered
84
    // then a listener chain will be established (the ProcessLink listener
85
    // methods will be called first and may call some methods on the original
86
    // listener as well). Once the channel is closed (either via normal shutdown
87
    // or a pipe error) the chain will be destroyed and the original listener
88
    // will again be registered.
89
    void Open(Transport* aTransport, MessageLoop *aIOLoop, Side aSide);
90
91
    // Run on the I/O thread, only when using inter-process link.
92
    // These methods acquire the monitor and forward to the
93
    // similarly named methods in AsyncChannel below
94
    // (OnMessageReceivedFromLink(), etc)
95
    virtual void OnMessageReceived(Message&& msg) override;
96
    virtual void OnChannelConnected(int32_t peer_pid) override;
97
    virtual void OnChannelError() override;
98
99
    virtual void EchoMessage(Message *msg) override;
100
    virtual void SendMessage(Message *msg) override;
101
    virtual void SendClose() override;
102
103
    virtual bool Unsound_IsClosed() const override;
104
    virtual uint32_t Unsound_NumQueuedMessages() const override;
105
106
  protected:
107
    void OnChannelConnectError();
108
109
  protected:
110
    Transport* mTransport;
111
    MessageLoop* mIOLoop;       // thread where IO happens
112
    Transport::Listener* mExistingListener; // channel's previous listener
113
};
114
115
class ThreadLink : public MessageLink
116
{
117
  public:
118
    ThreadLink(MessageChannel *aChan, MessageChannel *aTargetChan);
119
    virtual ~ThreadLink();
120
121
    virtual void EchoMessage(Message *msg) override;
122
    virtual void SendMessage(Message *msg) override;
123
    virtual void SendClose() override;
124
125
    virtual bool Unsound_IsClosed() const override;
126
    virtual uint32_t Unsound_NumQueuedMessages() const override;
127
128
  protected:
129
    MessageChannel* mTargetChan;
130
};
131
132
} // namespace ipc
133
} // namespace mozilla
134
135
#endif  // ifndef ipc_glue_MessageLink_h
136