diff options
author | Zach Reizner <zachr@google.com> | 2015-11-13 16:09:39 -0800 |
---|---|---|
committer | Zach Reizner <zachr@google.com> | 2015-11-13 16:09:39 -0800 |
commit | 49446bc72b33b8b68352b2048657bea4a8da4a42 (patch) | |
tree | 6affe4ab0837e0cef4f66ad7853385e74d6a5ee9 | |
parent | 8467b129419b0f78974bd478809ad32da4fd09fa (diff) | |
download | drm_hwcomposer-49446bc72b33b8b68352b2048657bea4a8da4a42.tar.gz |
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
-rw-r--r-- | Android.mk | 1 | ||||
-rw-r--r-- | autolock.cpp | 56 | ||||
-rw-r--r-- | autolock.h | 42 |
3 files changed, 99 insertions, 0 deletions
@@ -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 <errno.h> +#include <pthread.h> + +#include <cutils/log.h> + +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 <pthread.h> + +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_; +}; +} |