Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2cc6a2d2 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "audioserver: Use timed lock instead of bouncing for dumps"

parents d0e36ea4 959e2d06
Loading
Loading
Loading
Loading
+2 −9
Original line number Original line Diff line number Diff line
@@ -466,15 +466,8 @@ void AudioFlinger::dumpPermissionDenial(int fd, const Vector<String16>& args __u


bool AudioFlinger::dumpTryLock(Mutex& mutex)
bool AudioFlinger::dumpTryLock(Mutex& mutex)
{
{
    bool locked = false;
    status_t err = mutex.timedLock(kDumpLockTimeoutNs);
    for (int i = 0; i < kDumpLockRetries; ++i) {
    return err == NO_ERROR;
        if (mutex.tryLock() == NO_ERROR) {
            locked = true;
            break;
        }
        usleep(kDumpLockSleepUs);
    }
    return locked;
}
}


status_t AudioFlinger::dump(int fd, const Vector<String16>& args)
status_t AudioFlinger::dump(int fd, const Vector<String16>& args)
+1 −2
Original line number Original line Diff line number Diff line
@@ -431,8 +431,7 @@ private:
    static uint32_t         mScreenState;
    static uint32_t         mScreenState;


    // Internal dump utilities.
    // Internal dump utilities.
    static const int kDumpLockRetries = 50;
    static const int kDumpLockTimeoutNs = 1 * NANOS_PER_SECOND;
    static const int kDumpLockSleepUs = 20000;
    static bool dumpTryLock(Mutex& mutex);
    static bool dumpTryLock(Mutex& mutex);
    void dumpPermissionDenial(int fd, const Vector<String16>& args);
    void dumpPermissionDenial(int fd, const Vector<String16>& args);
    void dumpClients(int fd, const Vector<String16>& args);
    void dumpClients(int fd, const Vector<String16>& args);
+8 −15
Original line number Original line Diff line number Diff line
@@ -22,8 +22,9 @@
#define __STDINT_LIMITS
#define __STDINT_LIMITS
#define __STDC_LIMIT_MACROS
#define __STDC_LIMIT_MACROS
#include <stdint.h>
#include <stdint.h>

#include <sys/time.h>
#include <sys/time.h>

#include <audio_utils/clock.h>
#include <binder/IServiceManager.h>
#include <binder/IServiceManager.h>
#include <utils/Log.h>
#include <utils/Log.h>
#include <cutils/properties.h>
#include <cutils/properties.h>
@@ -48,8 +49,7 @@ namespace android {
static const char kDeadlockedString[] = "AudioPolicyService may be deadlocked\n";
static const char kDeadlockedString[] = "AudioPolicyService may be deadlocked\n";
static const char kCmdDeadlockedString[] = "AudioPolicyService command thread may be deadlocked\n";
static const char kCmdDeadlockedString[] = "AudioPolicyService command thread may be deadlocked\n";


static const int kDumpLockRetries = 50;
static const int kDumpLockTimeoutNs = 1 * NANOS_PER_SECOND;
static const int kDumpLockSleepUs = 20000;


static const nsecs_t kAudioCommandTimeoutNs = seconds(3); // 3 seconds
static const nsecs_t kAudioCommandTimeoutNs = seconds(3); // 3 seconds


@@ -376,17 +376,10 @@ void AudioPolicyService::binderDied(const wp<IBinder>& who) {
            IPCThreadState::self()->getCallingPid());
            IPCThreadState::self()->getCallingPid());
}
}


static bool tryLock(Mutex& mutex)
static bool dumpTryLock(Mutex& mutex)
{
{
    bool locked = false;
    status_t err = mutex.timedLock(kDumpLockTimeoutNs);
    for (int i = 0; i < kDumpLockRetries; ++i) {
    return err == NO_ERROR;
        if (mutex.tryLock() == NO_ERROR) {
            locked = true;
            break;
        }
        usleep(kDumpLockSleepUs);
    }
    return locked;
}
}


status_t AudioPolicyService::dumpInternals(int fd)
status_t AudioPolicyService::dumpInternals(int fd)
@@ -627,7 +620,7 @@ status_t AudioPolicyService::dump(int fd, const Vector<String16>& args __unused)
    if (!dumpAllowed()) {
    if (!dumpAllowed()) {
        dumpPermissionDenial(fd);
        dumpPermissionDenial(fd);
    } else {
    } else {
        bool locked = tryLock(mLock);
        bool locked = dumpTryLock(mLock);
        if (!locked) {
        if (!locked) {
            String8 result(kDeadlockedString);
            String8 result(kDeadlockedString);
            write(fd, result.string(), result.size());
            write(fd, result.string(), result.size());
@@ -1260,7 +1253,7 @@ status_t AudioPolicyService::AudioCommandThread::dump(int fd)
    result.append(buffer);
    result.append(buffer);
    write(fd, result.string(), result.size());
    write(fd, result.string(), result.size());


    bool locked = tryLock(mLock);
    bool locked = dumpTryLock(mLock);
    if (!locked) {
    if (!locked) {
        String8 result2(kCmdDeadlockedString);
        String8 result2(kCmdDeadlockedString);
        write(fd, result2.string(), result2.size());
        write(fd, result2.string(), result2.size());
+1 −0
Original line number Original line Diff line number Diff line
@@ -28,6 +28,7 @@ cc_library_shared {
        "libhardware",
        "libhardware",
        "libsoundtrigger",
        "libsoundtrigger",
        "libaudioclient",
        "libaudioclient",
        "libaudioutils",
        "libmediautils",
        "libmediautils",


        "libhwbinder",
        "libhwbinder",
+6 −13
Original line number Original line Diff line number Diff line
@@ -22,6 +22,7 @@
#include <sys/types.h>
#include <sys/types.h>
#include <pthread.h>
#include <pthread.h>


#include <audio_utils/clock.h>
#include <system/sound_trigger.h>
#include <system/sound_trigger.h>
#include <cutils/atomic.h>
#include <cutils/atomic.h>
#include <cutils/properties.h>
#include <cutils/properties.h>
@@ -146,20 +147,12 @@ status_t SoundTriggerHwService::setCaptureState(bool active)
}
}




static const int kDumpLockRetries = 50;
static const int kDumpLockTimeoutNs = 1 * NANOS_PER_SECOND;
static const int kDumpLockSleep = 60000;


static bool tryLock(Mutex& mutex)
static bool dumpTryLock(Mutex& mutex)
{
{
    bool locked = false;
    status_t err = mutex.timedLock(kDumpLockTimeoutNs);
    for (int i = 0; i < kDumpLockRetries; ++i) {
    return err == NO_ERROR;
        if (mutex.tryLock() == NO_ERROR) {
            locked = true;
            break;
        }
        usleep(kDumpLockSleep);
    }
    return locked;
}
}


status_t SoundTriggerHwService::dump(int fd, const Vector<String16>& args __unused) {
status_t SoundTriggerHwService::dump(int fd, const Vector<String16>& args __unused) {
@@ -168,7 +161,7 @@ status_t SoundTriggerHwService::dump(int fd, const Vector<String16>& args __unus
        result.appendFormat("Permission Denial: can't dump SoundTriggerHwService");
        result.appendFormat("Permission Denial: can't dump SoundTriggerHwService");
        write(fd, result.string(), result.size());
        write(fd, result.string(), result.size());
    } else {
    } else {
        bool locked = tryLock(mServiceLock);
        bool locked = dumpTryLock(mServiceLock);
        // failed to lock - SoundTriggerHwService is probably deadlocked
        // failed to lock - SoundTriggerHwService is probably deadlocked
        if (!locked) {
        if (!locked) {
            result.append("SoundTriggerHwService may be deadlocked\n");
            result.append("SoundTriggerHwService may be deadlocked\n");