#ifndef MOJO_CORE_CHANNEL_LINUX_H_
#define MOJO_CORE_CHANNEL_LINUX_H_
#include <atomic>
#include <memory>
#include "base/task/single_thread_task_runner.h"
#include "build/build_config.h"
#include "mojo/core/channel_posix.h"
namespace mojo::core {
class DataAvailableNotifier;
class MOJO_SYSTEM_IMPL_EXPORT ChannelLinux : public ChannelPosix {
public:
ChannelLinux(Delegate* delegate,
ConnectionParams connection_params,
HandlePolicy handle_policy,
scoped_refptr<base::SingleThreadTaskRunner> io_task_runner);
ChannelLinux(const ChannelLinux&) = delete;
ChannelLinux& operator=(const ChannelLinux&) = delete;
static bool KernelSupportsUpgradeRequirements();
static bool UpgradesEnabled();
static void SetSharedMemParameters(bool enabled, uint32_t num_pages);
void Write(MessagePtr message) override;
void OfferSharedMemUpgrade();
bool OnControlMessage(Message::MessageType message_type,
const void* payload,
size_t payload_size,
std::vector<PlatformHandle> handles) override;
void OnWriteError(Error error) override;
void RejectUpgradeOffer();
void AcceptUpgradeOffer();
void StartOnIOThread() override;
void ShutDownOnIOThread() override;
private:
~ChannelLinux() override;
class SharedBuffer;
void OfferSharedMemUpgradeInternal();
void SharedMemReadReady();
std::atomic_flag offered_{false};
std::atomic_bool shared_mem_writer_{false};
std::unique_ptr<DataAvailableNotifier> write_notifier_;
std::unique_ptr<SharedBuffer> write_buffer_;
std::unique_ptr<DataAvailableNotifier> read_notifier_;
std::unique_ptr<SharedBuffer> read_buffer_;
uint32_t num_pages_ = 0;
std::atomic_bool reject_writes_{false};
std::vector<uint8_t> read_buf_;
};
}
#endif