fifo: isolate atomic and futex operations

Now all atomic and futex operations occur in fifo_index.cpp.
This implements these TODOs:
 - Abstract out atomic operations to audio_utils_fifo_index
 - Replace friend by setter and getter, and abstract the futex
This is one of a series of CLs to isolate the dependencies.

Test: builds OK on Android, host Linux, and host macOS
Change-Id: Ic4ec46d472c583dce8525f11ed8cb1db89928d30
diff --git a/audio_utils/fifo.cpp b/audio_utils/fifo.cpp
index 45e6488..8f89318 100644
--- a/audio_utils/fifo.cpp
+++ b/audio_utils/fifo.cpp
@@ -194,7 +194,7 @@
         int retries = kRetries;
         uint32_t front;
         for (;;) {
-            front = atomic_load_explicit(&mFifo.mThrottleFront->mIndex, std::memory_order_acquire);
+            front = mFifo.mThrottleFront->loadAcquire();
             // returns -EIO if mIsShutdown
             int32_t filled = mFifo.diff(mLocalRear, front);
             if (filled < 0) {
@@ -233,7 +233,7 @@
                 if (timeout->tv_sec == LONG_MAX) {
                     timeout = NULL;
                 }
-                err = sys_futex(&mFifo.mThrottleFront->mIndex, op, front, timeout, NULL, 0);
+                err = mFifo.mThrottleFront->wait(op, front, timeout);
                 if (err < 0) {
                     switch (errno) {
                     case EWOULDBLOCK:
@@ -300,13 +300,11 @@
             return;
         }
         if (mFifo.mThrottleFront != NULL) {
-            uint32_t front = atomic_load_explicit(&mFifo.mThrottleFront->mIndex,
-                    std::memory_order_acquire);
+            uint32_t front = mFifo.mThrottleFront->loadAcquire();
             // returns -EIO if mIsShutdown
             int32_t filled = mFifo.diff(mLocalRear, front);
             mLocalRear = mFifo.sum(mLocalRear, count);
-            atomic_store_explicit(&mFifo.mWriterRear.mIndex, mLocalRear,
-                    std::memory_order_release);
+            mFifo.mWriterRear.storeRelease(mLocalRear);
             // TODO add comments
             int op = FUTEX_WAKE;
             switch (mFifo.mWriterRearSync) {
@@ -321,8 +319,7 @@
                         mIsArmed = true;
                     }
                     if (mIsArmed && filled + count > mTriggerLevel) {
-                        int err = sys_futex(&mFifo.mWriterRear.mIndex,
-                                op, INT32_MAX /*waiters*/, NULL, NULL, 0);
+                        int err = mFifo.mWriterRear.wake(op, INT32_MAX /*waiters*/);
                         // err is number of processes woken up
                         if (err < 0) {
                             LOG_ALWAYS_FATAL("%s: unexpected err=%d errno=%d",
@@ -338,8 +335,7 @@
             }
         } else {
             mLocalRear = mFifo.sum(mLocalRear, count);
-            atomic_store_explicit(&mFifo.mWriterRear.mIndex, mLocalRear,
-                    std::memory_order_release);
+            mFifo.mWriterRear.storeRelease(mLocalRear);
         }
         mObtained -= count;
         mTotalReleased += count;
@@ -451,13 +447,11 @@
             return;
         }
         if (mThrottleFront != NULL) {
-            uint32_t rear = atomic_load_explicit(&mFifo.mWriterRear.mIndex,
-                    std::memory_order_acquire);
+            uint32_t rear = mFifo.mWriterRear.loadAcquire();
             // returns -EIO if mIsShutdown
             int32_t filled = mFifo.diff(rear, mLocalFront);
             mLocalFront = mFifo.sum(mLocalFront, count);
-            atomic_store_explicit(&mThrottleFront->mIndex, mLocalFront,
-                    std::memory_order_release);
+            mThrottleFront->storeRelease(mLocalFront);
             // TODO add comments
             int op = FUTEX_WAKE;
             switch (mFifo.mThrottleFrontSync) {
@@ -472,8 +466,7 @@
                         mIsArmed = true;
                     }
                     if (mIsArmed && filled - count < mTriggerLevel) {
-                        int err = sys_futex(&mThrottleFront->mIndex,
-                                op, 1 /*waiters*/, NULL, NULL, 0);
+                        int err = mThrottleFront->wake(op, 1 /*waiters*/);
                         // err is number of processes woken up
                         if (err < 0 || err > 1) {
                             LOG_ALWAYS_FATAL("%s: unexpected err=%d errno=%d",
@@ -504,8 +497,7 @@
     int retries = kRetries;
     uint32_t rear;
     for (;;) {
-        rear = atomic_load_explicit(&mFifo.mWriterRear.mIndex,
-                std::memory_order_acquire);
+        rear = mFifo.mWriterRear.loadAcquire();
         // TODO pull out "count == 0"
         if (count == 0 || rear != mLocalFront || timeout == NULL ||
                 (timeout->tv_sec == 0 && timeout->tv_nsec == 0)) {
@@ -531,7 +523,7 @@
             if (timeout->tv_sec == LONG_MAX) {
                 timeout = NULL;
             }
-            err = sys_futex(&mFifo.mWriterRear.mIndex, op, rear, timeout, NULL, 0);
+            err = mFifo.mWriterRear.wait(op, rear, timeout);
             if (err < 0) {
                 switch (errno) {
                 case EWOULDBLOCK: