diff options
| author | Jean-Philippe Bruyère <jp_bruyere@hotmail.com> | 2026-10-16 12:02:56 +0200 |
|---|---|---|
| committer | Jean-Philippe Bruyère <jp_bruyere@hotmail.com> | 2026-10-16 12:02:56 +0200 |
| commit | ce0269b31ba948e243cc652dc9b694f004644a94 (patch) | |
| tree | 829a35d18e729243c1244d58694699032ad72d77 | |
| parent | d65ceda25ffe435114f0416d6bb1ad9164932907 (diff) | |
device atomic reference
| -rw-r--r-- | src/vkvg_device.c | 24 | ||||
| -rw-r--r-- | src/vkvg_device_internal.h | 2 | ||||
| -rw-r--r-- | src/vkvg_pattern.c | 1 |
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; } |