From 49446bc72b33b8b68352b2048657bea4a8da4a42 Mon Sep 17 00:00:00 2001 From: Zach Reizner Date: Fri, 13 Nov 2015 16:09:39 -0800 Subject: [PATCH] drm_hwcomposer: add AutoLock to automatically handle pthread_mutex_lock For functions that need to hold locks and also handle errors, using AutoLock will make them much simpler and less prone to mutex handling errors. Change-Id: Ida6545850e89186c552e3d58b2973c14852494ad --- Android.mk | 1 + autolock.cpp | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ autolock.h | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 autolock.cpp create mode 100644 autolock.h diff --git a/Android.mk b/Android.mk index ca94f4c..f9add2f 100644 --- a/Android.mk +++ b/Android.mk @@ -37,6 +37,7 @@ LOCAL_C_INCLUDES := \ system/core/libsync/include \ LOCAL_SRC_FILES := \ + autolock.cpp \ drmresources.cpp \ drmcomposition.cpp \ drmcompositor.cpp \ diff --git a/autolock.cpp b/autolock.cpp new file mode 100644 index 0000000..1a2ded7 --- /dev/null +++ b/autolock.cpp @@ -0,0 +1,56 @@ +/* + * 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. + */ + +#define ATRACE_TAG ATRACE_TAG_GRAPHICS +#define LOG_TAG "hwc-drm-auto-lock" + +#include "autolock.h" + +#include +#include + +#include + +namespace android { + +int AutoLock::Lock() { + if (locked_) { + ALOGE("Invalid attempt to double lock AutoLock %s", name_); + return -EINVAL; + } + int ret = pthread_mutex_lock(mutex_); + if (ret) { + ALOGE("Failed to acquire %s lock %d", name_, ret); + return ret; + } + locked_ = true; + return 0; +} + +int AutoLock::Unlock() { + if (!locked_) { + ALOGE("Invalid attempt to unlock unlocked AutoLock %s", name_); + return -EINVAL; + } + int ret = pthread_mutex_unlock(mutex_); + if (ret) { + ALOGE("Failed to release %s lock %d", name_, ret); + return ret; + } + locked_ = false; + return 0; +} +} diff --git a/autolock.h b/autolock.h new file mode 100644 index 0000000..3b824e2 --- /dev/null +++ b/autolock.h @@ -0,0 +1,42 @@ +/* + * 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 + +namespace android { + +class AutoLock { + public: + AutoLock(pthread_mutex_t *mutex, const char *const name) + : mutex_(mutex), name_(name) { + } + ~AutoLock() { + if (locked_) + Unlock(); + } + + AutoLock(const AutoLock &rhs) = delete; + AutoLock &operator=(const AutoLock &rhs) = delete; + + int Lock(); + int Unlock(); + + private: + pthread_mutex_t *const mutex_; + bool locked_ = false; + const char *const name_; +}; +} -- 2.11.0