Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(260)

Side by Side Diff: chrome/common/ipc_channel.h

Issue 12927: First cut at POSIX Implementation of IPC Channel using FIFOs. (Closed)
Patch Set: fix for agl's comments Created 12 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | chrome/common/ipc_channel_posix.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef CHROME_COMMON_IPC_CHANNEL_H_ 5 #ifndef CHROME_COMMON_IPC_CHANNEL_H_
6 #define CHROME_COMMON_IPC_CHANNEL_H_ 6 #define CHROME_COMMON_IPC_CHANNEL_H_
7 7
8 #include <queue> 8 #include <queue>
9 9
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
11 #include "chrome/common/ipc_message.h" 11 #include "chrome/common/ipc_message.h"
12 12
13 namespace IPC { 13 namespace IPC {
14 14
15 //------------------------------------------------------------------------------ 15 //------------------------------------------------------------------------------
16 16
17 class Channel : public Message::Sender 17 class Channel : public Message::Sender,
18 #if defined(OS_WIN) 18 #if defined(OS_WIN)
19 , public MessageLoopForIO::IOHandler 19 public MessageLoopForIO::IOHandler
20 #elif defined(OS_POSIX)
21 public MessageLoopForIO::FileWatcher
20 #endif 22 #endif
21 { 23 {
22 // Security tests need access to the pipe handle. 24 // Security tests need access to the pipe handle.
23 friend class ChannelTest; 25 friend class ChannelTest;
24 26
25 public: 27 public:
26 // Implemented by consumers of a Channel to receive messages. 28 // Implemented by consumers of a Channel to receive messages.
27 class Listener { 29 class Listener {
28 public: 30 public:
29 virtual ~Listener() {} 31 virtual ~Listener() {}
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 // |message| must be allocated using operator new. This object will be 85 // |message| must be allocated using operator new. This object will be
84 // deleted once the contents of the Message have been sent. 86 // deleted once the contents of the Message have been sent.
85 // 87 //
86 // FIXME bug 551500: the channel does not notice failures, so if the 88 // FIXME bug 551500: the channel does not notice failures, so if the
87 // renderer crashes, it will silently succeed, leaking the parameter. 89 // renderer crashes, it will silently succeed, leaking the parameter.
88 // At least the leak will be fixed by... 90 // At least the leak will be fixed by...
89 // 91 //
90 virtual bool Send(Message* message); 92 virtual bool Send(Message* message);
91 93
92 private: 94 private:
93 #if defined(OS_WIN)
94 const std::wstring PipeName(const std::wstring& channel_id) const; 95 const std::wstring PipeName(const std::wstring& channel_id) const;
95 bool CreatePipe(const std::wstring& channel_id, Mode mode); 96 bool CreatePipe(const std::wstring& channel_id, Mode mode);
97 #if defined(OS_WIN)
96 bool ProcessConnection(); 98 bool ProcessConnection();
97 bool ProcessIncomingMessages(MessageLoopForIO::IOContext* context, 99 bool ProcessIncomingMessages(MessageLoopForIO::IOContext* context,
98 DWORD bytes_read); 100 DWORD bytes_read);
99 bool ProcessOutgoingMessages(MessageLoopForIO::IOContext* context, 101 bool ProcessOutgoingMessages(MessageLoopForIO::IOContext* context,
100 DWORD bytes_written); 102 DWORD bytes_written);
101 103
102 // MessageLoop::IOHandler implementation. 104 // MessageLoop::IOHandler implementation.
103 virtual void OnIOCompleted(MessageLoopForIO::IOContext* context, 105 virtual void OnIOCompleted(MessageLoopForIO::IOContext* context,
104 DWORD bytes_transfered, DWORD error); 106 DWORD bytes_transfered, DWORD error);
105 #endif
106
107 private: 107 private:
108 enum { 108 enum {
109 BUF_SIZE = 4096 109 BUF_SIZE = 4096
110 }; 110 };
111 111
112 #if defined(OS_WIN)
113 struct State { 112 struct State {
114 explicit State(Channel* channel); 113 explicit State(Channel* channel);
115 ~State(); 114 ~State();
116 MessageLoopForIO::IOContext context; 115 MessageLoopForIO::IOContext context;
117 bool is_pending; 116 bool is_pending;
118 }; 117 };
119 118
120 State input_state_; 119 State input_state_;
121 State output_state_; 120 State output_state_;
122 121
123 HANDLE pipe_; 122 HANDLE pipe_;
124 #endif 123 #elif defined(OS_POSIX)
124 bool ProcessIncomingMessages();
125 bool ProcessOutgoingMessages();
126
127 void OnFileReadReady(int fd);
128 void OnFileWriteReady(int fd);
129
130
131 Mode mode_;
132
133 // TODO(playmobil): do we need to change BUF_SIZE ?
134 private:
135 enum {
136 BUF_SIZE = 4096
137 };
138
139 // PIMPL to encapsulate libevent structures.
140 struct EventHolder;
141 EventHolder *server_listen_connection_event_;
142 EventHolder *read_event_;
143 EventHolder *write_event_;
144
145 // If sending a message blocks then we use this variable
146 // to keep track of where we are.
147 size_t message_send_bytes_written_;
148
149 int server_listen_pipe_;
150 int pipe_;
151 std::string pipe_name_;
152 #endif // defined(OS_POSIX)
125 Listener* listener_; 153 Listener* listener_;
126 154
127 // Messages to be sent are queued here. 155 // Messages to be sent are queued here.
128 std::queue<Message*> output_queue_; 156 std::queue<Message*> output_queue_;
129 157
130 // We read from the pipe into this buffer 158 // We read from the pipe into this buffer
131 char input_buf_[BUF_SIZE]; 159 char input_buf_[BUF_SIZE];
132 160
133 // Large messages that span multiple pipe buffers, get built-up using 161 // Large messages that span multiple pipe buffers, get built-up using
134 // this buffer. 162 // this buffer.
(...skipping 20 matching lines...) Expand all
155 // to avoid conflicting with normal 183 // to avoid conflicting with normal
156 // message types, which are enumeration 184 // message types, which are enumeration
157 // constants starting from 0. 185 // constants starting from 0.
158 }; 186 };
159 }; 187 };
160 188
161 } 189 }
162 190
163 #endif // CHROME_COMMON_IPC_CHANNEL_H_ 191 #endif // CHROME_COMMON_IPC_CHANNEL_H_
164 192
OLDNEW
« no previous file with comments | « no previous file | chrome/common/ipc_channel_posix.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698