summaryrefslogtreecommitdiffstats
path: root/options/m_config.c
diff options
context:
space:
mode:
Diffstat (limited to 'options/m_config.c')
-rw-r--r--options/m_config.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/options/m_config.c b/options/m_config.c
index 318ced3d34..52a9b2f6d8 100644
--- a/options/m_config.c
+++ b/options/m_config.c
@@ -1538,7 +1538,7 @@ static void find_opt(struct m_config_shadow *shadow, struct m_config_data *data,
}
}
-void m_config_cache_write_opt(struct m_config_cache *cache, void *ptr)
+bool m_config_cache_write_opt(struct m_config_cache *cache, void *ptr)
{
struct config_cache *in = cache->internal;
struct m_config_shadow *shadow = in->shadow;
@@ -1559,17 +1559,22 @@ void m_config_cache_write_opt(struct m_config_cache *cache, void *ptr)
struct m_group_data *gsrc = m_config_gdata(in->src, group_idx);
assert(gdst && gsrc);
- m_option_copy(opt, gsrc->udata + opt->offset, ptr);
+ bool changed = !m_option_equal(opt, gsrc->udata + opt->offset, ptr);
+ if (changed) {
+ m_option_copy(opt, gsrc->udata + opt->offset, ptr);
- gsrc->ts = atomic_fetch_add(&shadow->ts, 1) + 1;
+ gsrc->ts = atomic_fetch_add(&shadow->ts, 1) + 1;
- for (int n = 0; n < shadow->num_listeners; n++) {
- struct config_cache *listener = shadow->listeners[n];
- if (listener->wakeup_cb && m_config_gdata(listener->data, group_idx))
- listener->wakeup_cb(listener->wakeup_cb_ctx);
+ for (int n = 0; n < shadow->num_listeners; n++) {
+ struct config_cache *listener = shadow->listeners[n];
+ if (listener->wakeup_cb && m_config_gdata(listener->data, group_idx))
+ listener->wakeup_cb(listener->wakeup_cb_ctx);
+ }
}
pthread_mutex_unlock(&shadow->lock);
+
+ return changed;
}
void m_config_notify_change_co(struct m_config *config,