OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/message_loop/message_pump_fuchsia.h" | 5 #include "base/message_loop/message_pump_fuchsia.h" |
6 | 6 |
7 #include <magenta/syscalls.h> | 7 #include <magenta/syscalls.h> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 | 10 |
(...skipping 10 matching lines...) Expand all Loading... |
21 __mxio_release(io_); | 21 __mxio_release(io_); |
22 if (was_destroyed_) { | 22 if (was_destroyed_) { |
23 DCHECK(!*was_destroyed_); | 23 DCHECK(!*was_destroyed_); |
24 *was_destroyed_ = true; | 24 *was_destroyed_ = true; |
25 } | 25 } |
26 } | 26 } |
27 | 27 |
28 bool MessagePumpFuchsia::FileDescriptorWatcher::StopWatchingFileDescriptor() { | 28 bool MessagePumpFuchsia::FileDescriptorWatcher::StopWatchingFileDescriptor() { |
29 uint64_t controller_as_key = | 29 uint64_t controller_as_key = |
30 static_cast<uint64_t>(reinterpret_cast<uintptr_t>(this)); | 30 static_cast<uint64_t>(reinterpret_cast<uintptr_t>(this)); |
31 return mx_port_cancel(port_, handle_, controller_as_key) == NO_ERROR; | 31 return mx_port_cancel(port_, handle_, controller_as_key) == MX_OK; |
32 } | 32 } |
33 | 33 |
34 MessagePumpFuchsia::MessagePumpFuchsia() : keep_running_(true) { | 34 MessagePumpFuchsia::MessagePumpFuchsia() : keep_running_(true) { |
35 CHECK(mx_port_create(MX_PORT_OPT_V2, &port_) == NO_ERROR); | 35 CHECK(mx_port_create(MX_PORT_OPT_V2, &port_) == MX_OK); |
36 } | 36 } |
37 | 37 |
38 MessagePumpFuchsia::~MessagePumpFuchsia() { | 38 MessagePumpFuchsia::~MessagePumpFuchsia() { |
39 mx_status_t status = mx_handle_close(port_); | 39 mx_status_t status = mx_handle_close(port_); |
40 if (status != NO_ERROR) { | 40 if (status != MX_OK) { |
41 DLOG(ERROR) << "mx_handle_close failed: " << status; | 41 DLOG(ERROR) << "mx_handle_close failed: " << status; |
42 } | 42 } |
43 } | 43 } |
44 | 44 |
45 bool MessagePumpFuchsia::WatchFileDescriptor(int fd, | 45 bool MessagePumpFuchsia::WatchFileDescriptor(int fd, |
46 bool persistent, | 46 bool persistent, |
47 int mode, | 47 int mode, |
48 FileDescriptorWatcher* controller, | 48 FileDescriptorWatcher* controller, |
49 Watcher* delegate) { | 49 Watcher* delegate) { |
50 DCHECK_GE(fd, 0); | 50 DCHECK_GE(fd, 0); |
(...skipping 30 matching lines...) Expand all Loading... |
81 __mxio_wait_begin(controller->io_, events, &controller->handle_, &signals); | 81 __mxio_wait_begin(controller->io_, events, &controller->handle_, &signals); |
82 if (controller->handle_ == MX_HANDLE_INVALID) | 82 if (controller->handle_ == MX_HANDLE_INVALID) |
83 return false; | 83 return false; |
84 controller->port_ = port_; | 84 controller->port_ = port_; |
85 | 85 |
86 uint64_t controller_as_key = | 86 uint64_t controller_as_key = |
87 static_cast<uint64_t>(reinterpret_cast<uintptr_t>(controller)); | 87 static_cast<uint64_t>(reinterpret_cast<uintptr_t>(controller)); |
88 mx_status_t status = | 88 mx_status_t status = |
89 mx_object_wait_async(controller->handle_, port_, controller_as_key, | 89 mx_object_wait_async(controller->handle_, port_, controller_as_key, |
90 signals, MX_WAIT_ASYNC_ONCE); | 90 signals, MX_WAIT_ASYNC_ONCE); |
91 if (status != NO_ERROR) { | 91 if (status != MX_OK) { |
92 DLOG(ERROR) << "mx_object_wait_async failed: " << status; | 92 DLOG(ERROR) << "mx_object_wait_async failed: " << status; |
93 return false; | 93 return false; |
94 } | 94 } |
95 return true; | 95 return true; |
96 } | 96 } |
97 | 97 |
98 void MessagePumpFuchsia::Run(Delegate* delegate) { | 98 void MessagePumpFuchsia::Run(Delegate* delegate) { |
99 DCHECK(keep_running_); | 99 DCHECK(keep_running_); |
100 | 100 |
101 for (;;) { | 101 for (;;) { |
(...skipping 14 matching lines...) Expand all Loading... |
116 | 116 |
117 if (did_work) | 117 if (did_work) |
118 continue; | 118 continue; |
119 | 119 |
120 mx_time_t deadline = delayed_work_time_.is_null() | 120 mx_time_t deadline = delayed_work_time_.is_null() |
121 ? MX_TIME_INFINITE | 121 ? MX_TIME_INFINITE |
122 : mx_time_get(MX_CLOCK_MONOTONIC) + | 122 : mx_time_get(MX_CLOCK_MONOTONIC) + |
123 delayed_work_time_.ToInternalValue(); | 123 delayed_work_time_.ToInternalValue(); |
124 mx_port_packet_t packet; | 124 mx_port_packet_t packet; |
125 const mx_status_t wait_status = mx_port_wait(port_, deadline, &packet, 0); | 125 const mx_status_t wait_status = mx_port_wait(port_, deadline, &packet, 0); |
126 if (wait_status != NO_ERROR && wait_status != ERR_TIMED_OUT) { | 126 if (wait_status != MX_OK && wait_status != MX_ERR_TIMED_OUT) { |
127 NOTREACHED() << "unexpected wait status: " << wait_status; | 127 NOTREACHED() << "unexpected wait status: " << wait_status; |
128 continue; | 128 continue; |
129 } | 129 } |
130 | 130 |
131 if (packet.type == MX_PKT_TYPE_SIGNAL_ONE) { | 131 if (packet.type == MX_PKT_TYPE_SIGNAL_ONE) { |
132 // A watched fd caused the wakeup via mx_object_wait_async(). | 132 // A watched fd caused the wakeup via mx_object_wait_async(). |
133 DCHECK(packet.status == NO_ERROR); | 133 DCHECK(packet.status == MX_OK); |
134 FileDescriptorWatcher* controller = | 134 FileDescriptorWatcher* controller = |
135 reinterpret_cast<FileDescriptorWatcher*>( | 135 reinterpret_cast<FileDescriptorWatcher*>( |
136 static_cast<uintptr_t>(packet.key)); | 136 static_cast<uintptr_t>(packet.key)); |
137 | 137 |
138 DCHECK(packet.signal.trigger & packet.signal.observed); | 138 DCHECK(packet.signal.trigger & packet.signal.observed); |
139 | 139 |
140 uint32_t events; | 140 uint32_t events; |
141 __mxio_wait_end(controller->io_, packet.signal.observed, &events); | 141 __mxio_wait_end(controller->io_, packet.signal.observed, &events); |
142 // .observed can include other spurious things, in particular, that the fd | 142 // .observed can include other spurious things, in particular, that the fd |
143 // is writable, when we only asked to know when it was readable. In that | 143 // is writable, when we only asked to know when it was readable. In that |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
178 void MessagePumpFuchsia::Quit() { | 178 void MessagePumpFuchsia::Quit() { |
179 keep_running_ = false; | 179 keep_running_ = false; |
180 } | 180 } |
181 | 181 |
182 void MessagePumpFuchsia::ScheduleWork() { | 182 void MessagePumpFuchsia::ScheduleWork() { |
183 // Since this can be called on any thread, we need to ensure that our Run loop | 183 // Since this can be called on any thread, we need to ensure that our Run loop |
184 // wakes up. | 184 // wakes up. |
185 mx_port_packet_t packet = {}; | 185 mx_port_packet_t packet = {}; |
186 packet.type = MX_PKT_TYPE_USER; | 186 packet.type = MX_PKT_TYPE_USER; |
187 mx_status_t status = mx_port_queue(port_, &packet, 0); | 187 mx_status_t status = mx_port_queue(port_, &packet, 0); |
188 if (status != NO_ERROR) { | 188 if (status != MX_OK) { |
189 DLOG(ERROR) << "mx_port_queue failed: " << status; | 189 DLOG(ERROR) << "mx_port_queue failed: " << status; |
190 } | 190 } |
191 } | 191 } |
192 | 192 |
193 void MessagePumpFuchsia::ScheduleDelayedWork( | 193 void MessagePumpFuchsia::ScheduleDelayedWork( |
194 const TimeTicks& delayed_work_time) { | 194 const TimeTicks& delayed_work_time) { |
195 // We know that we can't be blocked right now since this method can only be | 195 // We know that we can't be blocked right now since this method can only be |
196 // called on the same thread as Run, so we only need to update our record of | 196 // called on the same thread as Run, so we only need to update our record of |
197 // how long to sleep when we do sleep. | 197 // how long to sleep when we do sleep. |
198 delayed_work_time_ = delayed_work_time; | 198 delayed_work_time_ = delayed_work_time; |
199 } | 199 } |
200 | 200 |
201 } // namespace base | 201 } // namespace base |
OLD | NEW |