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

Side by Side Diff: remoting/host/chromoting_host.h

Issue 2829018: Fix thread usage in chromoting host (Closed)
Patch Set: removed useless test Created 10 years, 5 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
« no previous file with comments | « no previous file | remoting/host/chromoting_host.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) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 REMOTING_CHROMOTING_HOST_H_ 5 #ifndef REMOTING_CHROMOTING_HOST_H_
6 #define REMOTING_CHROMOTING_HOST_H_ 6 #define REMOTING_CHROMOTING_HOST_H_
7 7
8 #include <string> 8 #include <string>
9 9
10 #include "base/thread.h" 10 #include "base/thread.h"
11 #include "remoting/host/capturer.h" 11 #include "remoting/host/capturer.h"
12 #include "remoting/host/client_connection.h" 12 #include "remoting/host/client_connection.h"
13 #include "remoting/host/encoder.h" 13 #include "remoting/host/encoder.h"
14 #include "remoting/host/event_executor.h" 14 #include "remoting/host/event_executor.h"
15 #include "remoting/host/heartbeat_sender.h" 15 #include "remoting/host/heartbeat_sender.h"
16 #include "remoting/host/session_manager.h" 16 #include "remoting/host/session_manager.h"
17 #include "remoting/jingle_glue/jingle_client.h" 17 #include "remoting/jingle_glue/jingle_client.h"
18 #include "remoting/jingle_glue/jingle_thread.h" 18 #include "remoting/jingle_glue/jingle_thread.h"
19 19
20 namespace base { 20 class Task;
21 class WaitableEvent;
22 } // namespace base
23 21
24 namespace remoting { 22 namespace remoting {
25 23
24 class ChromotingHostContext;
26 class MutableHostConfig; 25 class MutableHostConfig;
27 26
28 // A class to implement the functionality of a host process. 27 // A class to implement the functionality of a host process.
29 // 28 //
30 // Here's the work flow of this class: 29 // Here's the work flow of this class:
31 // 1. We should load the saved GAIA ID token or if this is the first 30 // 1. We should load the saved GAIA ID token or if this is the first
32 // time the host process runs we should prompt user for the 31 // time the host process runs we should prompt user for the
33 // credential. We will use this token or credentials to authenicate 32 // credential. We will use this token or credentials to authenicate
34 // and register the host. 33 // and register the host.
35 // 34 //
36 // 2. We listen for incoming connection using libjingle. We will create 35 // 2. We listen for incoming connection using libjingle. We will create
37 // a ClientConnection object that wraps around linjingle for transport. Also 36 // a ClientConnection object that wraps around linjingle for transport. Also
38 // create a SessionManager with appropriate Encoder and Capturer and 37 // create a SessionManager with appropriate Encoder and Capturer and
39 // add the ClientConnection to this SessionManager for transporting the 38 // add the ClientConnection to this SessionManager for transporting the
40 // screen captures. A EventExecutor is created and registered with the 39 // screen captures. A EventExecutor is created and registered with the
41 // ClientConnection to receive mouse / keyboard events from the remote 40 // ClientConnection to receive mouse / keyboard events from the remote
42 // client. 41 // client.
43 // This is also the right time to create multiple threads to host 42 // This is also the right time to create multiple threads to host
44 // the above objects. After we have done all the initialization 43 // the above objects. After we have done all the initialization
45 // we'll start the SessionManager. We'll then enter the running state 44 // we'll start the SessionManager. We'll then enter the running state
46 // of the host process. 45 // of the host process.
47 // 46 //
48 // 3. When the user is disconencted, we will pause the SessionManager 47 // 3. When the user is disconencted, we will pause the SessionManager
49 // and try to terminate the threads we have created. This will allow 48 // and try to terminate the threads we have created. This will allow
50 // all pending tasks to complete. After all of that completed we 49 // all pending tasks to complete. After all of that completed we
51 // return to the idle state. We then go to step (2) if there a new 50 // return to the idle state. We then go to step (2) if there a new
52 // incoming connection. 51 // incoming connection.
53 class ChromotingHost : public base::RefCountedThreadSafe<ChromotingHost>, 52 class ChromotingHost : public base::RefCountedThreadSafe<ChromotingHost>,
54 public ClientConnection::EventHandler, 53 public ClientConnection::EventHandler,
55 public JingleClient::Callback { 54 public JingleClient::Callback {
56 public: 55 public:
57 ChromotingHost(MutableHostConfig* config, Capturer* capturer, 56 ChromotingHost(ChromotingHostContext* context, MutableHostConfig* config,
58 Encoder* encoder, EventExecutor* executor, 57 Capturer* capturer, Encoder* encoder, EventExecutor* executor);
59 base::WaitableEvent* host_done);
60 virtual ~ChromotingHost(); 58 virtual ~ChromotingHost();
61 59
62 // Run the host porcess. This method returns only after the message loop 60 // Start the host porcess. This methods starts the chromoting host
63 // of the host process exits. 61 // asynchronously.
64 void Run(); 62 //
63 // |shutdown_task| is called if Start() has failed ot Shutdown() is called
64 // and all related operations are completed.
65 //
66 // This method can only be called once during the lifetime of this object.
67 void Start(Task* shutdown_task);
65 68
66 // This method is called when we need to the host process. 69 // This method is called when we need to the host process.
67 void DestroySession(); 70 void Shutdown();
68
69 // This method talks to the cloud to register the host process. If
70 // successful we will start listening to network requests.
71 void RegisterHost();
72 71
73 // This method is called if a client is connected to this object. 72 // This method is called if a client is connected to this object.
74 void OnClientConnected(ClientConnection* client); 73 void OnClientConnected(ClientConnection* client);
75 74
76 // This method is called if a client is disconnected from the host. 75 // This method is called if a client is disconnected from the host.
77 void OnClientDisconnected(ClientConnection* client); 76 void OnClientDisconnected(ClientConnection* client);
78 77
79 //////////////////////////////////////////////////////////////////////////// 78 ////////////////////////////////////////////////////////////////////////////
80 // ClientConnection::EventHandler implementations 79 // ClientConnection::EventHandler implementations
81 virtual void HandleMessages(ClientConnection* client, 80 virtual void HandleMessages(ClientConnection* client,
82 ClientMessageList* messages); 81 ClientMessageList* messages);
83 virtual void OnConnectionOpened(ClientConnection* client); 82 virtual void OnConnectionOpened(ClientConnection* client);
84 virtual void OnConnectionClosed(ClientConnection* client); 83 virtual void OnConnectionClosed(ClientConnection* client);
85 virtual void OnConnectionFailed(ClientConnection* client); 84 virtual void OnConnectionFailed(ClientConnection* client);
86 85
87 //////////////////////////////////////////////////////////////////////////// 86 ////////////////////////////////////////////////////////////////////////////
88 // JingleClient::Callback implementations 87 // JingleClient::Callback implementations
89 virtual void OnStateChange(JingleClient* client, JingleClient::State state); 88 virtual void OnStateChange(JingleClient* client, JingleClient::State state);
90 virtual bool OnAcceptConnection( 89 virtual bool OnAcceptConnection(
91 JingleClient* jingle, const std::string& jid, 90 JingleClient* jingle, const std::string& jid,
92 JingleChannel::Callback** channel_callback); 91 JingleChannel::Callback** channel_callback);
93 virtual void OnNewConnection( 92 virtual void OnNewConnection(
94 JingleClient* jingle, 93 JingleClient* jingle,
95 scoped_refptr<JingleChannel> channel); 94 scoped_refptr<JingleChannel> channel);
96 95
97 private: 96 private:
98 // The message loop that this class runs on. 97 enum State {
99 MessageLoop* message_loop(); 98 kInitial,
99 kStarted,
100 kStopped,
101 };
100 102
101 // The main thread that this object runs on. 103 // This method connects to the talk network and start listening for incoming
102 base::Thread main_thread_; 104 // connections.
105 void DoStart(Task* shutdown_task);
103 106
104 // Used to handle the Jingle connection. 107 // This method shuts down the host process.
105 JingleThread network_thread_; 108 void DoShutdown();
106 109
107 // A thread that hosts capture operations. 110 // The context that the chromoting host runs on.
108 base::Thread capture_thread_; 111 ChromotingHostContext* context_;
109
110 // A thread that hosts encode operations.
111 base::Thread encode_thread_;
112 112
113 scoped_refptr<MutableHostConfig> config_; 113 scoped_refptr<MutableHostConfig> config_;
114 114
115 // Capturer to be used by SessionManager. Once the SessionManager is 115 // Capturer to be used by SessionManager. Once the SessionManager is
116 // constructed this is set to NULL. 116 // constructed this is set to NULL.
117 scoped_ptr<Capturer> capturer_; 117 scoped_ptr<Capturer> capturer_;
118 118
119 // Encoder to be used by the SessionManager. Once the SessionManager is 119 // Encoder to be used by the SessionManager. Once the SessionManager is
120 // constructed this is set to NULL. 120 // constructed this is set to NULL.
121 scoped_ptr<Encoder> encoder_; 121 scoped_ptr<Encoder> encoder_;
122 122
123 // EventExecutor executes input events received from the client. 123 // EventExecutor executes input events received from the client.
124 scoped_ptr<EventExecutor> executor_; 124 scoped_ptr<EventExecutor> executor_;
125 125
126 // The libjingle client. This is used to connect to the talk network to 126 // The libjingle client. This is used to connect to the talk network to
127 // receive connection requests from chromoting client. 127 // receive connection requests from chromoting client.
128 scoped_refptr<JingleClient> jingle_client_; 128 scoped_refptr<JingleClient> jingle_client_;
129 129
130 // Objects that takes care of sending heartbeats to the chromoting bot. 130 // Objects that takes care of sending heartbeats to the chromoting bot.
131 scoped_refptr<HeartbeatSender> heartbeat_sender_; 131 scoped_refptr<HeartbeatSender> heartbeat_sender_;
132 132
133 // A ClientConnection manages the connectino to a remote client. 133 // A ClientConnection manages the connectino to a remote client.
134 // TODO(hclam): Expand this to a list of clients. 134 // TODO(hclam): Expand this to a list of clients.
135 scoped_refptr<ClientConnection> client_; 135 scoped_refptr<ClientConnection> client_;
136 136
137 // Session manager for the host process. 137 // Session manager for the host process.
138 scoped_refptr<SessionManager> session_; 138 scoped_refptr<SessionManager> session_;
139 139
140 // Signals the host is ready to be destroyed. 140 // This task gets executed when this object fails to connect to the
141 base::WaitableEvent* host_done_; 141 // talk network or Shutdown() is called.
142 scoped_ptr<Task> shutdown_task_;
143
144 // Tracks the internal state of the host.
145 // This variable is written on the main thread of ChromotingHostContext
146 // and read by jingle thread.
147 State state_;
148
149 // Lock is to lock the access to |state_|.
150 Lock lock_;
142 151
143 DISALLOW_COPY_AND_ASSIGN(ChromotingHost); 152 DISALLOW_COPY_AND_ASSIGN(ChromotingHost);
144 }; 153 };
145 154
146 } // namespace remoting 155 } // namespace remoting
147 156
148 #endif // REMOTING_HOST_CHROMOTING_HOST_H_ 157 #endif // REMOTING_HOST_CHROMOTING_HOST_H_
OLDNEW
« no previous file with comments | « no previous file | remoting/host/chromoting_host.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698