object.hpp 5.8 KB
Newer Older
Martin Sustrik's avatar
Martin Sustrik committed
1
/*
2
    Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file
Martin Sustrik's avatar
Martin Sustrik committed
3

4
    This file is part of libzmq, the ZeroMQ core engine in C++.
Martin Sustrik's avatar
Martin Sustrik committed
5

6 7 8
    libzmq is free software; you can redistribute it and/or modify it under
    the terms of the GNU Lesser General Public License (LGPL) as published
    by the Free Software Foundation; either version 3 of the License, or
Martin Sustrik's avatar
Martin Sustrik committed
9 10
    (at your option) any later version.

11 12 13 14 15 16 17 18 19 20 21 22 23 24
    As a special exception, the Contributors give you permission to link
    this library with independent modules to produce an executable,
    regardless of the license terms of these independent modules, and to
    copy and distribute the resulting executable under terms of your choice,
    provided that you also meet, for each linked independent module, the
    terms and conditions of the license of that module. An independent
    module is a module which is not derived from or based on this library.
    If you modify this library, you must extend this exception to your
    version of the library.

    libzmq is distributed in the hope that it will be useful, but WITHOUT
    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
    License for more details.
Martin Sustrik's avatar
Martin Sustrik committed
25

26
    You should have received a copy of the GNU Lesser General Public License
Martin Sustrik's avatar
Martin Sustrik committed
27 28 29
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

Martin Sustrik's avatar
Martin Sustrik committed
30 31
#ifndef __ZMQ_OBJECT_HPP_INCLUDED__
#define __ZMQ_OBJECT_HPP_INCLUDED__
Martin Sustrik's avatar
Martin Sustrik committed
32

Martin Hurton's avatar
Martin Hurton committed
33
#include <string>
Martin Sustrik's avatar
Martin Sustrik committed
34 35
#include "stdint.hpp"

Martin Sustrik's avatar
Martin Sustrik committed
36
namespace zmq
Martin Sustrik's avatar
Martin Sustrik committed
37
{
38 39 40

    struct i_engine;
    struct endpoint_t;
41
    struct pending_connection_t;
42 43 44 45 46 47 48 49
    struct command_t;
    class ctx_t;
    class pipe_t;
    class socket_base_t;
    class session_base_t;
    class io_thread_t;
    class own_t;

Martin Sustrik's avatar
Martin Sustrik committed
50 51 52 53 54 55 56
    //  Base class for all objects that participate in inter-thread
    //  communication.

    class object_t
    {
    public:

57
        object_t (zmq::ctx_t *ctx_, uint32_t tid_);
Martin Sustrik's avatar
Martin Sustrik committed
58
        object_t (object_t *parent_);
malosek's avatar
malosek committed
59
        virtual ~object_t ();
Martin Sustrik's avatar
Martin Sustrik committed
60

Martin Sustrik's avatar
Martin Sustrik committed
61
        uint32_t get_tid ();
62
        void set_tid(uint32_t id);
63
        ctx_t *get_ctx ();
64
        void process_command (zmq::command_t &cmd_);
65
        void send_inproc_connected (zmq::socket_base_t *socket_);
66
        void send_bind (zmq::own_t *destination_, zmq::pipe_t *pipe_, bool inc_seqnum_ = true);
Martin Sustrik's avatar
Martin Sustrik committed
67 68 69

    protected:

70 71
        //  Using following function, socket is able to access global
        //  repository of inproc endpoints.
72 73
        int register_endpoint (const char *addr_,
                const zmq::endpoint_t &endpoint_);
Martin Hurton's avatar
Martin Hurton committed
74 75
        int unregister_endpoint (
                const std::string &addr_, socket_base_t *socket_);
76 77
        void unregister_endpoints (zmq::socket_base_t *socket_);
        zmq::endpoint_t find_endpoint (const char *addr_);
Martin Hurton's avatar
Martin Hurton committed
78 79
        void pend_connection (const std::string &addr_,
                const endpoint_t &endpoint, pipe_t **pipes_);
80
        void connect_pending (const char *addr_, zmq::socket_base_t *bind_socket_);
81

82
        void destroy_socket (zmq::socket_base_t *socket_);
83

84
        //  Logs an message.
85
        void log (const char *format_, ...);
86

87
        //  Chooses least loaded I/O thread.
88
        zmq::io_thread_t *choose_io_thread (uint64_t affinity_);
Martin Sustrik's avatar
Martin Sustrik committed
89 90 91 92

        //  Derived object can use these functions to send commands
        //  to other objects.
        void send_stop ();
93
        void send_plug (zmq::own_t *destination_,
94
            bool inc_seqnum_ = true);
95 96 97 98 99 100
        void send_own (zmq::own_t *destination_,
            zmq::own_t *object_);
        void send_attach (zmq::session_base_t *destination_,
             zmq::i_engine *engine_, bool inc_seqnum_ = true);
        void send_activate_read (zmq::pipe_t *destination_);
        void send_activate_write (zmq::pipe_t *destination_,
Martin Hurton's avatar
Martin Hurton committed
101
             uint64_t msgs_read_);
102 103 104
        void send_hiccup (zmq::pipe_t *destination_, void *pipe_);
        void send_pipe_term (zmq::pipe_t *destination_);
        void send_pipe_term_ack (zmq::pipe_t *destination_);
105
        void send_pipe_hwm (zmq::pipe_t *destination_, int inhwm_, int outhwm_);
106 107 108 109 110
        void send_term_req (zmq::own_t *destination_,
            zmq::own_t *object_);
        void send_term (zmq::own_t *destination_, int linger_);
        void send_term_ack (zmq::own_t *destination_);
        void send_reap (zmq::socket_base_t *socket_);
111
        void send_reaped ();
112
        void send_done ();
Martin Sustrik's avatar
Martin Sustrik committed
113

114
        //  These handlers can be overridden by the derived objects. They are
Martin Sustrik's avatar
Martin Sustrik committed
115 116
        //  called when command arrives from another thread.
        virtual void process_stop ();
117
        virtual void process_plug ();
118 119 120
        virtual void process_own (zmq::own_t *object_);
        virtual void process_attach (zmq::i_engine *engine_);
        virtual void process_bind (zmq::pipe_t *pipe_);
121 122
        virtual void process_activate_read ();
        virtual void process_activate_write (uint64_t msgs_read_);
123
        virtual void process_hiccup (void *pipe_);
Martin Sustrik's avatar
Martin Sustrik committed
124 125
        virtual void process_pipe_term ();
        virtual void process_pipe_term_ack ();
126
        virtual void process_pipe_hwm (int inhwm_, int outhwm_);
127
        virtual void process_term_req (zmq::own_t *object_);
128
        virtual void process_term (int linger_);
129
        virtual void process_term_ack ();
130
        virtual void process_reap (zmq::socket_base_t *socket_);
131
        virtual void process_reaped ();
Martin Sustrik's avatar
Martin Sustrik committed
132

133 134 135 136 137
        //  Special handler called after a command that requires a seqnum
        //  was processed. The implementation should catch up with its counter
        //  of processed commands here.
        virtual void process_seqnum ();

138 139
    private:

140
        //  Context provides access to the global state.
141
        zmq::ctx_t *ctx;
Martin Sustrik's avatar
Martin Sustrik committed
142

Martin Sustrik's avatar
Martin Sustrik committed
143 144
        //  Thread ID of the thread the object belongs to.
        uint32_t tid;
Martin Sustrik's avatar
Martin Sustrik committed
145 146 147 148

        void send_command (command_t &cmd_);

        object_t (const object_t&);
149
        const object_t &operator = (const object_t&);
Martin Sustrik's avatar
Martin Sustrik committed
150 151 152 153 154
    };

}

#endif