| /* | 
|  * unique_fd.h - A unique file descriptor implementation | 
|  * | 
|  *  Copyright (c) 2021 Rockchip Electronics Co., Ltd | 
|  * | 
|  * 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. | 
|  * | 
|  * Author: Cody Xie <cody.xie@rock-chips.com> | 
|  */ | 
| #ifndef _UNIQUE_FD_H_ | 
| #define _UNIQUE_FD_H_ | 
|   | 
| #include <unistd.h> | 
|   | 
| namespace XCam { | 
|   | 
| class UniqueFd final { | 
|  public: | 
|     UniqueFd() : fd_(-1) {} | 
|     explicit UniqueFd(int fd) : fd_(fd) {} | 
|   | 
|     UniqueFd(const UniqueFd&) = delete; | 
|     UniqueFd& operator=(const UniqueFd&) = delete; | 
|   | 
|     UniqueFd& operator=(UniqueFd&& rhs) { | 
|         fd_ = Set(rhs.Release()); | 
|         return *this; | 
|     } | 
|   | 
|     ~UniqueFd() { | 
|         if (fd_ > 0) { | 
|             close(fd_); | 
|         } | 
|     } | 
|   | 
|     int Release() { | 
|         int old_fd = fd_; | 
|         fd_        = -1; | 
|         return old_fd; | 
|     } | 
|   | 
|     int Get() const { return fd_; } | 
|   | 
|     int Set(int fd) { | 
|         if (fd_ >= 0) { | 
|             close(fd_); | 
|         } | 
|         fd_ = fd; | 
|         return fd_; | 
|     } | 
|   | 
|  private: | 
|     int fd_; | 
| }; | 
|   | 
| };  // namespace XCam | 
|   | 
| #endif  // _UNIQUE_FD_H_ |