Loading services/surfaceflinger/Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -9,6 +9,7 @@ LOCAL_SRC_FILES := \ DisplayDevice.cpp \ DispSync.cpp \ EventControlThread.cpp \ StartBootAnimThread.cpp \ EventThread.cpp \ FrameTracker.cpp \ GpuService.cpp \ Loading services/surfaceflinger/EventControlThread.h +1 −1 Original line number Diff line number Diff line Loading @@ -45,4 +45,4 @@ private: } #endif // ANDROID_DISPSYNC_H #endif // ANDROID_EVENTCONTROLTHREAD_H services/surfaceflinger/StartBootAnimThread.cpp 0 → 100644 +37 −0 Original line number Diff line number Diff line /* * Copyright (C) 2017 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 <cutils/properties.h> #include "StartBootAnimThread.h" namespace android { StartBootAnimThread::StartBootAnimThread(): Thread(false) { } status_t StartBootAnimThread::Start() { return run("SurfaceFlinger::StartBootAnimThread", PRIORITY_NORMAL); } bool StartBootAnimThread::threadLoop() { property_set("service.bootanim.exit", "0"); property_set("ctl.start", "bootanim"); // Exit immediately return false; } } // namespace android services/surfaceflinger/StartBootAnimThread.h 0 → 100644 +42 −0 Original line number Diff line number Diff line /* * Copyright (C) 2017 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 ANDROID_STARTBOOTANIMTHREAD_H #define ANDROID_STARTBOOTANIMTHREAD_H #include <stddef.h> #include <utils/Mutex.h> #include <utils/Thread.h> namespace android { class StartBootAnimThread : public Thread { // Boot animation is triggered via calls to "property_set()" which can block // if init's executing slow operation such as 'mount_all --late' (currently // happening 1/10th with fsck) concurrently. Running in a separate thread // allows to pursue the SurfaceFlinger's init process without blocking. // see b/34499826. public: StartBootAnimThread(); status_t Start(); private: virtual bool threadLoop(); }; } #endif // ANDROID_STARTBOOTANIMTHREAD_H services/surfaceflinger/SurfaceFlinger.cpp +14 −5 Original line number Diff line number Diff line Loading @@ -338,6 +338,9 @@ sp<IGraphicBufferAlloc> SurfaceFlinger::createGraphicBufferAlloc() void SurfaceFlinger::bootFinished() { if (mStartBootAnimThread->join() != NO_ERROR) { ALOGE("Join StartBootAnimThread failed!"); } const nsecs_t now = systemTime(); const nsecs_t duration = now - mBootTime; ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) ); Loading Loading @@ -579,16 +582,22 @@ void SurfaceFlinger::init() { mRenderEngine->primeCache(); // start boot animation startBootAnim(); mStartBootAnimThread = new StartBootAnimThread(); if (mStartBootAnimThread->Start() != NO_ERROR) { ALOGE("Run StartBootAnimThread failed!"); } ALOGV("Done initializing"); } void SurfaceFlinger::startBootAnim() { // start boot animation property_set("service.bootanim.exit", "0"); property_set("ctl.start", "bootanim"); // Start boot animation service by setting a property mailbox // if property setting thread is already running, Start() will be just a NOP mStartBootAnimThread->Start(); // Wait until property was set if (mStartBootAnimThread->join() != NO_ERROR) { ALOGE("Join StartBootAnimThread failed!"); } } size_t SurfaceFlinger::getMaxTextureSize() const { Loading Loading
services/surfaceflinger/Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -9,6 +9,7 @@ LOCAL_SRC_FILES := \ DisplayDevice.cpp \ DispSync.cpp \ EventControlThread.cpp \ StartBootAnimThread.cpp \ EventThread.cpp \ FrameTracker.cpp \ GpuService.cpp \ Loading
services/surfaceflinger/EventControlThread.h +1 −1 Original line number Diff line number Diff line Loading @@ -45,4 +45,4 @@ private: } #endif // ANDROID_DISPSYNC_H #endif // ANDROID_EVENTCONTROLTHREAD_H
services/surfaceflinger/StartBootAnimThread.cpp 0 → 100644 +37 −0 Original line number Diff line number Diff line /* * Copyright (C) 2017 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 <cutils/properties.h> #include "StartBootAnimThread.h" namespace android { StartBootAnimThread::StartBootAnimThread(): Thread(false) { } status_t StartBootAnimThread::Start() { return run("SurfaceFlinger::StartBootAnimThread", PRIORITY_NORMAL); } bool StartBootAnimThread::threadLoop() { property_set("service.bootanim.exit", "0"); property_set("ctl.start", "bootanim"); // Exit immediately return false; } } // namespace android
services/surfaceflinger/StartBootAnimThread.h 0 → 100644 +42 −0 Original line number Diff line number Diff line /* * Copyright (C) 2017 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 ANDROID_STARTBOOTANIMTHREAD_H #define ANDROID_STARTBOOTANIMTHREAD_H #include <stddef.h> #include <utils/Mutex.h> #include <utils/Thread.h> namespace android { class StartBootAnimThread : public Thread { // Boot animation is triggered via calls to "property_set()" which can block // if init's executing slow operation such as 'mount_all --late' (currently // happening 1/10th with fsck) concurrently. Running in a separate thread // allows to pursue the SurfaceFlinger's init process without blocking. // see b/34499826. public: StartBootAnimThread(); status_t Start(); private: virtual bool threadLoop(); }; } #endif // ANDROID_STARTBOOTANIMTHREAD_H
services/surfaceflinger/SurfaceFlinger.cpp +14 −5 Original line number Diff line number Diff line Loading @@ -338,6 +338,9 @@ sp<IGraphicBufferAlloc> SurfaceFlinger::createGraphicBufferAlloc() void SurfaceFlinger::bootFinished() { if (mStartBootAnimThread->join() != NO_ERROR) { ALOGE("Join StartBootAnimThread failed!"); } const nsecs_t now = systemTime(); const nsecs_t duration = now - mBootTime; ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) ); Loading Loading @@ -579,16 +582,22 @@ void SurfaceFlinger::init() { mRenderEngine->primeCache(); // start boot animation startBootAnim(); mStartBootAnimThread = new StartBootAnimThread(); if (mStartBootAnimThread->Start() != NO_ERROR) { ALOGE("Run StartBootAnimThread failed!"); } ALOGV("Done initializing"); } void SurfaceFlinger::startBootAnim() { // start boot animation property_set("service.bootanim.exit", "0"); property_set("ctl.start", "bootanim"); // Start boot animation service by setting a property mailbox // if property setting thread is already running, Start() will be just a NOP mStartBootAnimThread->Start(); // Wait until property was set if (mStartBootAnimThread->join() != NO_ERROR) { ALOGE("Join StartBootAnimThread failed!"); } } size_t SurfaceFlinger::getMaxTextureSize() const { Loading