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

Commit 809f3979 authored by Ivan Lozano's avatar Ivan Lozano
Browse files

Fix audioflinger in integer sanitized builds.

Refactor threadLoop() to avoid unsigned integer overflows
which were causing errors on integer sanitized builds.

Also disable sanitization in fnv1a.

Bug: 30969751
Test: Compiles with and without integer sanitization.
Test: Device boots.
Change-Id: Ia8201e8a8f1d4df2b356ec81003fb07598db4546
Merged-In: Ia8201e8a8f1d4df2b356ec81003fb07598db4546
parent 240201e2
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -3307,9 +3307,13 @@ bool AudioFlinger::PlaybackThread::threadLoop()
                        // 2. threadLoop_mix (significant for heavy mixing, especially
                        //                    on low tier processors)

                        // it's OK if deltaMs is an overestimate.
                        const int32_t deltaMs =
                                (lastWriteFinished - previousLastWriteFinished) / 1000000;
                        // it's OK if deltaMs (and deltaNs) is an overestimate.
                        nsecs_t deltaNs;
                        // deltaNs = lastWriteFinished - previousLastWriteFinished;
                        __builtin_sub_overflow(
                            lastWriteFinished,previousLastWriteFinished, &deltaNs);
                        const int32_t deltaMs = deltaNs / 1000000;

                        const int32_t throttleMs = mHalfBufferMs - deltaMs;
                        if ((signed)mHalfBufferMs >= throttleMs && throttleMs > 0) {
                            usleep(throttleMs * 1000);
+2 −1
Original line number Diff line number Diff line
@@ -62,7 +62,8 @@ constexpr uint64_t FNV_prime<uint64_t>() {
}

template <typename T, size_t n>
constexpr T fnv1a(const char (&file)[n], int i = n - 1) {
__attribute__((no_sanitize("unsigned-integer-overflow")))
constexpr T fnv1a(const char (&file)[n], ssize_t i = (ssize_t)n - 1) {
    return i == -1 ? offset_basis<T>() : (fnv1a<T>(file, i - 1) ^ file[i]) * FNV_prime<T>();
}