OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #ifndef BIN_EVENTHANDLER_WIN_H_ | 5 #ifndef BIN_EVENTHANDLER_WIN_H_ |
6 #define BIN_EVENTHANDLER_WIN_H_ | 6 #define BIN_EVENTHANDLER_WIN_H_ |
7 | 7 |
8 #include <winsock2.h> | 8 #include <winsock2.h> |
9 #include <mswsock.h> | 9 #include <mswsock.h> |
10 | 10 |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
145 int Write(const void* buffer, int num_bytes); | 145 int Write(const void* buffer, int num_bytes); |
146 | 146 |
147 // Internal interface used by the event handler. | 147 // Internal interface used by the event handler. |
148 virtual bool IssueRead(); | 148 virtual bool IssueRead(); |
149 virtual bool IssueWrite(); | 149 virtual bool IssueWrite(); |
150 bool HasPendingRead(); | 150 bool HasPendingRead(); |
151 bool HasPendingWrite(); | 151 bool HasPendingWrite(); |
152 void ReadComplete(IOBuffer* buffer); | 152 void ReadComplete(IOBuffer* buffer); |
153 void WriteComplete(IOBuffer* buffer); | 153 void WriteComplete(IOBuffer* buffer); |
154 | 154 |
| 155 bool IsClosing() { return (flags_ & (1 << kClosing)) != 0; } |
| 156 bool IsClosedRead() { return (flags_ & (1 << kCloseRead)) != 0; } |
| 157 bool IsClosedWrite() { return (flags_ & (1 << kCloseWrite)) != 0; } |
| 158 void MarkClosing() { flags_ |= (1 << kClosing); } |
| 159 void MarkClosedRead() { flags_ |= (1 << kCloseRead); } |
| 160 void MarkClosedWrite() { flags_ |= (1 << kCloseWrite); } |
| 161 |
155 virtual void EnsureInitialized( | 162 virtual void EnsureInitialized( |
156 EventHandlerImplementation* event_handler) = 0; | 163 EventHandlerImplementation* event_handler) = 0; |
157 | 164 |
158 HANDLE handle() { return handle_; } | 165 HANDLE handle() { return handle_; } |
159 Dart_Port port() { return port_; } | 166 Dart_Port port() { return port_; } |
160 EventHandlerImplementation* event_handler() { return event_handler_; } | 167 EventHandlerImplementation* event_handler() { return event_handler_; } |
161 | 168 |
162 void Lock(); | 169 void Lock(); |
163 void Unlock(); | 170 void Unlock(); |
164 | 171 |
165 bool CreateCompletionPort(HANDLE completion_port); | 172 bool CreateCompletionPort(HANDLE completion_port); |
166 | 173 |
167 void close(); | 174 void close(); |
168 virtual bool IsClosed() = 0; | 175 virtual bool IsClosed() = 0; |
169 | 176 |
170 void SetPortAndMask(Dart_Port port, intptr_t mask) { | 177 void SetPortAndMask(Dart_Port port, intptr_t mask) { |
171 port_ = port; | 178 port_ = port; |
172 mask_ = mask; | 179 mask_ = mask; |
173 } | 180 } |
174 Type type() { return type_; } | 181 Type type() { return type_; } |
175 bool is_file() { return type_ == kFile; } | 182 bool is_file() { return type_ == kFile; } |
176 bool is_socket() { return type_ == kListenSocket || type_ == kClientSocket; } | 183 bool is_socket() { return type_ == kListenSocket || type_ == kClientSocket; } |
177 bool is_listen_socket() { return type_ == kListenSocket; } | 184 bool is_listen_socket() { return type_ == kListenSocket; } |
178 bool is_client_socket() { return type_ == kClientSocket; } | 185 bool is_client_socket() { return type_ == kClientSocket; } |
179 intptr_t mask() { return mask_; } | 186 intptr_t mask() { return mask_; } |
180 | 187 |
181 bool is_closing() { return closing_; } | 188 protected: |
| 189 enum Flags { |
| 190 kClosing = 0, |
| 191 kCloseRead = 1, |
| 192 kCloseWrite = 2 |
| 193 }; |
182 | 194 |
183 protected: | |
184 explicit Handle(HANDLE handle); | 195 explicit Handle(HANDLE handle); |
185 Handle(HANDLE handle, Dart_Port port); | 196 Handle(HANDLE handle, Dart_Port port); |
186 | 197 |
187 virtual void AfterClose() = 0; | 198 virtual void AfterClose() = 0; |
188 | 199 |
189 Type type_; | 200 Type type_; |
190 HANDLE handle_; | 201 HANDLE handle_; |
191 bool closing_; // Is this handle in the process of closing? | |
192 Dart_Port port_; // Dart port to communicate events for this socket. | 202 Dart_Port port_; // Dart port to communicate events for this socket. |
193 intptr_t mask_; // Mask of events to report through the port. | 203 intptr_t mask_; // Mask of events to report through the port. |
194 HANDLE completion_port_; | 204 HANDLE completion_port_; |
195 CRITICAL_SECTION cs_; // Critical section protecting this object. | |
196 EventHandlerImplementation* event_handler_; | 205 EventHandlerImplementation* event_handler_; |
197 | 206 |
198 IOBuffer* data_ready_; // IO buffer for data ready to be read. | 207 IOBuffer* data_ready_; // IO buffer for data ready to be read. |
199 IOBuffer* pending_read_; // IO buffer for pending read. | 208 IOBuffer* pending_read_; // IO buffer for pending read. |
200 IOBuffer* pending_write_; // IO buffer for pending write | 209 IOBuffer* pending_write_; // IO buffer for pending write |
| 210 |
| 211 private: |
| 212 int flags_; |
| 213 CRITICAL_SECTION cs_; // Critical section protecting this object. |
201 }; | 214 }; |
202 | 215 |
203 | 216 |
204 class FileHandle : public Handle { | 217 class FileHandle : public Handle { |
205 public: | 218 public: |
206 explicit FileHandle(HANDLE handle) | 219 explicit FileHandle(HANDLE handle) |
207 : Handle(reinterpret_cast<HANDLE>(handle)) { type_ = kFile; } | 220 : Handle(reinterpret_cast<HANDLE>(handle)) { type_ = kFile; } |
208 FileHandle(HANDLE handle, Dart_Port port) | 221 FileHandle(HANDLE handle, Dart_Port port) |
209 : Handle(reinterpret_cast<HANDLE>(handle), port) { type_ = kFile; } | 222 : Handle(reinterpret_cast<HANDLE>(handle), port) { type_ = kFile; } |
210 | 223 |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 // Linked list of accepted connections provided by completion code. Ready to | 279 // Linked list of accepted connections provided by completion code. Ready to |
267 // be handed over through accept. | 280 // be handed over through accept. |
268 ClientSocket* accepted_head_; | 281 ClientSocket* accepted_head_; |
269 ClientSocket* accepted_tail_; | 282 ClientSocket* accepted_tail_; |
270 }; | 283 }; |
271 | 284 |
272 | 285 |
273 // Information on connected sockets. | 286 // Information on connected sockets. |
274 class ClientSocket : public SocketHandle { | 287 class ClientSocket : public SocketHandle { |
275 public: | 288 public: |
276 explicit ClientSocket(SOCKET s) | 289 explicit ClientSocket(SOCKET s) : SocketHandle(s), next_(NULL) { |
277 : SocketHandle(s), | 290 type_ = kClientSocket; |
278 next_(NULL), | 291 } |
279 flags_(0) { type_ = kClientSocket; } | |
280 | 292 |
281 ClientSocket(SOCKET s, Dart_Port port) | 293 ClientSocket(SOCKET s, Dart_Port port) : SocketHandle(s, port), next_(NULL) { |
282 : SocketHandle(s, port), | 294 type_ = kClientSocket; |
283 next_(NULL), | 295 } |
284 flags_(0) { type_ = kClientSocket; } | |
285 | 296 |
286 virtual ~ClientSocket() { | 297 virtual ~ClientSocket() { |
287 // Don't delete this object until all pending requests have been handled. | 298 // Don't delete this object until all pending requests have been handled. |
288 ASSERT(!HasPendingRead()); | 299 ASSERT(!HasPendingRead()); |
289 ASSERT(!HasPendingWrite()); | 300 ASSERT(!HasPendingWrite()); |
290 ASSERT(next_ == NULL); | 301 ASSERT(next_ == NULL); |
291 }; | 302 }; |
292 | 303 |
293 void Shutdown(int how); | 304 void Shutdown(int how); |
294 bool IsClosedRead() { return (flags_ & (1 << kCloseRead)) != 0; } | |
295 bool IsClosedWrite() { return (flags_ & (1 << kCloseWrite)) != 0; } | |
296 | |
297 void MarkClosedRead() { flags_ |= (1 << kCloseRead); } | |
298 void MarkClosedWrite() { flags_ |= (1 << kCloseWrite); } | |
299 | 305 |
300 // Internal interface used by the event handler. | 306 // Internal interface used by the event handler. |
301 virtual bool IssueRead(); | 307 virtual bool IssueRead(); |
302 virtual bool IssueWrite(); | 308 virtual bool IssueWrite(); |
303 | 309 |
304 virtual void EnsureInitialized( | 310 virtual void EnsureInitialized( |
305 EventHandlerImplementation* event_handler); | 311 EventHandlerImplementation* event_handler); |
306 virtual bool IsClosed(); | 312 virtual bool IsClosed(); |
307 | 313 |
308 ClientSocket* next() { return next_; } | 314 ClientSocket* next() { return next_; } |
309 void set_next(ClientSocket* next) { next_ = next; } | 315 void set_next(ClientSocket* next) { next_ = next; } |
310 | 316 |
311 private: | 317 private: |
312 enum Flags { | |
313 kCloseRead = 0, | |
314 kCloseWrite = 1 | |
315 }; | |
316 | |
317 virtual void AfterClose(); | 318 virtual void AfterClose(); |
318 | 319 |
319 ClientSocket* next_; | 320 ClientSocket* next_; |
320 int flags_; | |
321 }; | 321 }; |
322 | 322 |
323 | 323 |
324 // Event handler. | 324 // Event handler. |
325 class EventHandlerImplementation { | 325 class EventHandlerImplementation { |
326 public: | 326 public: |
327 EventHandlerImplementation(); | 327 EventHandlerImplementation(); |
328 virtual ~EventHandlerImplementation() {} | 328 virtual ~EventHandlerImplementation() {} |
329 | 329 |
330 void SendData(intptr_t id, Dart_Port dart_port, intptr_t data); | 330 void SendData(intptr_t id, Dart_Port dart_port, intptr_t data); |
331 void StartEventHandler(); | 331 void StartEventHandler(); |
332 | 332 |
333 DWORD GetTimeout(); | 333 DWORD GetTimeout(); |
334 void HandleInterrupt(InterruptMessage* msg); | 334 void HandleInterrupt(InterruptMessage* msg); |
335 void HandleTimeout(); | 335 void HandleTimeout(); |
336 void HandleAccept(ListenSocket* listen_socket, IOBuffer* buffer); | 336 void HandleAccept(ListenSocket* listen_socket, IOBuffer* buffer); |
337 void HandleClosed(Handle* handle); | 337 void HandleClosed(Handle* handle); |
338 void HandleRead(ClientSocket* client_socket, int bytes, IOBuffer* buffer); | 338 void HandleRead(Handle* handle, int bytes, IOBuffer* buffer); |
339 void HandleWrite(ClientSocket* client_socket, int bytes, IOBuffer* buffer); | 339 void HandleWrite(Handle* handle, int bytes, IOBuffer* buffer); |
340 void HandleClose(ClientSocket* client_socket); | 340 void HandleClose(ClientSocket* client_socket); |
341 void HandleIOCompletion(DWORD bytes, ULONG_PTR key, OVERLAPPED* overlapped); | 341 void HandleIOCompletion(DWORD bytes, ULONG_PTR key, OVERLAPPED* overlapped); |
342 | 342 |
343 HANDLE completion_port() { return completion_port_; } | 343 HANDLE completion_port() { return completion_port_; } |
344 | 344 |
345 private: | 345 private: |
346 ClientSocket* client_sockets_head_; | 346 ClientSocket* client_sockets_head_; |
347 | 347 |
348 int64_t timeout_; // Time for next timeout. | 348 int64_t timeout_; // Time for next timeout. |
349 Dart_Port timeout_port_; | 349 Dart_Port timeout_port_; |
350 HANDLE completion_port_; | 350 HANDLE completion_port_; |
351 }; | 351 }; |
352 | 352 |
353 | 353 |
354 #endif // BIN_EVENTHANDLER_WIN_H_ | 354 #endif // BIN_EVENTHANDLER_WIN_H_ |
OLD | NEW |