aaudio: protect MonotonicCounter from overflow
Use __builtin_sub_overflow.
Bug: 214726263
Test: atest test_monotonic_counter
Test: Run OboeTester with Legacy output for 13 hours.
Change-Id: Ie3cbf155c3059f50c17a32361c203265d63dc31b
diff --git a/media/libaaudio/src/legacy/AudioStreamRecord.cpp b/media/libaaudio/src/legacy/AudioStreamRecord.cpp
index df7d4cf..d9f12a5 100644
--- a/media/libaaudio/src/legacy/AudioStreamRecord.cpp
+++ b/media/libaaudio/src/legacy/AudioStreamRecord.cpp
@@ -557,7 +557,7 @@
case AAUDIO_STREAM_STATE_STARTED:
result = mAudioRecord->getPosition(&position);
if (result == OK) {
- mFramesWritten.update32(position);
+ mFramesWritten.update32((int32_t)position);
}
break;
case AAUDIO_STREAM_STATE_STOPPING:
diff --git a/media/libaaudio/src/legacy/AudioStreamTrack.cpp b/media/libaaudio/src/legacy/AudioStreamTrack.cpp
index 17a6d0c..6f1dc92 100644
--- a/media/libaaudio/src/legacy/AudioStreamTrack.cpp
+++ b/media/libaaudio/src/legacy/AudioStreamTrack.cpp
@@ -508,7 +508,7 @@
case AAUDIO_STREAM_STATE_PAUSED:
result = mAudioTrack->getPosition(&position);
if (result == OK) {
- mFramesRead.update32(position);
+ mFramesRead.update32((int32_t)position);
}
break;
default:
diff --git a/media/libaaudio/src/utility/MonotonicCounter.h b/media/libaaudio/src/utility/MonotonicCounter.h
index 313ccbd..51eb69b 100644
--- a/media/libaaudio/src/utility/MonotonicCounter.h
+++ b/media/libaaudio/src/utility/MonotonicCounter.h
@@ -41,7 +41,12 @@
}
/**
- * advance the current value to match the counter
+ * Advance the current value to match the counter.
+ *
+ * Note that it will take several million years for the 64-bit
+ * counters to wrap around.
+ * So we do not use __builtin_sub_overflow.
+ * We want to know if overflow happens because of a bug.
*/
void catchUpTo(int64_t counter) {
if ((counter - mCounter64) > 0) {
@@ -74,7 +79,8 @@
* @return current value of the 64-bit counter
*/
int64_t update32(int32_t counter32) {
- int32_t delta = counter32 - mCounter32;
+ int32_t delta;
+ __builtin_sub_overflow(counter32, mCounter32, &delta);
// protect against the mCounter64 going backwards
if (delta > 0) {
mCounter64 += delta;
@@ -108,5 +114,4 @@
int32_t mCounter32 = 0;
};
-
#endif //UTILITY_MONOTONIC_COUNTER_H