summaryrefslogtreecommitdiffstatsci
diff options
context:
space:
mode:
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>2026-10-16 12:02:56 +0200
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>2026-10-16 12:02:56 +0200
commitce0269b31ba948e243cc652dc9b694f004644a94 (patch)
tree829a35d18e729243c1244d58694699032ad72d77
parentd65ceda25ffe435114f0416d6bb1ad9164932907 (diff)
device atomic reference
-rw-r--r--src/vkvg_device.c24
-rw-r--r--src/vkvg_device_internal.h2
-rw-r--r--src/vkvg_pattern.c1
3 files changed, 12 insertions, 15 deletions
diff --git a/src/vkvg_device.c b/src/vkvg_device.c
index ea47024..cf81b98 100644
--- a/src/vkvg_device.c
+++ b/src/vkvg_device.c
@@ -269,8 +269,6 @@ VkvgDevice vkvg_device_create(vkvg_device_create_info_t* info) {
return (VkvgDevice)&_vkvg_status_no_memory;
}
- dev->references = 1;
-
dev->threadAware = info->threadAware;
if (!info->vkdev) {
@@ -366,6 +364,8 @@ VkvgDevice vkvg_device_create(vkvg_device_create_info_t* info) {
_device_init(dev, info);
+ atomic_init(&dev->references, 1);
+
return dev;
}
@@ -374,13 +374,8 @@ void vkvg_device_destroy(VkvgDevice dev) {
LOGE("DESTROY Device failed, see Status for info");
return;
}
- LOCK_DEVICE
- dev->references--;
- if (dev->references > 0) {
- UNLOCK_DEVICE
+ if (atomic_fetch_sub_explicit(&dev->references, 1, memory_order_acq_rel) != 1)
return;
- }
- UNLOCK_DEVICE
LOG(VKVG_LOG_INFO, "DESTROY Device\n");
@@ -438,14 +433,15 @@ void vkvg_device_destroy(VkvgDevice dev) {
vkvg_status_t vkvg_device_status(VkvgDevice dev) { return !dev ? VKVG_STATUS_NULL_POINTER : dev->status; }
VkvgDevice vkvg_device_reference(VkvgDevice dev) {
- if (!vkvg_device_status(dev)) {
- LOCK_DEVICE
- dev->references++;
- UNLOCK_DEVICE
- }
+ if (!vkvg_device_status(dev))
+ atomic_fetch_add_explicit(&dev->references, 1, memory_order_relaxed);
return dev;
}
-uint32_t vkvg_device_get_reference_count(VkvgDevice dev) { return vkvg_device_status(dev) ? 0 : dev->references; }
+uint32_t vkvg_device_get_reference_count(VkvgDevice dev) {
+ if (vkvg_device_status(dev))
+ return 0;
+ return atomic_load_explicit(&dev->references, memory_order_relaxed);
+}
#if VKVG_DBG_STATS
vkvg_debug_stats_t vkvg_device_get_stats(VkvgDevice dev) {
diff --git a/src/vkvg_device_internal.h b/src/vkvg_device_internal.h
index a455d42..03574d3 100644
--- a/src/vkvg_device_internal.h
+++ b/src/vkvg_device_internal.h
@@ -79,7 +79,7 @@ typedef struct _vkvg_device_t {
bool threadAware; /**< if true, mutex is created and guard device queue and caches access */
VkhQueue gQueue; /**< Vulkan Queue with Graphic flag */
- uint32_t references; /**< Reference count, prevent destroying device if still in use */
+ atomic_int references; /**< Reference count, prevent destroying device if still in use */
VkCommandPool cmdPool; /**< Global command pool for processing on surfaces without context */
VkCommandBuffer cmd; /**< Global command buffer */
VkFence fence; /**< this fence is kept signaled when idle, wait and reset are called before each recording. */
diff --git a/src/vkvg_pattern.c b/src/vkvg_pattern.c
index 1eaccd9..6977821 100644
--- a/src/vkvg_pattern.c
+++ b/src/vkvg_pattern.c
@@ -32,6 +32,7 @@ VkvgPattern vkvg_pattern_create_solid(float r, float g, float b, float a) {
}
pat->type = VKVG_PATTERN_TYPE_SOLID;
pat->extend = VKVG_EXTEND_NONE;
+ atomic_init(&pat->references, 1);
return pat;
}