Index: runtime/bin/eventhandler_fuchsia.h |
diff --git a/runtime/bin/eventhandler_fuchsia.h b/runtime/bin/eventhandler_fuchsia.h |
index 013099232471828b81db8bac0a791805bc5f5cef..b168c6208be4d2f1cdebf02feaed9ca58c644931 100644 |
--- a/runtime/bin/eventhandler_fuchsia.h |
+++ b/runtime/bin/eventhandler_fuchsia.h |
@@ -9,11 +9,82 @@ |
#error Do not include eventhandler_fuchsia.h directly; use eventhandler.h instead. |
#endif |
+#include <errno.h> |
#include <magenta/syscalls.h> |
+#include "platform/signal_blocker.h" |
+ |
namespace dart { |
namespace bin { |
+class DescriptorInfo : public DescriptorInfoBase { |
+ public: |
+ explicit DescriptorInfo(intptr_t fd) : DescriptorInfoBase(fd) { } |
+ |
+ virtual ~DescriptorInfo() { } |
+ |
+ virtual void Close() { |
+ VOID_TEMP_FAILURE_RETRY(close(fd_)); |
+ fd_ = -1; |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(DescriptorInfo); |
+}; |
+ |
+class DescriptorInfoSingle |
+ : public DescriptorInfoSingleMixin<DescriptorInfo> { |
+ public: |
+ explicit DescriptorInfoSingle(intptr_t fd) |
+ : DescriptorInfoSingleMixin(fd, false) {} |
+ virtual ~DescriptorInfoSingle() {} |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(DescriptorInfoSingle); |
+}; |
+ |
+class DescriptorInfoMultiple |
+ : public DescriptorInfoMultipleMixin<DescriptorInfo> { |
+ public: |
+ explicit DescriptorInfoMultiple(intptr_t fd) |
+ : DescriptorInfoMultipleMixin(fd, false) {} |
+ virtual ~DescriptorInfoMultiple() {} |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(DescriptorInfoMultiple); |
+}; |
+ |
+// Information needed to call mx_handle_wait_many(), and to handle events. |
+class MagentaWaitManyInfo { |
+ public: |
+ MagentaWaitManyInfo(); |
+ ~MagentaWaitManyInfo(); |
+ |
+ intptr_t capacity() const { return capacity_; } |
+ intptr_t size() const { return size_; } |
+ DescriptorInfo** descriptor_infos() const { return descriptor_infos_; } |
+ mx_handle_t* handles() const { return handles_; } |
+ mx_signals_t* signals() const { return signals_; } |
+ mx_signals_state_t* signals_states() const { return signals_states_; } |
+ |
+ void AddHandle(mx_handle_t handle, mx_signals_t signals, DescriptorInfo* di); |
+ void RemoveHandle(mx_handle_t handle); |
+ |
+ private: |
+ static const intptr_t kInitialCapacity = 32; |
+ |
+ void GrowArraysIfNeeded(intptr_t desired_size); |
+ |
+ intptr_t capacity_; |
+ intptr_t size_; |
+ DescriptorInfo** descriptor_infos_; |
+ mx_handle_t* handles_; |
+ mx_signals_t* signals_; |
+ mx_signals_state_t* signals_states_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(MagentaWaitManyInfo); |
+}; |
+ |
class EventHandlerImplementation { |
public: |
EventHandlerImplementation(); |
@@ -23,6 +94,8 @@ class EventHandlerImplementation { |
void Start(EventHandler* handler); |
void Shutdown(); |
+ const MagentaWaitManyInfo& info() const { return info_; } |
+ |
private: |
int64_t GetTimeout() const; |
void HandleEvents(); |
@@ -35,6 +108,8 @@ class EventHandlerImplementation { |
bool shutdown_; |
mx_handle_t interrupt_handles_[2]; |
+ MagentaWaitManyInfo info_; |
+ |
DISALLOW_COPY_AND_ASSIGN(EventHandlerImplementation); |
}; |