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

Side by Side Diff: runtime/bin/eventhandler_win.h

Issue 12316036: Merge IO v2 branch to bleeding edge (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Rebased to r18818 Created 7 years, 10 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 | « runtime/bin/eventhandler_macos.cc ('k') | runtime/bin/eventhandler_win.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) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 #if !defined(BIN_EVENTHANDLER_H_) 8 #if !defined(BIN_EVENTHANDLER_H_)
9 #error Do not include eventhandler_win.h directly; use eventhandler.h instead. 9 #error Do not include eventhandler_win.h directly; use eventhandler.h instead.
10 #endif 10 #endif
(...skipping 18 matching lines...) Expand all
29 Dart_Port dart_port; 29 Dart_Port dart_port;
30 int64_t data; 30 int64_t data;
31 }; 31 };
32 32
33 33
34 // An IOBuffer encapsulates the OVERLAPPED structure and the 34 // An IOBuffer encapsulates the OVERLAPPED structure and the
35 // associated data buffer. For accept it also contains the pre-created 35 // associated data buffer. For accept it also contains the pre-created
36 // socket for the client. 36 // socket for the client.
37 class IOBuffer { 37 class IOBuffer {
38 public: 38 public:
39 enum Operation { kAccept, kRead, kWrite }; 39 enum Operation { kAccept, kRead, kWrite, kDisconnect };
40 40
41 static IOBuffer* AllocateAcceptBuffer(int buffer_size); 41 static IOBuffer* AllocateAcceptBuffer(int buffer_size);
42 static IOBuffer* AllocateReadBuffer(int buffer_size); 42 static IOBuffer* AllocateReadBuffer(int buffer_size);
43 static IOBuffer* AllocateWriteBuffer(int buffer_size); 43 static IOBuffer* AllocateWriteBuffer(int buffer_size);
44 static IOBuffer* AllocateDisconnectBuffer();
44 static void DisposeBuffer(IOBuffer* buffer); 45 static void DisposeBuffer(IOBuffer* buffer);
45 46
46 // Find the IO buffer from the OVERLAPPED address. 47 // Find the IO buffer from the OVERLAPPED address.
47 static IOBuffer* GetFromOverlapped(OVERLAPPED* overlapped); 48 static IOBuffer* GetFromOverlapped(OVERLAPPED* overlapped);
48 49
49 // Read data from a buffer which has been received. It will read up 50 // Read data from a buffer which has been received. It will read up
50 // to num_bytes bytes of data returning the actual number of bytes 51 // to num_bytes bytes of data returning the actual number of bytes
51 // read. This will update the index of the next byte in the buffer 52 // read. This will update the index of the next byte in the buffer
52 // so calling Read several times will keep returning new data from 53 // so calling Read several times will keep returning new data from
53 // the buffer until all data have been read. 54 // the buffer until all data have been read.
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 171
171 HANDLE handle() { return handle_; } 172 HANDLE handle() { return handle_; }
172 Dart_Port port() { return port_; } 173 Dart_Port port() { return port_; }
173 EventHandlerImplementation* event_handler() { return event_handler_; } 174 EventHandlerImplementation* event_handler() { return event_handler_; }
174 175
175 void Lock(); 176 void Lock();
176 void Unlock(); 177 void Unlock();
177 178
178 bool CreateCompletionPort(HANDLE completion_port); 179 bool CreateCompletionPort(HANDLE completion_port);
179 180
180 void close(); 181 void Close();
182 virtual void DoClose();
181 virtual bool IsClosed() = 0; 183 virtual bool IsClosed() = 0;
182 184
183 void SetPortAndMask(Dart_Port port, intptr_t mask) { 185 void SetPortAndMask(Dart_Port port, intptr_t mask) {
184 port_ = port; 186 port_ = port;
185 mask_ = mask; 187 mask_ = mask;
186 } 188 }
187 Type type() { return type_; } 189 Type type() { return type_; }
188 bool is_file() { return type_ == kFile; } 190 bool is_file() { return type_ == kFile; }
189 bool is_socket() { return type_ == kListenSocket || type_ == kClientSocket; } 191 bool is_socket() { return type_ == kListenSocket || type_ == kClientSocket; }
190 bool is_listen_socket() { return type_ == kListenSocket; } 192 bool is_listen_socket() { return type_ == kListenSocket; }
(...skipping 18 matching lines...) Expand all
209 kClosing = 0, 211 kClosing = 0,
210 kCloseRead = 1, 212 kCloseRead = 1,
211 kCloseWrite = 2, 213 kCloseWrite = 2,
212 kDoesNotSupportOverlappedIO = 3, 214 kDoesNotSupportOverlappedIO = 3,
213 kError = 4 215 kError = 4
214 }; 216 };
215 217
216 explicit Handle(HANDLE handle); 218 explicit Handle(HANDLE handle);
217 Handle(HANDLE handle, Dart_Port port); 219 Handle(HANDLE handle, Dart_Port port);
218 220
219 virtual void AfterClose() = 0;
220 virtual void HandleIssueError(); 221 virtual void HandleIssueError();
221 222
222 Type type_; 223 Type type_;
223 HANDLE handle_; 224 HANDLE handle_;
224 Dart_Port port_; // Dart port to communicate events for this socket. 225 Dart_Port port_; // Dart port to communicate events for this socket.
225 intptr_t mask_; // Mask of events to report through the port. 226 intptr_t mask_; // Mask of events to report through the port.
226 HANDLE completion_port_; 227 HANDLE completion_port_;
227 EventHandlerImplementation* event_handler_; 228 EventHandlerImplementation* event_handler_;
228 229
229 IOBuffer* data_ready_; // IO buffer for data ready to be read. 230 IOBuffer* data_ready_; // IO buffer for data ready to be read.
(...skipping 10 matching lines...) Expand all
240 241
241 class FileHandle : public Handle { 242 class FileHandle : public Handle {
242 public: 243 public:
243 explicit FileHandle(HANDLE handle) 244 explicit FileHandle(HANDLE handle)
244 : Handle(reinterpret_cast<HANDLE>(handle)) { type_ = kFile; } 245 : Handle(reinterpret_cast<HANDLE>(handle)) { type_ = kFile; }
245 FileHandle(HANDLE handle, Dart_Port port) 246 FileHandle(HANDLE handle, Dart_Port port)
246 : Handle(reinterpret_cast<HANDLE>(handle), port) { type_ = kFile; } 247 : Handle(reinterpret_cast<HANDLE>(handle), port) { type_ = kFile; }
247 248
248 virtual void EnsureInitialized(EventHandlerImplementation* event_handler); 249 virtual void EnsureInitialized(EventHandlerImplementation* event_handler);
249 virtual bool IsClosed(); 250 virtual bool IsClosed();
250
251 private:
252 virtual void AfterClose();
253 }; 251 };
254 252
255 253
256 class SocketHandle : public Handle { 254 class SocketHandle : public Handle {
257 public: 255 public:
258 SOCKET socket() { return reinterpret_cast<SOCKET>(handle_); } 256 SOCKET socket() { return reinterpret_cast<SOCKET>(handle_); }
259 257
260 protected: 258 protected:
261 explicit SocketHandle(SOCKET s) : Handle(reinterpret_cast<HANDLE>(s)) {} 259 explicit SocketHandle(SOCKET s) : Handle(reinterpret_cast<HANDLE>(s)) {}
262 SocketHandle(SOCKET s, Dart_Port port) 260 SocketHandle(SOCKET s, Dart_Port port)
(...skipping 14 matching lines...) Expand all
277 type_ = kListenSocket; 275 type_ = kListenSocket;
278 } 276 }
279 virtual ~ListenSocket() { 277 virtual ~ListenSocket() {
280 ASSERT(!HasPendingAccept()); 278 ASSERT(!HasPendingAccept());
281 ASSERT(accepted_head_ == NULL); 279 ASSERT(accepted_head_ == NULL);
282 ASSERT(accepted_tail_ == NULL); 280 ASSERT(accepted_tail_ == NULL);
283 }; 281 };
284 282
285 // Socket interface exposing normal socket operations. 283 // Socket interface exposing normal socket operations.
286 ClientSocket* Accept(); 284 ClientSocket* Accept();
285 bool CanAccept();
287 286
288 // Internal interface used by the event handler. 287 // Internal interface used by the event handler.
289 bool HasPendingAccept() { return pending_accept_count_ > 0; } 288 bool HasPendingAccept() { return pending_accept_count_ > 0; }
290 bool IssueAccept(); 289 bool IssueAccept();
291 void AcceptComplete(IOBuffer* buffer, HANDLE completion_port); 290 void AcceptComplete(IOBuffer* buffer, HANDLE completion_port);
292 291
293 virtual void EnsureInitialized( 292 virtual void EnsureInitialized(
294 EventHandlerImplementation* event_handler); 293 EventHandlerImplementation* event_handler);
294 virtual void DoClose();
295 virtual bool IsClosed(); 295 virtual bool IsClosed();
296 296
297 int pending_accept_count() { return pending_accept_count_; } 297 int pending_accept_count() { return pending_accept_count_; }
298 298
299 private: 299 private:
300 bool LoadAcceptEx(); 300 bool LoadAcceptEx();
301 virtual void AfterClose();
302 301
303 LPFN_ACCEPTEX AcceptEx_; 302 LPFN_ACCEPTEX AcceptEx_;
304 int pending_accept_count_; 303 int pending_accept_count_;
305 // Linked list of accepted connections provided by completion code. Ready to 304 // Linked list of accepted connections provided by completion code. Ready to
306 // be handed over through accept. 305 // be handed over through accept.
307 ClientSocket* accepted_head_; 306 ClientSocket* accepted_head_;
308 ClientSocket* accepted_tail_; 307 ClientSocket* accepted_tail_;
309 }; 308 };
310 309
311 310
312 // Information on connected sockets. 311 // Information on connected sockets.
313 class ClientSocket : public SocketHandle { 312 class ClientSocket : public SocketHandle {
314 public: 313 public:
315 explicit ClientSocket(SOCKET s) : SocketHandle(s), next_(NULL) { 314 explicit ClientSocket(SOCKET s) : SocketHandle(s),
315 DisconnectEx_(NULL),
316 next_(NULL) {
317 LoadDisconnectEx();
316 type_ = kClientSocket; 318 type_ = kClientSocket;
317 } 319 }
318 320
319 ClientSocket(SOCKET s, Dart_Port port) : SocketHandle(s, port), next_(NULL) { 321 ClientSocket(SOCKET s, Dart_Port port) : SocketHandle(s, port),
322 DisconnectEx_(NULL),
323 next_(NULL) {
324 LoadDisconnectEx();
320 type_ = kClientSocket; 325 type_ = kClientSocket;
321 } 326 }
322 327
323 virtual ~ClientSocket() { 328 virtual ~ClientSocket() {
324 // Don't delete this object until all pending requests have been handled. 329 // Don't delete this object until all pending requests have been handled.
325 ASSERT(!HasPendingRead()); 330 ASSERT(!HasPendingRead());
326 ASSERT(!HasPendingWrite()); 331 ASSERT(!HasPendingWrite());
327 ASSERT(next_ == NULL); 332 ASSERT(next_ == NULL);
328 }; 333 };
329 334
330 void Shutdown(int how); 335 void Shutdown(int how);
331 336
332 // Internal interface used by the event handler. 337 // Internal interface used by the event handler.
333 virtual bool IssueRead(); 338 virtual bool IssueRead();
334 virtual bool IssueWrite(); 339 virtual bool IssueWrite();
340 void IssueDisconnect();
341 void DisconnectComplete(IOBuffer* buffer);
335 342
336 virtual void EnsureInitialized( 343 virtual void EnsureInitialized(
337 EventHandlerImplementation* event_handler); 344 EventHandlerImplementation* event_handler);
345 virtual void DoClose();
338 virtual bool IsClosed(); 346 virtual bool IsClosed();
339 347
340 ClientSocket* next() { return next_; } 348 ClientSocket* next() { return next_; }
341 void set_next(ClientSocket* next) { next_ = next; } 349 void set_next(ClientSocket* next) { next_ = next; }
342 350
343 private: 351 private:
344 virtual void AfterClose(); 352 bool LoadDisconnectEx();
345 353
354 LPFN_DISCONNECTEX DisconnectEx_;
346 ClientSocket* next_; 355 ClientSocket* next_;
347 }; 356 };
348 357
349 358
350 // Event handler. 359 // Event handler.
351 class EventHandlerImplementation { 360 class EventHandlerImplementation {
352 public: 361 public:
353 EventHandlerImplementation(); 362 EventHandlerImplementation();
354 virtual ~EventHandlerImplementation() {} 363 virtual ~EventHandlerImplementation() {}
355 364
356 void SendData(intptr_t id, Dart_Port dart_port, int64_t data); 365 void SendData(intptr_t id, Dart_Port dart_port, int64_t data);
357 void Start(); 366 void Start();
358 void Shutdown(); 367 void Shutdown();
359 368
360 static void EventHandlerEntry(uword args); 369 static void EventHandlerEntry(uword args);
361 370
362 DWORD GetTimeout(); 371 DWORD GetTimeout();
363 void HandleInterrupt(InterruptMessage* msg); 372 void HandleInterrupt(InterruptMessage* msg);
364 void HandleTimeout(); 373 void HandleTimeout();
365 void HandleAccept(ListenSocket* listen_socket, IOBuffer* buffer); 374 void HandleAccept(ListenSocket* listen_socket, IOBuffer* buffer);
366 void HandleClosed(Handle* handle); 375 void HandleClosed(Handle* handle);
367 void HandleError(Handle* handle); 376 void HandleError(Handle* handle);
368 void HandleRead(Handle* handle, int bytes, IOBuffer* buffer); 377 void HandleRead(Handle* handle, int bytes, IOBuffer* buffer);
369 void HandleWrite(Handle* handle, int bytes, IOBuffer* buffer); 378 void HandleWrite(Handle* handle, int bytes, IOBuffer* buffer);
370 void HandleClose(ClientSocket* client_socket); 379 void HandleDisconnect(ClientSocket* client_socket,
380 int bytes,
381 IOBuffer* buffer);
371 void HandleIOCompletion(DWORD bytes, ULONG_PTR key, OVERLAPPED* overlapped); 382 void HandleIOCompletion(DWORD bytes, ULONG_PTR key, OVERLAPPED* overlapped);
372 383
373 HANDLE completion_port() { return completion_port_; } 384 HANDLE completion_port() { return completion_port_; }
374 385
375 private: 386 private:
376 ClientSocket* client_sockets_head_; 387 ClientSocket* client_sockets_head_;
377 388
378 int64_t timeout_; // Time for next timeout. 389 int64_t timeout_; // Time for next timeout.
379 Dart_Port timeout_port_; 390 Dart_Port timeout_port_;
380 bool shutdown_; 391 bool shutdown_;
381 HANDLE completion_port_; 392 HANDLE completion_port_;
382 }; 393 };
383 394
384 395
385 #endif // BIN_EVENTHANDLER_WIN_H_ 396 #endif // BIN_EVENTHANDLER_WIN_H_
OLDNEW
« no previous file with comments | « runtime/bin/eventhandler_macos.cc ('k') | runtime/bin/eventhandler_win.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698