diff options
author | Elliott Hughes <enh@google.com> | 2013-02-15 19:21:51 -0800 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2013-02-19 12:21:41 -0800 |
commit | 9d23e04c43dbb8480bea8be28b8a2f37423bec49 (patch) | |
tree | e403288cf01ce40d6f330da09a317c7ad6dc2cb2 /libc/bionic/pthread_accessor.h | |
parent | 081318e3550b1a8d8384d98d7c94527681691120 (diff) | |
download | bionic-9d23e04c43dbb8480bea8be28b8a2f37423bec49.zip bionic-9d23e04c43dbb8480bea8be28b8a2f37423bec49.tar.gz bionic-9d23e04c43dbb8480bea8be28b8a2f37423bec49.tar.bz2 |
Fix pthreads functions that should return ESRCH.
imgtec pointed out that pthread_kill(3) was broken, but most of the
other functions that ought to return ESRCH for invalid/exited threads
were equally broken.
Change-Id: I96347f6195549aee0c72dc39063e6c5d06d2e01f
Diffstat (limited to 'libc/bionic/pthread_accessor.h')
-rw-r--r-- | libc/bionic/pthread_accessor.h | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/libc/bionic/pthread_accessor.h b/libc/bionic/pthread_accessor.h new file mode 100644 index 0000000..eb8c350 --- /dev/null +++ b/libc/bionic/pthread_accessor.h @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2013 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. + */ + +#ifndef PTHREAD_ACCESSOR_H +#define PTHREAD_ACCESSOR_H + +#include <pthread.h> + +#include "pthread_internal.h" + +class pthread_accessor { + public: + explicit pthread_accessor(pthread_t desired_thread) { + Lock(); + for (thread_ = gThreadList; thread_ != NULL; thread_ = thread_->next) { + if (thread_ == reinterpret_cast<pthread_internal_t*>(desired_thread)) { + break; + } + } + } + + ~pthread_accessor() { + Unlock(); + } + + pthread_internal_t& operator*() const { return *thread_; } + pthread_internal_t* operator->() const { return thread_; } + pthread_internal_t* get() const { return thread_; } + + private: + pthread_internal_t* thread_; + bool is_locked_; + + void Lock() { + pthread_mutex_lock(&gThreadListLock); + is_locked_ = true; + } + + void Unlock() { + if (is_locked_) { + is_locked_ = false; + thread_ = NULL; + pthread_mutex_unlock(&gThreadListLock); + } + } + + // Disallow copy and assignment. + pthread_accessor(const pthread_accessor&); + void operator=(const pthread_accessor&); +}; + +#endif // PTHREAD_ACCESSOR_H |