blob: adb26fdfa435d677d19cba7e4bc5234fb497d85a [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_DEVELOPER_DEBUG_SHARED_MESSAGE_LOOP_POLL_H_
#define SRC_DEVELOPER_DEBUG_SHARED_MESSAGE_LOOP_POLL_H_
#include <map>
#include <vector>
#include <fbl/unique_fd.h>
#include "src/developer/debug/shared/fd_watcher.h"
#include "src/developer/debug/shared/message_loop.h"
struct pollfd;
namespace debug_ipc {
// This MessageLoop implementation uses the Unix poll() function.
class MessageLoopPoll : public MessageLoop, public FDWatcher {
public:
MessageLoopPoll();
~MessageLoopPoll();
// MessageLoop implementation.
bool Init(std::string* error_message) override;
void Cleanup() override;
WatchHandle WatchFD(WatchMode mode, int fd, FDWatcher* watcher) override;
private:
struct WatchInfo;
// MessageLoop protected implementation.
uint64_t GetMonotonicNowNS() const override;
void RunImpl() override;
void StopWatching(int id) override;
void SetHasTasks() override;
// FDWatcher implementation (for waking up for posted tasks).
void OnFDReady(int fd, bool read, bool write, bool err) override;
// Prepares the pollfd vector with all the handles we will be watching for poll(). The map_indices
// vector will be of the same length and will contain the key into watches_ of each item in the
// pollfd vector.
void ConstructFDMapping(std::vector<pollfd>* poll_vect, std::vector<int>* map_indices) const;
// Called when poll detects an event. The poll event mask is in |events|.
void OnHandleSignaled(int fd, short events, int watch_id);
// Whether the loop is watching a particular id.
bool HasWatch(int watch_id);
// This must only be accessed on the same thread as the message loop, so is not protected by the
// lock.
using WatchMap = std::map<int, WatchInfo>;
WatchMap watches_;
// ID used as an index into watches_.
int next_watch_id_ = 1;
// Pipe used to wake up the message loop for posted events.
fbl::unique_fd wakeup_pipe_out_;
fbl::unique_fd wakeup_pipe_in_;
WatchHandle wakeup_pipe_watch_;
FXL_DISALLOW_COPY_AND_ASSIGN(MessageLoopPoll);
};
} // namespace debug_ipc
#endif // SRC_DEVELOPER_DEBUG_SHARED_MESSAGE_LOOP_POLL_H_