Line data Source code
1 : /*
2 : Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file
3 :
4 : This file is part of libzmq, the ZeroMQ core engine in C++.
5 :
6 : libzmq is free software; you can redistribute it and/or modify it under
7 : the terms of the GNU Lesser General Public License (LGPL) as published
8 : by the Free Software Foundation; either version 3 of the License, or
9 : (at your option) any later version.
10 :
11 : As a special exception, the Contributors give you permission to link
12 : this library with independent modules to produce an executable,
13 : regardless of the license terms of these independent modules, and to
14 : copy and distribute the resulting executable under terms of your choice,
15 : provided that you also meet, for each linked independent module, the
16 : terms and conditions of the license of that module. An independent
17 : module is a module which is not derived from or based on this library.
18 : If you modify this library, you must extend this exception to your
19 : version of the library.
20 :
21 : libzmq is distributed in the hope that it will be useful, but WITHOUT
22 : ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
23 : FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
24 : License for more details.
25 :
26 : You should have received a copy of the GNU Lesser General Public License
27 : along with this program. If not, see <http://www.gnu.org/licenses/>.
28 : */
29 :
30 : #ifndef __ZMQ_MAILBOX_HPP_INCLUDED__
31 : #define __ZMQ_MAILBOX_HPP_INCLUDED__
32 :
33 : #include <stddef.h>
34 :
35 : #include "platform.hpp"
36 : #include "signaler.hpp"
37 : #include "fd.hpp"
38 : #include "config.hpp"
39 : #include "command.hpp"
40 : #include "ypipe.hpp"
41 : #include "mutex.hpp"
42 : #include "i_mailbox.hpp"
43 :
44 : namespace zmq
45 : {
46 :
47 : class mailbox_t : public i_mailbox
48 : {
49 : public:
50 :
51 : mailbox_t ();
52 : ~mailbox_t ();
53 :
54 : fd_t get_fd () const;
55 : void send (const command_t &cmd_);
56 : int recv (command_t *cmd_, int timeout_);
57 :
58 : #ifdef HAVE_FORK
59 : // close the file descriptors in the signaller. This is used in a forked
60 : // child process to close the file descriptors so that they do not interfere
61 : // with the context in the parent process.
62 0 : void forked () { signaler.forked (); }
63 : #endif
64 :
65 : private:
66 :
67 : // The pipe to store actual commands.
68 : typedef ypipe_t <command_t, command_pipe_granularity> cpipe_t;
69 : cpipe_t cpipe;
70 :
71 : // Signaler to pass signals from writer thread to reader thread.
72 : signaler_t signaler;
73 :
74 : // There's only one thread receiving from the mailbox, but there
75 : // is arbitrary number of threads sending. Given that ypipe requires
76 : // synchronised access on both of its endpoints, we have to synchronise
77 : // the sending side.
78 : mutex_t sync;
79 :
80 : // True if the underlying pipe is active, ie. when we are allowed to
81 : // read commands from it.
82 : bool active;
83 :
84 : // Disable copying of mailbox_t object.
85 : mailbox_t (const mailbox_t&);
86 : const mailbox_t &operator = (const mailbox_t&);
87 : };
88 :
89 : }
90 :
91 : #endif
|