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

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

Issue 8399039: Explicitly handle listen sockets and connection sockets differently in Linux and Mac OS eventhandler (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fix Mac OS build Created 9 years, 1 month 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.h ('k') | runtime/bin/socket_impl.dart » ('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) 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 #include <errno.h> 5 #include <errno.h>
6 #include <poll.h> 6 #include <poll.h>
7 #include <pthread.h> 7 #include <pthread.h>
8 #include <stdio.h> 8 #include <stdio.h>
9 #include <string.h> 9 #include <string.h>
10 #include <sys/time.h> 10 #include <sys/time.h>
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 51
52 EventHandlerImplementation::~EventHandlerImplementation() { 52 EventHandlerImplementation::~EventHandlerImplementation() {
53 free(port_map_); 53 free(port_map_);
54 close(interrupt_fds_[0]); 54 close(interrupt_fds_[0]);
55 close(interrupt_fds_[1]); 55 close(interrupt_fds_[1]);
56 } 56 }
57 57
58 58
59 // TODO(hpayer): Use hash table instead of array. 59 // TODO(hpayer): Use hash table instead of array.
60 void EventHandlerImplementation::SetPort(intptr_t fd, 60 void EventHandlerImplementation::SetPort(intptr_t fd,
61 Dart_Port dart_port, 61 Dart_Port dart_port,
62 intptr_t mask) { 62 intptr_t mask) {
63 ASSERT(fd >= 0); 63 ASSERT(fd >= 0);
64 if (fd >= port_map_size_) { 64 if (fd >= port_map_size_) {
65 intptr_t new_port_map_size = port_map_size_; 65 intptr_t new_port_map_size = port_map_size_;
66 do { 66 do {
67 new_port_map_size = new_port_map_size * kPortMapGrowingFactor; 67 new_port_map_size = new_port_map_size * kPortMapGrowingFactor;
68 } while (fd >= new_port_map_size); 68 } while (fd >= new_port_map_size);
69 size_t new_port_map_bytes = new_port_map_size * sizeof(PortData); 69 size_t new_port_map_bytes = new_port_map_size * sizeof(PortData);
70 port_map_ = reinterpret_cast<PortData*>(realloc(port_map_, 70 port_map_ = reinterpret_cast<PortData*>(realloc(port_map_,
71 new_port_map_bytes)); 71 new_port_map_bytes));
72 ASSERT(port_map_ != NULL); 72 ASSERT(port_map_ != NULL);
(...skipping 16 matching lines...) Expand all
89 port_map_[fd].dart_port = dart_port; 89 port_map_[fd].dart_port = dart_port;
90 port_map_[fd].mask = mask; 90 port_map_[fd].mask = mask;
91 } 91 }
92 92
93 93
94 Dart_Port EventHandlerImplementation::PortFor(intptr_t fd) { 94 Dart_Port EventHandlerImplementation::PortFor(intptr_t fd) {
95 return port_map_[fd].dart_port; 95 return port_map_[fd].dart_port;
96 } 96 }
97 97
98 98
99 bool EventHandlerImplementation::IsListeningSocket(intptr_t fd) {
100 return (port_map_[fd].mask & (1 << kListeningSocket)) != 0;
101 }
102
103
99 void EventHandlerImplementation::RegisterFdWakeup(intptr_t id, 104 void EventHandlerImplementation::RegisterFdWakeup(intptr_t id,
100 Dart_Port dart_port, 105 Dart_Port dart_port,
101 intptr_t data) { 106 intptr_t data) {
102 WakeupHandler(id, dart_port, data); 107 WakeupHandler(id, dart_port, data);
103 } 108 }
104 109
105 110
106 void EventHandlerImplementation::CloseFd(intptr_t id) { 111 void EventHandlerImplementation::CloseFd(intptr_t id) {
107 SetPort(id, 0, 0); 112 SetPort(id, 0, 0);
108 close(id); 113 close(id);
(...skipping 20 matching lines...) Expand all
129 intptr_t result = 134 intptr_t result =
130 write(interrupt_fds_[1], &msg, kInterruptMessageSize); 135 write(interrupt_fds_[1], &msg, kInterruptMessageSize);
131 if (result != kInterruptMessageSize) { 136 if (result != kInterruptMessageSize) {
132 perror("Interrupt message failure"); 137 perror("Interrupt message failure");
133 } 138 }
134 } 139 }
135 140
136 141
137 void EventHandlerImplementation::SetPollEvents(struct pollfd* pollfds, 142 void EventHandlerImplementation::SetPollEvents(struct pollfd* pollfds,
138 intptr_t mask) { 143 intptr_t mask) {
139 /* 144 // Do not ask for POLLERR and POLLHUP explicitly as they are
140 * We do not set POLLERR and POLLHUP explicitly since they are triggered 145 // triggered anyway.
141 * anyway.
142 */
143 if ((mask & (1 << kInEvent)) != 0) { 146 if ((mask & (1 << kInEvent)) != 0) {
144 pollfds->events |= POLLIN; 147 pollfds->events |= POLLIN;
145 } 148 }
146 if ((mask & (1 << kOutEvent)) != 0) { 149 if ((mask & (1 << kOutEvent)) != 0) {
147 pollfds->events |= POLLOUT; 150 pollfds->events |= POLLOUT;
148 } 151 }
149 } 152 }
150 153
151 154
152 struct pollfd* EventHandlerImplementation::GetPollFds(intptr_t* pollfds_size) { 155 struct pollfd* EventHandlerImplementation::GetPollFds(intptr_t* pollfds_size) {
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 CloseFd(msg.id); 208 CloseFd(msg.id);
206 } else { 209 } else {
207 SetPort(msg.id, msg.dart_port, msg.data); 210 SetPort(msg.id, msg.dart_port, msg.data);
208 } 211 }
209 } 212 }
210 } 213 }
211 214
212 215
213 intptr_t EventHandlerImplementation::GetPollEvents(struct pollfd* pollfd) { 216 intptr_t EventHandlerImplementation::GetPollEvents(struct pollfd* pollfd) {
214 intptr_t event_mask = 0; 217 intptr_t event_mask = 0;
215 /* 218 if (IsListeningSocket(pollfd->fd)) {
216 * We prioritize the events in the following order. 219 // For listening sockets the POLLIN event indicate that there are
217 */ 220 // connections ready for accept unless accompanied with one of the
218 if ((pollfd->revents & POLLIN) != 0) { 221 // other flags.
219 if (FDUtils::AvailableBytes(pollfd->fd) != 0) { 222 if ((pollfd->revents & POLLIN) != 0) {
220 event_mask = (1 << kInEvent); 223 if ((pollfd->revents & POLLHUP) != 0) event_mask |= (1 << kCloseEvent);
221 } else if ((pollfd->revents & POLLHUP) != 0) { 224 if ((pollfd->revents & POLLERR) != 0) event_mask |= (1 << kErrorEvent);
222 event_mask = (1 << kCloseEvent); 225 if (event_mask == 0) event_mask |= (1 << kInEvent);
223 } else if ((pollfd->revents & POLLERR) != 0) {
224 event_mask = (1 << kErrorEvent);
225 } else {
226 /*
227 * Accept event.
228 */
229 event_mask = (1 << kInEvent);
230 } 226 }
231 } 227 } else {
228 // Prioritize data events over close and error events.
229 if ((pollfd->revents & POLLIN) != 0) {
230 if (FDUtils::AvailableBytes(pollfd->fd) != 0) {
231 event_mask = (1 << kInEvent);
232 } else if ((pollfd->revents & POLLHUP) != 0) {
233 event_mask = (1 << kCloseEvent);
234 } else if ((pollfd->revents & POLLERR) != 0) {
235 event_mask = (1 << kErrorEvent);
236 }
237 }
232 238
233 if ((pollfd->revents & POLLOUT) != 0) { 239 if ((pollfd->revents & POLLOUT) != 0) event_mask |= (1 << kOutEvent);
234 event_mask |= (1 << kOutEvent);
235 } 240 }
236 241
237 return event_mask; 242 return event_mask;
238 } 243 }
239 244
240 245
241 void EventHandlerImplementation::HandleEvents(struct pollfd* pollfds, 246 void EventHandlerImplementation::HandleEvents(struct pollfd* pollfds,
242 int pollfds_size, 247 int pollfds_size,
243 int result_size) { 248 int result_size) {
244 if ((pollfds[0].revents & POLLIN) != 0) { 249 if ((pollfds[0].revents & POLLIN) != 0) {
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
316 FATAL("Create start event handler thread"); 321 FATAL("Create start event handler thread");
317 } 322 }
318 } 323 }
319 324
320 325
321 void EventHandlerImplementation::SendData(intptr_t id, 326 void EventHandlerImplementation::SendData(intptr_t id,
322 Dart_Port dart_port, 327 Dart_Port dart_port,
323 intptr_t data) { 328 intptr_t data) {
324 RegisterFdWakeup(id, dart_port, data); 329 RegisterFdWakeup(id, dart_port, data);
325 } 330 }
OLDNEW
« no previous file with comments | « runtime/bin/eventhandler_macos.h ('k') | runtime/bin/socket_impl.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698