aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArthur Ishiguro <arthuri@google.com>2019-03-25 11:36:56 -0700
committerArthur Ishiguro <arthuri@google.com>2019-03-25 15:58:04 -0700
commit3794d066911181eb6f3db19abff3dea4e230293e (patch)
tree6e92d54137904a479f1d3e2dce92b0b6640f2335
parentef3a17263d11ac90a6a22fd249c6112ebb920e19 (diff)
downloadchre-3794d066911181eb6f3db19abff3dea4e230293e.tar.gz
Adds fetch_sub/decrement to AtomicUint32
Test: Sanity check by using methods Change-Id: Ica1a41f4cfd8e541f49b907600c8911e77921bc1
-rw-r--r--platform/include/chre/platform/atomic.h16
-rw-r--r--platform/linux/include/chre/target_platform/atomic_base_impl.h8
-rw-r--r--platform/slpi/include/chre/target_platform/atomic_base_impl.h10
3 files changed, 34 insertions, 0 deletions
diff --git a/platform/include/chre/platform/atomic.h b/platform/include/chre/platform/atomic.h
index b01fd811..753c94df 100644
--- a/platform/include/chre/platform/atomic.h
+++ b/platform/include/chre/platform/atomic.h
@@ -98,6 +98,22 @@ class AtomicUint32 : public AtomicUint32Base,
* @return The previous value of the object.
*/
uint32_t fetch_increment();
+
+ /**
+ * Atomically subtracts the argument from the current value of the object.
+ *
+ * @param The amount which the object should be decreased by.
+ *
+ * @return The previous value of the object.
+ */
+ uint32_t fetch_sub(uint32_t arg);
+
+ /**
+ * Atomically decrements the value stored in the atomic object by 1.
+ *
+ * @return The previous value of the object.
+ */
+ uint32_t fetch_decrement();
};
} // namespace chre
diff --git a/platform/linux/include/chre/target_platform/atomic_base_impl.h b/platform/linux/include/chre/target_platform/atomic_base_impl.h
index 850085d5..68c1f84c 100644
--- a/platform/linux/include/chre/target_platform/atomic_base_impl.h
+++ b/platform/linux/include/chre/target_platform/atomic_base_impl.h
@@ -53,6 +53,14 @@ inline uint32_t AtomicUint32::fetch_increment() {
return mAtomic.fetch_add(1);
}
+inline uint32_t AtomicUint32::fetch_sub(uint32_t arg) {
+ return mAtomic.fetch_sub(arg);
+}
+
+inline uint32_t AtomicUint32::fetch_decrement() {
+ return mAtomic.fetch_sub(1);
+}
+
} // namespace chre
#endif // CHRE_PLATFORM_LINUX_ATOMIC_BASE_IMPL_H_
diff --git a/platform/slpi/include/chre/target_platform/atomic_base_impl.h b/platform/slpi/include/chre/target_platform/atomic_base_impl.h
index 6b734ef8..46f9d725 100644
--- a/platform/slpi/include/chre/target_platform/atomic_base_impl.h
+++ b/platform/slpi/include/chre/target_platform/atomic_base_impl.h
@@ -66,6 +66,16 @@ inline uint32_t AtomicUint32::fetch_increment() {
return qurt_atomic_add_return(&mValue, 1);
}
+inline uint32_t AtomicUint32::fetch_sub(uint32_t arg) {
+ qurt_atomic_barrier();
+ return qurt_atomic_sub_return(&mValue, arg);
+}
+
+inline uint32_t AtomicUint32::fetch_decrement() {
+ qurt_atomic_barrier();
+ return qurt_atomic_sub_return(&mValue, 1);
+}
+
} // namespace chre
#endif // CHRE_PLATFORM_SLPI_ATOMIC_BASE_IMPL_H_