summaryrefslogtreecommitdiff
path: root/autofd.h
diff options
context:
space:
mode:
authorZach Reizner <zachr@google.com>2015-10-28 19:08:45 -0700
committerZach Reizner <zachr@google.com>2015-10-29 09:59:39 -0700
commitff30b52303cdbeb9cbfb054e2a12da1135ea49c9 (patch)
treed6b9dbc08f43ae2c4814c23c653e632b4180bae1 /autofd.h
parent7cd2643b0de900e00e5b0cc0bd6dbbc649840b02 (diff)
drm_hwcomposer: polish for old DRM wrapper code
- deleted private copy constructors - replace delete with unique_ptr - use in-class assignment - remove default constructors/destructors when no longer needed - remove most iterators used in for loops - move UniqueFd to its own header so drmresources can use it Change-Id: Ib20cc0949cf4d381a58548b8156c5cb368ca3efe
Diffstat (limited to 'autofd.h')
-rw-r--r--autofd.h97
1 files changed, 97 insertions, 0 deletions
diff --git a/autofd.h b/autofd.h
new file mode 100644
index 0000000..0c4bd66
--- /dev/null
+++ b/autofd.h
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <unistd.h>
+
+namespace android {
+
+class UniqueFd {
+ public:
+ UniqueFd() = default;
+ UniqueFd(int fd) : fd_(fd) {
+ }
+ UniqueFd(UniqueFd &&rhs) {
+ fd_ = rhs.fd_;
+ rhs.fd_ = -1;
+ }
+
+ UniqueFd &operator=(UniqueFd &&rhs) {
+ Set(rhs.Release());
+ return *this;
+ }
+
+ ~UniqueFd() {
+ if (fd_ >= 0)
+ close(fd_);
+ }
+
+ int Release() {
+ int old_fd = fd_;
+ fd_ = -1;
+ return old_fd;
+ }
+
+ int Set(int fd) {
+ if (fd_ >= 0)
+ close(fd_);
+ fd_ = fd;
+ return fd_;
+ }
+
+ void Close() {
+ if (fd_ >= 0)
+ close(fd_);
+ fd_ = -1;
+ }
+
+ int get() const {
+ return fd_;
+ }
+
+ private:
+ int fd_ = -1;
+};
+
+struct OutputFd {
+ OutputFd() = default;
+ OutputFd(int *fd) : fd_(fd) {
+ }
+ OutputFd(OutputFd &&rhs) {
+ fd_ = rhs.fd_;
+ rhs.fd_ = NULL;
+ }
+
+ OutputFd &operator=(OutputFd &&rhs) {
+ fd_ = rhs.fd_;
+ rhs.fd_ = NULL;
+ return *this;
+ }
+
+ int Set(int fd) {
+ if (*fd_ >= 0)
+ close(*fd_);
+ *fd_ = fd;
+ return fd;
+ }
+
+ int get() {
+ return *fd_;
+ }
+
+ private:
+ int *fd_ = NULL;
+};
+}