From 53d2eed741d36fd87622a601590d8e860f048bc3 Mon Sep 17 00:00:00 2001 From: George Baltz N3GB Date: Sat, 24 May 2025 20:20:10 -0400 Subject: [PATCH] Add locking around get/set levels (cherry picked from commit b5df48d8d9839460e13201765b278c6a32741158) --- src/settings.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/settings.c b/src/settings.c index 8dfbb6731..0667160b0 100644 --- a/src/settings.c +++ b/src/settings.c @@ -90,6 +90,7 @@ int HAMLIB_API rig_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) return -RIG_ENAVAIL; } + rig_lock(rig, 1); if ((caps->targetable_vfo & RIG_TARGETABLE_LEVEL) || vfo == RIG_VFO_CURR || vfo == STATE(rig)->current_vfo) @@ -103,12 +104,14 @@ int HAMLIB_API rig_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) } #endif - - return caps->set_level(rig, vfo, level, val); + retcode = caps->set_level(rig, vfo, level, val); + rig_lock(rig, 0); + return retcode; } if (!caps->set_vfo) { + rig_lock(rig, 0); return -RIG_ENTARGET; } @@ -117,11 +120,13 @@ int HAMLIB_API rig_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) if (retcode != RIG_OK) { + rig_lock(rig, 0); return retcode; } retcode = caps->set_level(rig, vfo, level, val); caps->set_vfo(rig, curr_vfo); + rig_lock(rig, 0); return retcode; } @@ -172,6 +177,7 @@ int HAMLIB_API rig_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) return -RIG_ENAVAIL; } + rig_lock(rig, 1); // Keep Out! /* * Special case(frontend emulation): calibrated S-meter reading */ @@ -187,10 +193,12 @@ int HAMLIB_API rig_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) if (retcode != RIG_OK) { + rig_lock(rig, 0); return retcode; } val->i = (int)rig_raw2val(rawstr.i, &rs->str_cal); + rig_lock(rig, 0); return RIG_OK; } @@ -199,12 +207,14 @@ int HAMLIB_API rig_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) || vfo == RIG_VFO_CURR || vfo == rs->current_vfo) { - - return caps->get_level(rig, vfo, level, val); + retcode = caps->get_level(rig, vfo, level, val); + rig_lock(rig, 0); + return retcode; } if (!caps->set_vfo) { + rig_lock(rig, 0); return -RIG_ENTARGET; } @@ -213,11 +223,13 @@ int HAMLIB_API rig_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) if (retcode != RIG_OK) { + rig_lock(rig, 0); return retcode; } retcode = caps->get_level(rig, vfo, level, val); caps->set_vfo(rig, curr_vfo); + rig_lock(rig, 0); return retcode; }