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

Side by Side Diff: mojo/system/raw_channel.h

Issue 257623003: Mojo: Add RawChannel tests for calling Shutdown() from OnReadMessage()/OnFatalError(). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: add comment Created 6 years, 8 months 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | mojo/system/raw_channel.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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 MOJO_SYSTEM_RAW_CHANNEL_H_ 5 #ifndef MOJO_SYSTEM_RAW_CHANNEL_H_
6 #define MOJO_SYSTEM_RAW_CHANNEL_H_ 6 #define MOJO_SYSTEM_RAW_CHANNEL_H_
7 7
8 #include <deque> 8 #include <deque>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 FATAL_ERROR_FAILED_READ, 52 FATAL_ERROR_FAILED_READ,
53 FATAL_ERROR_FAILED_WRITE 53 FATAL_ERROR_FAILED_WRITE
54 }; 54 };
55 55
56 // Called when a message is read. This may call |Shutdown()| (on the 56 // Called when a message is read. This may call |Shutdown()| (on the
57 // |RawChannel|), but must not destroy it. 57 // |RawChannel|), but must not destroy it.
58 virtual void OnReadMessage(const MessageInTransit::View& message_view) = 0; 58 virtual void OnReadMessage(const MessageInTransit::View& message_view) = 0;
59 59
60 // Called when there's a fatal error, which leads to the channel no longer 60 // Called when there's a fatal error, which leads to the channel no longer
61 // being viable. This may call |Shutdown()| (on the |RawChannel()|), but 61 // being viable. This may call |Shutdown()| (on the |RawChannel()|), but
62 // must now destroy it. 62 // must not destroy it.
63 // 63 //
64 // For each raw channel, at most one |FATAL_ERROR_FAILED_READ| and at most 64 // For each raw channel, at most one |FATAL_ERROR_FAILED_READ| and at most
65 // one |FATAL_ERROR_FAILED_WRITE| notification will be issued (both may be 65 // one |FATAL_ERROR_FAILED_WRITE| notification will be issued (both may be
66 // issued). After a |OnFatalError(FATAL_ERROR_FAILED_READ)|, there will be 66 // issued). After a |OnFatalError(FATAL_ERROR_FAILED_READ)|, there will be
67 // no further calls to |OnReadMessage()|. 67 // no further calls to |OnReadMessage()|.
68 virtual void OnFatalError(FatalError fatal_error) = 0; 68 virtual void OnFatalError(FatalError fatal_error) = 0;
69 69
70 protected: 70 protected:
71 virtual ~Delegate() {} 71 virtual ~Delegate() {}
72 }; 72 };
73 73
74 // Static factory method. |handle| should be a handle to a 74 // Static factory method. |handle| should be a handle to a
75 // (platform-appropriate) bidirectional communication channel (e.g., a socket 75 // (platform-appropriate) bidirectional communication channel (e.g., a socket
76 // on POSIX, a named pipe on Windows). 76 // on POSIX, a named pipe on Windows).
77 static scoped_ptr<RawChannel> Create(embedder::ScopedPlatformHandle handle); 77 static scoped_ptr<RawChannel> Create(embedder::ScopedPlatformHandle handle);
78 78
79 // This must be called (on an I/O thread) before this object is used. Does 79 // This must be called (on an I/O thread) before this object is used. Does
80 // *not* take ownership of |delegate|. Both the I/O thread and |delegate| must 80 // *not* take ownership of |delegate|. Both the I/O thread and |delegate| must
81 // remain alive for the lifetime of this object. Returns true on success. On 81 // remain alive until |Shutdown()| is called (unless this fails); |delegate|
82 // will no longer be used after |Shutdown()|. Returns true on success. On
82 // failure, |Shutdown()| should *not* be called. 83 // failure, |Shutdown()| should *not* be called.
83 bool Init(Delegate* delegate); 84 bool Init(Delegate* delegate);
84 85
85 // This must be called (on the I/O thread) before this object is destroyed. 86 // This must be called (on the I/O thread) before this object is destroyed.
86 void Shutdown(); 87 void Shutdown();
87 88
88 // Writes the given message (or schedules it to be written). This is 89 // Writes the given message (or schedules it to be written). This is
89 // thread-safe. Returns true on success. 90 // thread-safe. Returns true on success.
90 bool WriteMessage(scoped_ptr<MessageInTransit> message); 91 bool WriteMessage(scoped_ptr<MessageInTransit> message);
91 92
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 // - if the method returns IO_PENDING, |OnWriteCompleted()| will be called on 193 // - if the method returns IO_PENDING, |OnWriteCompleted()| will be called on
193 // the I/O thread to report the result, unless |Shutdown()| is called. 194 // the I/O thread to report the result, unless |Shutdown()| is called.
194 virtual IOResult WriteNoLock(size_t* bytes_written) = 0; 195 virtual IOResult WriteNoLock(size_t* bytes_written) = 0;
195 // Similar to |WriteNoLock()|, except that the implementing subclass must also 196 // Similar to |WriteNoLock()|, except that the implementing subclass must also
196 // guarantee that the method doesn't succeed synchronously, i.e., it only 197 // guarantee that the method doesn't succeed synchronously, i.e., it only
197 // returns IO_FAILED or IO_PENDING. 198 // returns IO_FAILED or IO_PENDING.
198 virtual IOResult ScheduleWriteNoLock() = 0; 199 virtual IOResult ScheduleWriteNoLock() = 0;
199 200
200 // Must be called on the I/O thread WITHOUT |write_lock_| held. 201 // Must be called on the I/O thread WITHOUT |write_lock_| held.
201 virtual bool OnInit() = 0; 202 virtual bool OnInit() = 0;
202 // On shutdown, passes the ownership of the buffers to subclasses, who may 203 // On shutdown, passes the ownership of the buffers to subclasses, which may
203 // want to preserve them if there are pending read/write. 204 // want to preserve them if there are pending read/write. Must be called on
204 // Must be called on the I/O thread under |write_lock_|. 205 // the I/O thread under |write_lock_|.
205 virtual void OnShutdownNoLock( 206 virtual void OnShutdownNoLock(
206 scoped_ptr<ReadBuffer> read_buffer, 207 scoped_ptr<ReadBuffer> read_buffer,
207 scoped_ptr<WriteBuffer> write_buffer) = 0; 208 scoped_ptr<WriteBuffer> write_buffer) = 0;
208 209
209 // Must be called on the I/O thread WITHOUT |write_lock_| held. 210 // Must be called on the I/O thread WITHOUT |write_lock_| held.
210 void OnReadCompleted(bool result, size_t bytes_read); 211 void OnReadCompleted(bool result, size_t bytes_read);
211 // Must be called on the I/O thread WITHOUT |write_lock_| held. 212 // Must be called on the I/O thread WITHOUT |write_lock_| held.
212 void OnWriteCompleted(bool result, size_t bytes_written); 213 void OnWriteCompleted(bool result, size_t bytes_written);
213 214
214 private: 215 private:
215 // Calls |delegate_->OnFatalError(fatal_error)|. Must be called on the I/O 216 // Calls |delegate_->OnFatalError(fatal_error)|. Must be called on the I/O
216 // thread WITHOUT |write_lock_| held. 217 // thread WITHOUT |write_lock_| held.
217 void CallOnFatalError(Delegate::FatalError fatal_error); 218 void CallOnFatalError(Delegate::FatalError fatal_error);
218 219
219 // If |result| is true, updates the write buffer and schedules a write 220 // If |result| is true, updates the write buffer and schedules a write
220 // operation to run later if there are more contents to write. If |result| is 221 // operation to run later if there are more contents to write. If |result| is
221 // false or any error occurs during the method execution, cancels pending 222 // false or any error occurs during the method execution, cancels pending
222 // writes and returns false. 223 // writes and returns false.
223 // Must be called only if |write_stopped_| is false and under |write_lock_|. 224 // Must be called only if |write_stopped_| is false and under |write_lock_|.
224 bool OnWriteCompletedNoLock(bool result, size_t bytes_written); 225 bool OnWriteCompletedNoLock(bool result, size_t bytes_written);
225 226
226 // Set in |Init()| and never changed (hence usable on any thread without 227 // Set in |Init()| and never changed (hence usable on any thread without
227 // locking): 228 // locking):
228 Delegate* delegate_;
229 base::MessageLoopForIO* message_loop_for_io_; 229 base::MessageLoopForIO* message_loop_for_io_;
230 230
231 // Only used on the I/O thread: 231 // Only used on the I/O thread:
232 Delegate* delegate_;
232 bool read_stopped_; 233 bool read_stopped_;
233 scoped_ptr<ReadBuffer> read_buffer_; 234 scoped_ptr<ReadBuffer> read_buffer_;
234 235
235 base::Lock write_lock_; // Protects the following members. 236 base::Lock write_lock_; // Protects the following members.
236 bool write_stopped_; 237 bool write_stopped_;
237 scoped_ptr<WriteBuffer> write_buffer_; 238 scoped_ptr<WriteBuffer> write_buffer_;
238 239
239 // This is used for posting tasks from write threads to the I/O thread. It 240 // This is used for posting tasks from write threads to the I/O thread. It
240 // must only be accessed under |write_lock_|. The weak pointers it produces 241 // must only be accessed under |write_lock_|. The weak pointers it produces
241 // are only used/invalidated on the I/O thread. 242 // are only used/invalidated on the I/O thread.
242 base::WeakPtrFactory<RawChannel> weak_ptr_factory_; 243 base::WeakPtrFactory<RawChannel> weak_ptr_factory_;
243 244
244 DISALLOW_COPY_AND_ASSIGN(RawChannel); 245 DISALLOW_COPY_AND_ASSIGN(RawChannel);
245 }; 246 };
246 247
247 } // namespace system 248 } // namespace system
248 } // namespace mojo 249 } // namespace mojo
249 250
250 #endif // MOJO_SYSTEM_RAW_CHANNEL_H_ 251 #endif // MOJO_SYSTEM_RAW_CHANNEL_H_
OLDNEW
« no previous file with comments | « no previous file | mojo/system/raw_channel.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698