OSDN Git Service

drm_hwcomposer: Break out of sync_wait loop on success
[android-x86/external-drm_hwcomposer.git] / autofd.h
1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #ifndef ANDROID_AUTO_FD_H_
18 #define ANDROID_AUTO_FD_H_
19
20 #include <unistd.h>
21
22 namespace android {
23
24 class UniqueFd {
25  public:
26   UniqueFd() = default;
27   UniqueFd(int fd) : fd_(fd) {
28   }
29   UniqueFd(UniqueFd &&rhs) {
30     fd_ = rhs.fd_;
31     rhs.fd_ = -1;
32   }
33
34   UniqueFd &operator=(UniqueFd &&rhs) {
35     Set(rhs.Release());
36     return *this;
37   }
38
39   ~UniqueFd() {
40     if (fd_ >= 0)
41       close(fd_);
42   }
43
44   int Release() {
45     int old_fd = fd_;
46     fd_ = -1;
47     return old_fd;
48   }
49
50   int Set(int fd) {
51     if (fd_ >= 0)
52       close(fd_);
53     fd_ = fd;
54     return fd_;
55   }
56
57   void Close() {
58     if (fd_ >= 0)
59       close(fd_);
60     fd_ = -1;
61   }
62
63   int get() const {
64     return fd_;
65   }
66
67  private:
68   int fd_ = -1;
69 };
70
71 struct OutputFd {
72   OutputFd() = default;
73   OutputFd(int *fd) : fd_(fd) {
74   }
75   OutputFd(OutputFd &&rhs) {
76     fd_ = rhs.fd_;
77     rhs.fd_ = NULL;
78   }
79
80   OutputFd &operator=(OutputFd &&rhs) {
81     fd_ = rhs.fd_;
82     rhs.fd_ = NULL;
83     return *this;
84   }
85
86   int Set(int fd) {
87     if (*fd_ >= 0)
88       close(*fd_);
89     *fd_ = fd;
90     return fd;
91   }
92
93   int get() {
94     return *fd_;
95   }
96
97   operator bool() const {
98     return fd_ != NULL;
99   }
100
101  private:
102   int *fd_ = NULL;
103 };
104 }
105
106 #endif