blob: 991c9e74948892f2c8131f6d3925c2ce5ab993be [file] [log] [blame]
// Copyright 2021 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 UI_GFX_X_REF_COUNTED_FD_H_
#define UI_GFX_X_REF_COUNTED_FD_H_
#include "base/component_export.h"
#include "base/files/scoped_file.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_refptr.h"
namespace x11 {
// Wraps a native file descriptor and close()s it when there are no more active
// scoped_refptrs. This class is needed to implement request argument
// forwarding and is probably not useful outside of that context.
class COMPONENT_EXPORT(X11) RefCountedFD {
public:
RefCountedFD();
explicit RefCountedFD(int fd);
explicit RefCountedFD(base::ScopedFD);
// All special members are defaulted.
RefCountedFD(const RefCountedFD&);
RefCountedFD(RefCountedFD&&);
RefCountedFD& operator=(const RefCountedFD&);
RefCountedFD& operator=(RefCountedFD&&);
~RefCountedFD();
int get() const;
private:
class Impl : public base::RefCounted<Impl> {
public:
explicit Impl(int fd);
explicit Impl(base::ScopedFD fd);
base::ScopedFD& fd() { return fd_; }
private:
friend class base::RefCounted<Impl>;
~Impl();
base::ScopedFD fd_;
};
scoped_refptr<Impl> impl_;
};
} // namespace x11
#endif // UI_GFX_X_REF_COUNTED_FD_H_