blob: 2ab9b57473e7e94c8119596910cb25cb8696c7d7 [file] [log] [blame]
// Copyright 2021 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_LINUX_H_
#define SRC_DEVELOPER_DEBUG_SHARED_MESSAGE_LOOP_LINUX_H_
#include <sys/types.h>
#include "src/developer/debug/shared/message_loop_poll.h"
namespace debug {
// Extension on MessageLoopPool that adds Linux-specific functionality.
class MessageLoopLinux : public MessageLoopPoll {
public:
MessageLoopLinux();
~MessageLoopLinux() override;
// Returns the current message loop or null if there isn't one. This is like
// MessageLoop::Current() but specifically returns the Linux one.
static MessageLoopLinux* Current();
// MessageLoop implementation.
bool Init(std::string* error_message) override;
void Cleanup() override;
using SignalWatcher = fit::function<void(pid_t pid, int status)>;
WatchHandle WatchChildSignals(pid_t pid, SignalWatcher watcher);
private:
struct SignalWatchInfo;
// MessageLoop protected override.
void StopWatching(int id) override;
// Used to wake up for signals.
fbl::unique_fd signal_fd_;
WatchHandle signal_fd_watch_;
using SignalWatchMap = std::map<int, SignalWatchInfo>;
SignalWatchMap signal_watches_;
};
} // namespace debug
#endif // SRC_DEVELOPER_DEBUG_SHARED_MESSAGE_LOOP_LINUX_H_