From 26a029d407be480d791972afb5975cf62c9360a6 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 02:47:55 +0200 Subject: Adding upstream version 124.0.1. Signed-off-by: Daniel Baumann --- .../heapsnapshot/FileDescriptorOutputStream.cpp | 81 ++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 devtools/shared/heapsnapshot/FileDescriptorOutputStream.cpp (limited to 'devtools/shared/heapsnapshot/FileDescriptorOutputStream.cpp') diff --git a/devtools/shared/heapsnapshot/FileDescriptorOutputStream.cpp b/devtools/shared/heapsnapshot/FileDescriptorOutputStream.cpp new file mode 100644 index 0000000000..651d7b9496 --- /dev/null +++ b/devtools/shared/heapsnapshot/FileDescriptorOutputStream.cpp @@ -0,0 +1,81 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "mozilla/devtools/FileDescriptorOutputStream.h" +#include "private/pprio.h" + +namespace mozilla { +namespace devtools { + +/* static */ +already_AddRefed FileDescriptorOutputStream::Create( + const ipc::FileDescriptor& fileDescriptor) { + if (NS_WARN_IF(!fileDescriptor.IsValid())) return nullptr; + + auto rawFD = fileDescriptor.ClonePlatformHandle(); + PRFileDesc* prfd = PR_ImportFile(PROsfd(rawFD.release())); + if (NS_WARN_IF(!prfd)) return nullptr; + + RefPtr stream = + new FileDescriptorOutputStream(prfd); + return stream.forget(); +} + +NS_IMPL_ISUPPORTS(FileDescriptorOutputStream, nsIOutputStream); + +NS_IMETHODIMP +FileDescriptorOutputStream::Close() { + // Repeatedly closing is idempotent. + if (!fd) return NS_OK; + + if (PR_Close(fd) != PR_SUCCESS) return NS_ERROR_FAILURE; + fd = nullptr; + return NS_OK; +} + +NS_IMETHODIMP +FileDescriptorOutputStream::StreamStatus() { + return fd ? NS_OK : NS_ERROR_FAILURE; +} + +NS_IMETHODIMP +FileDescriptorOutputStream::Write(const char* buf, uint32_t count, + uint32_t* retval) { + if (NS_WARN_IF(!fd)) return NS_ERROR_FAILURE; + + auto written = PR_Write(fd, buf, count); + if (written < 0) return NS_ERROR_FAILURE; + *retval = written; + return NS_OK; +} + +NS_IMETHODIMP +FileDescriptorOutputStream::Flush() { + if (NS_WARN_IF(!fd)) return NS_ERROR_FAILURE; + + return PR_Sync(fd) == PR_SUCCESS ? NS_OK : NS_ERROR_FAILURE; +} + +NS_IMETHODIMP +FileDescriptorOutputStream::WriteFrom(nsIInputStream* fromStream, + uint32_t count, uint32_t* retval) { + return NS_ERROR_NOT_IMPLEMENTED; +} + +NS_IMETHODIMP +FileDescriptorOutputStream::WriteSegments(nsReadSegmentFun reader, + void* closure, uint32_t count, + uint32_t* retval) { + return NS_ERROR_NOT_IMPLEMENTED; +} + +NS_IMETHODIMP +FileDescriptorOutputStream::IsNonBlocking(bool* retval) { + *retval = false; + return NS_OK; +} + +} // namespace devtools +} // namespace mozilla -- cgit v1.2.3