| OLD | NEW |
| 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 #include "platform/globals.h" | 5 #include "platform/globals.h" |
| 6 #if defined(TARGET_OS_ANDROID) | 6 #if defined(TARGET_OS_ANDROID) |
| 7 | 7 |
| 8 #include "bin/eventhandler.h" | 8 #include "bin/eventhandler.h" |
| 9 | 9 |
| 10 #include <errno.h> // NOLINT | 10 #include <errno.h> // NOLINT |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 49 } | 49 } |
| 50 if ((mask_ & (1 << kOutEvent)) != 0) { | 50 if ((mask_ & (1 << kOutEvent)) != 0) { |
| 51 events |= EPOLLOUT; | 51 events |= EPOLLOUT; |
| 52 } | 52 } |
| 53 return events; | 53 return events; |
| 54 } | 54 } |
| 55 | 55 |
| 56 | 56 |
| 57 // Unregister the file descriptor for a SocketData structure with epoll. | 57 // Unregister the file descriptor for a SocketData structure with epoll. |
| 58 static void RemoveFromEpollInstance(intptr_t epoll_fd_, SocketData* sd) { | 58 static void RemoveFromEpollInstance(intptr_t epoll_fd_, SocketData* sd) { |
| 59 VOID_TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_, | 59 VOID_NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_, |
| 60 EPOLL_CTL_DEL, | 60 EPOLL_CTL_DEL, |
| 61 sd->fd(), | 61 sd->fd(), |
| 62 NULL)); | 62 NULL)); |
| 63 } | 63 } |
| 64 | 64 |
| 65 | 65 |
| 66 static void AddToEpollInstance(intptr_t epoll_fd_, SocketData* sd) { | 66 static void AddToEpollInstance(intptr_t epoll_fd_, SocketData* sd) { |
| 67 struct epoll_event event; | 67 struct epoll_event event; |
| 68 event.events = sd->GetPollEvents(); | 68 event.events = sd->GetPollEvents(); |
| 69 event.data.ptr = sd; | 69 event.data.ptr = sd; |
| 70 int status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_, | 70 int status = NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_, |
| 71 EPOLL_CTL_ADD, | 71 EPOLL_CTL_ADD, |
| 72 sd->fd(), | 72 sd->fd(), |
| 73 &event)); | 73 &event)); |
| 74 if (status == -1) { | 74 if (status == -1) { |
| 75 // Epoll does not accept the file descriptor. It could be due to | 75 // Epoll does not accept the file descriptor. It could be due to |
| 76 // already closed file descriptor, or unuspported devices, such | 76 // already closed file descriptor, or unuspported devices, such |
| 77 // as /dev/null. In such case, mark the file descriptor as closed, | 77 // as /dev/null. In such case, mark the file descriptor as closed, |
| 78 // so dart will handle it accordingly. | 78 // so dart will handle it accordingly. |
| 79 DartUtils::PostInt32(sd->port(), 1 << kCloseEvent); | 79 DartUtils::PostInt32(sd->port(), 1 << kCloseEvent); |
| 80 } | 80 } |
| 81 } | 81 } |
| 82 | 82 |
| 83 | 83 |
| 84 EventHandlerImplementation::EventHandlerImplementation() | 84 EventHandlerImplementation::EventHandlerImplementation() |
| 85 : socket_map_(&HashMap::SamePointerValue, 16) { | 85 : socket_map_(&HashMap::SamePointerValue, 16) { |
| 86 intptr_t result; | 86 intptr_t result; |
| 87 result = TEMP_FAILURE_RETRY(pipe(interrupt_fds_)); | 87 result = NO_RETRY_EXPECTED(pipe(interrupt_fds_)); |
| 88 if (result != 0) { | 88 if (result != 0) { |
| 89 FATAL("Pipe creation failed"); | 89 FATAL("Pipe creation failed"); |
| 90 } | 90 } |
| 91 FDUtils::SetNonBlocking(interrupt_fds_[0]); | 91 FDUtils::SetNonBlocking(interrupt_fds_[0]); |
| 92 FDUtils::SetCloseOnExec(interrupt_fds_[0]); | 92 FDUtils::SetCloseOnExec(interrupt_fds_[0]); |
| 93 FDUtils::SetCloseOnExec(interrupt_fds_[1]); | 93 FDUtils::SetCloseOnExec(interrupt_fds_[1]); |
| 94 shutdown_ = false; | 94 shutdown_ = false; |
| 95 // The initial size passed to epoll_create is ignore on newer (>= | 95 // The initial size passed to epoll_create is ignore on newer (>= |
| 96 // 2.6.8) Linux versions | 96 // 2.6.8) Linux versions |
| 97 static const int kEpollInitialSize = 64; | 97 static const int kEpollInitialSize = 64; |
| 98 epoll_fd_ = TEMP_FAILURE_RETRY(epoll_create(kEpollInitialSize)); | 98 epoll_fd_ = NO_RETRY_EXPECTED(epoll_create(kEpollInitialSize)); |
| 99 if (epoll_fd_ == -1) { | 99 if (epoll_fd_ == -1) { |
| 100 FATAL("Failed creating epoll file descriptor"); | 100 FATAL("Failed creating epoll file descriptor"); |
| 101 } | 101 } |
| 102 FDUtils::SetCloseOnExec(epoll_fd_); | 102 FDUtils::SetCloseOnExec(epoll_fd_); |
| 103 // Register the interrupt_fd with the epoll instance. | 103 // Register the interrupt_fd with the epoll instance. |
| 104 struct epoll_event event; | 104 struct epoll_event event; |
| 105 event.events = EPOLLIN; | 105 event.events = EPOLLIN; |
| 106 event.data.ptr = NULL; | 106 event.data.ptr = NULL; |
| 107 int status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_, | 107 int status = NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_, |
| 108 EPOLL_CTL_ADD, | 108 EPOLL_CTL_ADD, |
| 109 interrupt_fds_[0], | 109 interrupt_fds_[0], |
| 110 &event)); | 110 &event)); |
| 111 if (status == -1) { | 111 if (status == -1) { |
| 112 FATAL("Failed adding interrupt fd to epoll instance"); | 112 FATAL("Failed adding interrupt fd to epoll instance"); |
| 113 } | 113 } |
| 114 } | 114 } |
| 115 | 115 |
| 116 | 116 |
| 117 EventHandlerImplementation::~EventHandlerImplementation() { | 117 EventHandlerImplementation::~EventHandlerImplementation() { |
| 118 TEMP_FAILURE_RETRY(close(interrupt_fds_[0])); | 118 VOID_TEMP_FAILURE_RETRY(close(interrupt_fds_[0])); |
| 119 TEMP_FAILURE_RETRY(close(interrupt_fds_[1])); | 119 VOID_TEMP_FAILURE_RETRY(close(interrupt_fds_[1])); |
| 120 } | 120 } |
| 121 | 121 |
| 122 | 122 |
| 123 SocketData* EventHandlerImplementation::GetSocketData(intptr_t fd) { | 123 SocketData* EventHandlerImplementation::GetSocketData(intptr_t fd) { |
| 124 ASSERT(fd >= 0); | 124 ASSERT(fd >= 0); |
| 125 HashMap::Entry* entry = socket_map_.Lookup( | 125 HashMap::Entry* entry = socket_map_.Lookup( |
| 126 GetHashmapKeyFromFd(fd), GetHashmapHashFromFd(fd), true); | 126 GetHashmapKeyFromFd(fd), GetHashmapHashFromFd(fd), true); |
| 127 ASSERT(entry != NULL); | 127 ASSERT(entry != NULL); |
| 128 SocketData* sd = reinterpret_cast<SocketData*>(entry->value); | 128 SocketData* sd = reinterpret_cast<SocketData*>(entry->value); |
| 129 if (sd == NULL) { | 129 if (sd == NULL) { |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 345 | 345 |
| 346 uint32_t EventHandlerImplementation::GetHashmapHashFromFd(intptr_t fd) { | 346 uint32_t EventHandlerImplementation::GetHashmapHashFromFd(intptr_t fd) { |
| 347 // The hashmap does not support keys with value 0. | 347 // The hashmap does not support keys with value 0. |
| 348 return dart::Utils::WordHash(fd + 1); | 348 return dart::Utils::WordHash(fd + 1); |
| 349 } | 349 } |
| 350 | 350 |
| 351 } // namespace bin | 351 } // namespace bin |
| 352 } // namespace dart | 352 } // namespace dart |
| 353 | 353 |
| 354 #endif // defined(TARGET_OS_ANDROID) | 354 #endif // defined(TARGET_OS_ANDROID) |
| OLD | NEW |