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

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

Issue 9186035: Use hash map for event handler file descriptor map (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Addressed comments by ager@ Created 8 years, 11 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
OLDNEW
1 // Copyright (c) 2011, 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_MACOS_H_ 5 #ifndef BIN_EVENTHANDLER_MACOS_H_
6 #define BIN_EVENTHANDLER_MACOS_H_ 6 #define BIN_EVENTHANDLER_MACOS_H_
7 7
8 #include <unistd.h> 8 #include <unistd.h>
9 #include <sys/socket.h> 9 #include <sys/socket.h>
10 10
11 #include "bin/hashmap.h"
11 12
12 class InterruptMessage { 13 class InterruptMessage {
13 public: 14 public:
14 intptr_t id; 15 intptr_t id;
15 Dart_Port dart_port; 16 Dart_Port dart_port;
16 int64_t data; 17 int64_t data;
17 }; 18 };
18 19
19 20
20 enum PortDataFlags { 21 enum PortDataFlags {
21 kClosedRead = 0, 22 kClosedRead = 0,
22 kClosedWrite = 1, 23 kClosedWrite = 1,
23 }; 24 };
24 25
25 26
26 class SocketData { 27 class SocketData {
27 public: 28 public:
29 explicit SocketData(intptr_t fd) : fd_(fd), port_(0), mask_(0), flags_(0) {
30 ASSERT(fd_ != -1);
31 }
32
28 intptr_t GetPollEvents(); 33 intptr_t GetPollEvents();
29 34
30 void Unregister() { 35 void Unregister() {
31 port_ = 0; 36 port_ = 0;
32 mask_ = 0; 37 mask_ = 0;
33 } 38 }
34 39
35 void ShutdownRead() { 40 void ShutdownRead() {
36 shutdown(fd_, SHUT_RD); 41 shutdown(fd_, SHUT_RD);
37 MarkClosedRead(); 42 MarkClosedRead();
38 } 43 }
39 44
40 void ShutdownWrite() { 45 void ShutdownWrite() {
41 shutdown(fd_, SHUT_WR); 46 shutdown(fd_, SHUT_WR);
42 MarkClosedWrite(); 47 MarkClosedWrite();
43 } 48 }
44 49
45 void Close() { 50 void Close() {
46 Unregister(); 51 Unregister();
47 flags_ = 0; 52 flags_ = 0;
48 close(fd_); 53 close(fd_);
49 fd_ = 0; 54 fd_ = -1;
50 } 55 }
51 56
52 bool IsListeningSocket() { return (mask_ & (1 << kListeningSocket)) != 0; } 57 bool IsListeningSocket() { return (mask_ & (1 << kListeningSocket)) != 0; }
53 bool IsPipe() { return (mask_ & (1 << kPipe)) != 0; } 58 bool IsPipe() { return (mask_ & (1 << kPipe)) != 0; }
54 bool IsClosedRead() { return (flags_ & (1 << kClosedRead)) != 0; } 59 bool IsClosedRead() { return (flags_ & (1 << kClosedRead)) != 0; }
55 bool IsClosedWrite() { return (flags_ & (1 << kClosedWrite)) != 0; } 60 bool IsClosedWrite() { return (flags_ & (1 << kClosedWrite)) != 0; }
56 61
57 void MarkClosedRead() { flags_ |= (1 << kClosedRead); } 62 void MarkClosedRead() { flags_ |= (1 << kClosedRead); }
58 void MarkClosedWrite() { flags_ |= (1 << kClosedWrite); } 63 void MarkClosedWrite() { flags_ |= (1 << kClosedWrite); }
59 64
60 bool HasPollEvents() { return mask_ != 0; } 65 bool HasPollEvents() { return mask_ != 0; }
61 66
62 void SetPortAndMask(Dart_Port port, intptr_t mask) { 67 void SetPortAndMask(Dart_Port port, intptr_t mask) {
68 ASSERT(fd_ != -1);
63 port_ = port; 69 port_ = port;
64 mask_ = mask; 70 mask_ = mask;
65 } 71 }
66 72
67 intptr_t fd() { return fd_; } 73 intptr_t fd() { return fd_; }
68 void set_fd(intptr_t fd) { fd_ = fd; }
69 Dart_Port port() { return port_; } 74 Dart_Port port() { return port_; }
70 intptr_t mask() { return mask_; } 75 intptr_t mask() { return mask_; }
71 76
72 private: 77 private:
73 intptr_t fd_; 78 intptr_t fd_;
74 Dart_Port port_; 79 Dart_Port port_;
75 intptr_t mask_; 80 intptr_t mask_;
76 intptr_t flags_; 81 intptr_t flags_;
77 }; 82 };
78 83
(...skipping 11 matching lines...) Expand all
90 intptr_t GetTimeout(); 95 intptr_t GetTimeout();
91 bool GetInterruptMessage(InterruptMessage* msg); 96 bool GetInterruptMessage(InterruptMessage* msg);
92 struct pollfd* GetPollFds(intptr_t* size); 97 struct pollfd* GetPollFds(intptr_t* size);
93 void HandleEvents(struct pollfd* pollfds, int pollfds_size, int result_size); 98 void HandleEvents(struct pollfd* pollfds, int pollfds_size, int result_size);
94 void HandleTimeout(); 99 void HandleTimeout();
95 static void* Poll(void* args); 100 static void* Poll(void* args);
96 void WakeupHandler(intptr_t id, Dart_Port dart_port, int64_t data); 101 void WakeupHandler(intptr_t id, Dart_Port dart_port, int64_t data);
97 void HandleInterruptFd(); 102 void HandleInterruptFd();
98 void SetPort(intptr_t fd, Dart_Port dart_port, intptr_t mask); 103 void SetPort(intptr_t fd, Dart_Port dart_port, intptr_t mask);
99 intptr_t GetPollEvents(struct pollfd* pollfd); 104 intptr_t GetPollEvents(struct pollfd* pollfd);
105 static void* GetHashmapKeyFromFd(intptr_t fd);
106 static uint32_t GetHashmapHashFromFd(intptr_t fd);
100 107
101 SocketData* socket_map_; 108 HashMap socket_map_;
102 intptr_t socket_map_size_;
103 int64_t timeout_; // Time for next timeout. 109 int64_t timeout_; // Time for next timeout.
104 Dart_Port timeout_port_; 110 Dart_Port timeout_port_;
105 int interrupt_fds_[2]; 111 int interrupt_fds_[2];
106 }; 112 };
107 113
108 114
109 #endif // BIN_EVENTHANDLER_MACOS_H_ 115 #endif // BIN_EVENTHANDLER_MACOS_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698