Skip to content

Engine: account for multiple simultaneous subscriptions to the same path

Fixes #2 (closed)

Motivation

There is currently a bug in how subscriptions are handled which causes clients to sometimes not be notified about changes to the database that they have subscribed to: #2 (closed)

Background

It is possible for clients to have many subscriptions to the same key path. Before !1 (merged), this was handled simply by adding/removing the corresponding D-Bus match rule every time a client unsubscribed. !1 (merged) however incorrectly assumes that there is only one subscription to each path, and that the client library handled deduplicating subscriptions, when it fact is was D-Bus that handled this.

Changes

  • Instead of storing a set of paths in the pending/establishing and active/watched states like !1 (merged), store the number of subscriptions for each path in a hash table. This generalises to multiple simultaneous subscriptions, since the count can be increased when subscribing and decreased when unsubscribing to ensure that the D-Bus match rule (only one) is removed when the number of client subscriptions falls to zero.
  • Add a lock subscription_count_lock around access to these hash tables, to ensure that the process of changing a subscription's state is atomic and thread safe.
  • Add items to dconf_engine_unref which were previously missing
  • Add debug logging statements

TODO

  • Add/extend unit tests to more thoroughly test this new behaviour
  • Add spaces before function parentheses and fix other syntax related style issues
Edited by Daniel Playfair Cal

Merge request reports