[FFmpeg-devel] [PATCH 09/42] avcodec/refstruct: Allow checking for exclusive ownership
Andreas Rheinhardt
andreas.rheinhardt at outlook.com
Tue Sep 19 22:57:01 EEST 2023
This is the analog of av_buffer_is_writable();
it will be used in the next commit.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
---
libavcodec/refstruct.c | 14 ++++++++++++++
libavcodec/refstruct.h | 9 +++++++++
2 files changed, 23 insertions(+)
diff --git a/libavcodec/refstruct.c b/libavcodec/refstruct.c
index 917cf6b7ac..604938922a 100644
--- a/libavcodec/refstruct.c
+++ b/libavcodec/refstruct.c
@@ -48,6 +48,11 @@ static RefCount *get_refcount(void *obj)
return (RefCount*)((char*)obj - REFCOUNT_OFFSET);
}
+static const RefCount *cget_refcount(const void *data)
+{
+ return (const RefCount*)((const char*)data - REFCOUNT_OFFSET);
+}
+
static void *get_userdata(void *buf)
{
return (char*)buf + REFCOUNT_OFFSET;
@@ -137,3 +142,12 @@ void ff_refstruct_replace(void *dstp, const void *src)
memcpy(dstp, &dst, sizeof(dst));
}
}
+
+int ff_refstruct_exclusive(const void *data)
+{
+ const RefCount *ref = cget_refcount(data);
+ /* Casting const away here is safe, because it is a load.
+ * It is necessary because atomic_load_explicit() does not
+ * accept const atomics in C11 (see also N1807). */
+ return atomic_load_explicit((atomic_uintptr_t*)&ref->refcount, memory_order_acquire) == 1;
+}
diff --git a/libavcodec/refstruct.h b/libavcodec/refstruct.h
index 0086717c17..ee6936d77a 100644
--- a/libavcodec/refstruct.h
+++ b/libavcodec/refstruct.h
@@ -142,4 +142,13 @@ const void *ff_refstruct_ref_c(const void *obj);
*/
void ff_refstruct_replace(void *dstp, const void *src);
+/**
+ * Check whether the reference count of an object managed
+ * via this API is 1.
+ *
+ * @param obj A pointer to an object managed via this API.
+ * @return 1 if the reference count of obj is 1; 0 otherwise.
+ */
+int ff_refstruct_exclusive(const void *obj);
+
#endif /* AVCODEC_REFSTRUCT_H */
--
2.34.1
More information about the ffmpeg-devel
mailing list