| // 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_ |