blob: a84e837108d35fa133e1360c205c50ab9b000526 [file] [log] [blame]
// Copyright 2017 The Chromium 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 COMPONENTS_SERVICES_HEAP_PROFILING_PUBLIC_CPP_SENDER_PIPE_H_
#define COMPONENTS_SERVICES_HEAP_PROFILING_PUBLIC_CPP_SENDER_PIPE_H_
#include "build/build_config.h"
#include "base/files/platform_file.h"
#include "base/macros.h"
#include "base/synchronization/lock.h"
#include "mojo/public/cpp/platform/platform_handle.h"
namespace heap_profiling {
class SenderPipe {
public:
// 64k is a convenient pipe buffer size.
// On macOS, the default pipe buffer size is 16 * 1024, but grows to 64 * 1024
// for large writes. See BIG_PIPE_SIZE.
// https://opensource.apple.com/source/xnu/xnu-1504.9.37/bsd/sys/pipe.h
// On Linux [since 2.6.11], the default pipe buffer size is 64 * 1024. See
// https://linux.die.net/man/7/pipe
// On Windows, the pipe buffer size is configurable.
static constexpr size_t kPipeSize = 64 * 1024;
class PipePair {
public:
// Returns a pair of newly created pipes. Must be called from a privileged
// process. The sender-pipe is non-blocking and has a buffer size of
// |kPipeSize|.
PipePair();
PipePair(PipePair&&);
mojo::PlatformHandle PassSender() { return std::move(sender_); }
mojo::PlatformHandle PassReceiver() { return std::move(receiver_); }
private:
mojo::PlatformHandle sender_;
mojo::PlatformHandle receiver_;
DISALLOW_COPY_AND_ASSIGN(PipePair);
};
explicit SenderPipe(mojo::PlatformHandle handle);
~SenderPipe();
enum class Result { kSuccess, kTimeout, kError };
// Attempts to atomically write all the |data| into the pipe. kError is
// returned on failure, kTimeout after |timeout_ms| milliseconds.
Result Send(const void* data, size_t sz, int timeout_ms);
// Closes the underlying pipe.
void Close();
private:
base::ScopedPlatformFile file_;
// All calls to Send() are wrapped in a Lock, since the size of the data might
// be larger than the maximum atomic write size of a pipe on Posix [PIPE_BUF].
// On Windows, ::WriteFile() is not thread-safe.
base::Lock lock_;
DISALLOW_COPY_AND_ASSIGN(SenderPipe);
};
} // namespace heap_profiling
#endif // COMPONENTS_SERVICES_HEAP_PROFILING_PUBLIC_CPP_SENDER_PIPE_H_