From a06e68cb7a2c171197da2e100bee4c539f586266 Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Tue, 27 Apr 2021 00:09:23 +0000 Subject: [PATCH] Reland^2 "libutils: disable implicit ref base construction" This reverts commit 2cb75937925e19c5cc7dccd84906b14d5297cf0a. Reason for revert: reland after fixing b/186468053 Bug: 184190315 Change-Id: I2a46b7a8148db444f9bd4b24746f64217cbba947 --- libutils/Android.bp | 1 + libutils/Looper.cpp | 11 ++++++++--- libutils/NativeHandle.cpp | 2 +- libutils/Threads.cpp | 2 +- libutils/include/utils/NativeHandle.h | 2 ++ 5 files changed, 13 insertions(+), 5 deletions(-) diff --git a/libutils/Android.bp b/libutils/Android.bp index 62015693c..df761a8dc 100644 --- a/libutils/Android.bp +++ b/libutils/Android.bp @@ -76,6 +76,7 @@ cc_defaults { "-Wall", "-Werror", "-Wno-exit-time-destructors", + "-DANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION", ], header_libs: [ "libbase_headers", diff --git a/libutils/Looper.cpp b/libutils/Looper.cpp index 14e3e35c7..4b01e5c2b 100644 --- a/libutils/Looper.cpp +++ b/libutils/Looper.cpp @@ -107,14 +107,15 @@ sp Looper::getForThread() { int result = pthread_once(& gTLSOnce, initTLSKey); LOG_ALWAYS_FATAL_IF(result != 0, "pthread_once failed"); - return (Looper*)pthread_getspecific(gTLSKey); + Looper* looper = (Looper*)pthread_getspecific(gTLSKey); + return sp::fromExisting(looper); } sp Looper::prepare(int opts) { bool allowNonCallbacks = opts & PREPARE_ALLOW_NON_CALLBACKS; sp looper = Looper::getForThread(); if (looper == nullptr) { - looper = new Looper(allowNonCallbacks); + looper = sp::make(allowNonCallbacks); Looper::setForThread(looper); } if (looper->getAllowNonCallbacks() != allowNonCallbacks) { @@ -424,7 +425,11 @@ void Looper::pushResponse(int events, const Request& request) { } int Looper::addFd(int fd, int ident, int events, Looper_callbackFunc callback, void* data) { - return addFd(fd, ident, events, callback ? new SimpleLooperCallback(callback) : nullptr, data); + sp looperCallback; + if (callback) { + looperCallback = sp::make(callback); + } + return addFd(fd, ident, events, looperCallback, data); } int Looper::addFd(int fd, int ident, int events, const sp& callback, void* data) { diff --git a/libutils/NativeHandle.cpp b/libutils/NativeHandle.cpp index d437a9fc9..819a60352 100644 --- a/libutils/NativeHandle.cpp +++ b/libutils/NativeHandle.cpp @@ -20,7 +20,7 @@ namespace android { sp NativeHandle::create(native_handle_t* handle, bool ownsHandle) { - return handle ? new NativeHandle(handle, ownsHandle) : nullptr; + return handle ? sp::make(handle, ownsHandle) : nullptr; } NativeHandle::NativeHandle(native_handle_t* handle, bool ownsHandle) diff --git a/libutils/Threads.cpp b/libutils/Threads.cpp index 540dcf49d..1c8f81011 100644 --- a/libutils/Threads.cpp +++ b/libutils/Threads.cpp @@ -693,7 +693,7 @@ status_t Thread::run(const char* name, int32_t priority, size_t stack) mThread = thread_id_t(-1); // hold a strong reference on ourself - mHoldSelf = this; + mHoldSelf = sp::fromExisting(this); mRunning = true; diff --git a/libutils/include/utils/NativeHandle.h b/libutils/include/utils/NativeHandle.h index 73fe804cc..f26a1a4d9 100644 --- a/libutils/include/utils/NativeHandle.h +++ b/libutils/include/utils/NativeHandle.h @@ -39,6 +39,8 @@ public: private: // for access to the destructor friend class LightRefBase; + // for access to the constructor + friend class sp; NativeHandle(native_handle_t* handle, bool ownsHandle); ~NativeHandle();