| OLD | NEW |
| 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_PUBLIC_CPP_BINDINGS_LIB_CONNECTOR_H_ | 5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_CONNECTOR_H_ |
| 6 #define MOJO_PUBLIC_CPP_BINDINGS_LIB_CONNECTOR_H_ | 6 #define MOJO_PUBLIC_CPP_BINDINGS_LIB_CONNECTOR_H_ |
| 7 | 7 |
| 8 #include "base/memory/ref_counted.h" | 8 #include "base/memory/ref_counted.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/memory/weak_ptr.h" | 10 #include "base/memory/weak_ptr.h" |
| 11 #include "base/threading/thread_checker.h" | 11 #include "base/threading/thread_checker.h" |
| 12 #include "mojo/public/cpp/bindings/callback.h" | 12 #include "mojo/public/cpp/bindings/callback.h" |
| 13 #include "mojo/public/cpp/bindings/lib/sync_handle_watcher.h" |
| 13 #include "mojo/public/cpp/bindings/message.h" | 14 #include "mojo/public/cpp/bindings/message.h" |
| 14 #include "mojo/public/cpp/system/core.h" | 15 #include "mojo/public/cpp/system/core.h" |
| 15 #include "mojo/public/cpp/system/watcher.h" | 16 #include "mojo/public/cpp/system/watcher.h" |
| 16 | 17 |
| 17 namespace base { | 18 namespace base { |
| 18 class Lock; | 19 class Lock; |
| 19 } | 20 } |
| 20 | 21 |
| 21 namespace mojo { | 22 namespace mojo { |
| 22 namespace internal { | 23 namespace internal { |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 void ResumeIncomingMethodCallProcessing(); | 113 void ResumeIncomingMethodCallProcessing(); |
| 113 | 114 |
| 114 // MessageReceiver implementation: | 115 // MessageReceiver implementation: |
| 115 bool Accept(Message* message) override; | 116 bool Accept(Message* message) override; |
| 116 | 117 |
| 117 MessagePipeHandle handle() const { | 118 MessagePipeHandle handle() const { |
| 118 DCHECK(thread_checker_.CalledOnValidThread()); | 119 DCHECK(thread_checker_.CalledOnValidThread()); |
| 119 return message_pipe_.get(); | 120 return message_pipe_.get(); |
| 120 } | 121 } |
| 121 | 122 |
| 122 // Requests to register |message_pipe_| with SyncHandleWatcher whenever this | 123 // Allows |message_pipe_| be watched while others perform sync handle watching |
| 123 // instance is expecting incoming messages. | 124 // on the same thread. Please see comments of |
| 124 // | 125 // SyncHandleWatcher::AllowWokenUpBySyncWatchOnSameThread(). |
| 125 // Please note that UnregisterSyncHandleWatch() needs to be called as many | 126 void AllowWokenUpBySyncWatchOnSameThread(); |
| 126 // times as successful RegisterSyncHandleWatch() calls in order to cancel the | |
| 127 // effect. | |
| 128 bool RegisterSyncHandleWatch(); | |
| 129 void UnregisterSyncHandleWatch(); | |
| 130 | 127 |
| 131 // Watches all handles registered with SyncHandleWatcher on the same thread. | 128 // Watches |message_pipe_| (as well as other handles registered to be watched |
| 132 // The method returns true when |*should_stop| is set to true; returns false | 129 // together) synchronously. |
| 133 // when any failure occurs during the watch, including |message_pipe_| is | 130 // This method: |
| 134 // closed. | 131 // - returns true when |should_stop| is set to true; |
| 135 bool RunSyncHandleWatch(const bool* should_stop); | 132 // - return false when any error occurs, including |message_pipe_| being |
| 133 // closed. |
| 134 bool SyncWatch(const bool* should_stop); |
| 136 | 135 |
| 137 // Whether currently the control flow is inside the sync handle watcher | 136 // Whether currently the control flow is inside the sync handle watcher |
| 138 // callback. | 137 // callback. |
| 139 bool during_sync_handle_watcher_callback() const { | 138 bool during_sync_handle_watcher_callback() const { |
| 140 return sync_handle_watcher_callback_count_ > 0; | 139 return sync_handle_watcher_callback_count_ > 0; |
| 141 } | 140 } |
| 142 | 141 |
| 143 private: | 142 private: |
| 144 // Callback of mojo::Watcher. | 143 // Callback of mojo::Watcher. |
| 145 void OnWatcherHandleReady(MojoResult result); | 144 void OnWatcherHandleReady(MojoResult result); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 157 | 156 |
| 158 // If |force_pipe_reset| is true, this method replaces the existing | 157 // If |force_pipe_reset| is true, this method replaces the existing |
| 159 // |message_pipe_| with a dummy message pipe handle (whose peer is closed). | 158 // |message_pipe_| with a dummy message pipe handle (whose peer is closed). |
| 160 // If |force_async_handler| is true, |connection_error_handler_| is called | 159 // If |force_async_handler| is true, |connection_error_handler_| is called |
| 161 // asynchronously. | 160 // asynchronously. |
| 162 void HandleError(bool force_pipe_reset, bool force_async_handler); | 161 void HandleError(bool force_pipe_reset, bool force_async_handler); |
| 163 | 162 |
| 164 // Cancels any calls made to |waiter_|. | 163 // Cancels any calls made to |waiter_|. |
| 165 void CancelWait(); | 164 void CancelWait(); |
| 166 | 165 |
| 166 void EnsureSyncWatcherExists(); |
| 167 |
| 167 Closure connection_error_handler_; | 168 Closure connection_error_handler_; |
| 168 | 169 |
| 169 ScopedMessagePipeHandle message_pipe_; | 170 ScopedMessagePipeHandle message_pipe_; |
| 170 MessageReceiver* incoming_receiver_; | 171 MessageReceiver* incoming_receiver_; |
| 171 | 172 |
| 172 Watcher handle_watcher_; | 173 Watcher handle_watcher_; |
| 173 | 174 |
| 174 bool error_; | 175 bool error_; |
| 175 bool drop_writes_; | 176 bool drop_writes_; |
| 176 bool enforce_errors_from_incoming_receiver_; | 177 bool enforce_errors_from_incoming_receiver_; |
| 177 | 178 |
| 178 bool paused_; | 179 bool paused_; |
| 179 | 180 |
| 180 // If sending messages is allowed from multiple threads, |lock_| is used to | 181 // If sending messages is allowed from multiple threads, |lock_| is used to |
| 181 // protect modifications to |message_pipe_| and |drop_writes_|. | 182 // protect modifications to |message_pipe_| and |drop_writes_|. |
| 182 scoped_ptr<base::Lock> lock_; | 183 scoped_ptr<base::Lock> lock_; |
| 183 | 184 |
| 184 // If non-zero, |message_pipe_| should be registered with SyncHandleWatcher. | 185 scoped_ptr<SyncHandleWatcher> sync_watcher_; |
| 185 size_t register_sync_handle_watch_count_; | 186 bool allow_woken_up_by_others_; |
| 186 // Whether |message_pipe_| has been registered with SyncHandleWatcher. | |
| 187 bool registered_with_sync_handle_watcher_; | |
| 188 // If non-zero, currently the control flow is inside the sync handle watcher | 187 // If non-zero, currently the control flow is inside the sync handle watcher |
| 189 // callback. | 188 // callback. |
| 190 size_t sync_handle_watcher_callback_count_; | 189 size_t sync_handle_watcher_callback_count_; |
| 191 scoped_refptr<base::RefCountedData<bool>> should_stop_sync_handle_watch_; | |
| 192 | 190 |
| 193 base::ThreadChecker thread_checker_; | 191 base::ThreadChecker thread_checker_; |
| 194 | 192 |
| 195 // Create a single weak ptr and use it everywhere, to avoid the malloc/free | 193 // Create a single weak ptr and use it everywhere, to avoid the malloc/free |
| 196 // cost of creating a new weak ptr whenever it is needed. | 194 // cost of creating a new weak ptr whenever it is needed. |
| 197 base::WeakPtr<Connector> weak_self_; | 195 base::WeakPtr<Connector> weak_self_; |
| 198 base::WeakPtrFactory<Connector> weak_factory_; | 196 base::WeakPtrFactory<Connector> weak_factory_; |
| 199 | 197 |
| 200 DISALLOW_COPY_AND_ASSIGN(Connector); | 198 DISALLOW_COPY_AND_ASSIGN(Connector); |
| 201 }; | 199 }; |
| 202 | 200 |
| 203 } // namespace internal | 201 } // namespace internal |
| 204 } // namespace mojo | 202 } // namespace mojo |
| 205 | 203 |
| 206 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_CONNECTOR_H_ | 204 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_CONNECTOR_H_ |
| OLD | NEW |