1 /*
2  * Copyright (C) 2019 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 #include "CloseHandleWrapper.h"
18 
19 #include <android-base/logging.h>
20 
21 namespace android {
22 namespace hardware {
23 namespace automotive {
24 namespace can {
25 namespace V1_0 {
26 namespace utils {
27 
CloseHandleWrapper()28 CloseHandleWrapper::CloseHandleWrapper() : mIsClosed(true) {}
29 
CloseHandleWrapper(sp<ICloseHandle> handle)30 CloseHandleWrapper::CloseHandleWrapper(sp<ICloseHandle> handle) : mHandle(handle) {
31     if (handle == nullptr) mIsClosed = true;
32 }
33 
~CloseHandleWrapper()34 CloseHandleWrapper::~CloseHandleWrapper() {
35     close();
36 }
37 
operator =(CloseHandleWrapper && other)38 CloseHandleWrapper& CloseHandleWrapper::operator=(CloseHandleWrapper&& other) {
39     if (this != &other) {
40         close();
41 
42         mHandle = other.mHandle;
43         other.mHandle = nullptr;
44         mIsClosed = other.mIsClosed.load();
45         other.mIsClosed = true;
46     }
47 
48     return *this;
49 }
50 
close()51 void CloseHandleWrapper::close() {
52     const auto wasClosed = mIsClosed.exchange(true);
53     if (wasClosed) return;
54 
55     mHandle->close();
56     mHandle = nullptr;
57 }
58 
59 }  // namespace utils
60 }  // namespace V1_0
61 }  // namespace can
62 }  // namespace automotive
63 }  // namespace hardware
64 }  // namespace android
65