summaryrefslogtreecommitdiffstats
path: root/libs
diff options
context:
space:
mode:
authorJeff Brown <jeffbrown@google.com>2010-09-21 15:57:13 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2010-09-21 15:57:13 -0700
commitfdc85679cc300e9f7ee75040c25bef1826372ff0 (patch)
treed3e00874739e423061101bc7e630408104bf337f /libs
parent862d6c2cc97acb86bb5fe577b8b923d4638dd944 (diff)
parent4ec134cdba52b663506562c6406b07915820b007 (diff)
downloadframeworks_base-fdc85679cc300e9f7ee75040c25bef1826372ff0.zip
frameworks_base-fdc85679cc300e9f7ee75040c25bef1826372ff0.tar.gz
frameworks_base-fdc85679cc300e9f7ee75040c25bef1826372ff0.tar.bz2
am 4ec134cd: am cce0cd13: Merge "Looper: use pthread_once for TLS key initialization." into gingerbread
Merge commit '4ec134cdba52b663506562c6406b07915820b007' * commit '4ec134cdba52b663506562c6406b07915820b007': Looper: use pthread_once for TLS key initialization.
Diffstat (limited to 'libs')
-rw-r--r--libs/utils/Looper.cpp29
1 files changed, 14 insertions, 15 deletions
diff --git a/libs/utils/Looper.cpp b/libs/utils/Looper.cpp
index b46279e..d2dd6eb 100644
--- a/libs/utils/Looper.cpp
+++ b/libs/utils/Looper.cpp
@@ -24,16 +24,15 @@
namespace android {
-static pthread_mutex_t gTLSMutex = PTHREAD_MUTEX_INITIALIZER;
-static bool gHaveTLS = false;
-static pthread_key_t gTLS = 0;
-
// Hint for number of file descriptors to be associated with the epoll instance.
static const int EPOLL_SIZE_HINT = 8;
// Maximum number of file descriptors for which to retrieve poll events each iteration.
static const int EPOLL_MAX_EVENTS = 16;
+static pthread_once_t gTLSOnce = PTHREAD_ONCE_INIT;
+static pthread_key_t gTLSKey = 0;
+
Looper::Looper(bool allowNonCallbacks) :
mAllowNonCallbacks(allowNonCallbacks),
mResponseIndex(0) {
@@ -56,6 +55,7 @@ Looper::Looper(bool allowNonCallbacks) :
errno);
struct epoll_event eventItem;
+ memset(& eventItem, 0, sizeof(epoll_event)); // zero out unused members of data field union
eventItem.events = EPOLLIN;
eventItem.data.fd = mWakeReadPipeFd;
result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, mWakeReadPipeFd, & eventItem);
@@ -69,6 +69,11 @@ Looper::~Looper() {
close(mEpollFd);
}
+void Looper::initTLSKey() {
+ int result = pthread_key_create(& gTLSKey, threadDestructor);
+ LOG_ALWAYS_FATAL_IF(result != 0, "Could not allocate TLS key.");
+}
+
void Looper::threadDestructor(void *st) {
Looper* const self = static_cast<Looper*>(st);
if (self != NULL) {
@@ -83,7 +88,7 @@ void Looper::setForThread(const sp<Looper>& looper) {
looper->incStrong((void*)threadDestructor);
}
- pthread_setspecific(gTLS, looper.get());
+ pthread_setspecific(gTLSKey, looper.get());
if (old != NULL) {
old->decStrong((void*)threadDestructor);
@@ -91,17 +96,10 @@ void Looper::setForThread(const sp<Looper>& looper) {
}
sp<Looper> Looper::getForThread() {
- if (!gHaveTLS) {
- pthread_mutex_lock(&gTLSMutex);
- if (pthread_key_create(&gTLS, threadDestructor) != 0) {
- pthread_mutex_unlock(&gTLSMutex);
- return NULL;
- }
- gHaveTLS = true;
- pthread_mutex_unlock(&gTLSMutex);
- }
+ int result = pthread_once(& gTLSOnce, initTLSKey);
+ LOG_ALWAYS_FATAL_IF(result != 0, "pthread_once failed");
- return (Looper*)pthread_getspecific(gTLS);
+ return (Looper*)pthread_getspecific(gTLSKey);
}
sp<Looper> Looper::prepare(int opts) {
@@ -331,6 +329,7 @@ int Looper::addFd(int fd, int ident, int events, ALooper_callbackFunc callback,
request.data = data;
struct epoll_event eventItem;
+ memset(& eventItem, 0, sizeof(epoll_event)); // zero out unused members of data field union
eventItem.events = epollEvents;
eventItem.data.fd = fd;