static GList *clients; /* data: buxton_client */
static pthread_mutex_t clients_lock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t noti_cbs_lock = PTHREAD_MUTEX_INITIALIZER;
static guint32 client_msgid;
static struct buxton_value *value_create(enum buxton_key_type type, void *value)
return -1;
}
+ pthread_mutex_lock(¬i_cbs_lock);
for (l = noti->callbacks; l; l = g_list_next(l)) {
struct bxt_noti_cb *noticb = l->data;
continue;
assert(noticb->callback);
+ pthread_mutex_unlock(¬i_cbs_lock);
noticb->callback(rqst.layer, rqst.key, rqst.val, noticb->data);
+ pthread_mutex_lock(¬i_cbs_lock);
}
+ pthread_mutex_unlock(¬i_cbs_lock);
free_request(&rqst);
return 0;
assert(noti);
assert(notify);
+ pthread_mutex_lock(¬i_cbs_lock);
for (l = noti->callbacks; l; l = g_list_next(l)) {
noticb = l->data;
if (noticb->callback == notify) {
if (noticb->deleted == FALSE) {
errno = EEXIST;
+ pthread_mutex_unlock(¬i_cbs_lock);
return -1;
}
noticb->callback = notify;
noticb->data = notify_data;
+ pthread_mutex_unlock(¬i_cbs_lock);
return 0;
}
}
noticb = calloc(1, sizeof(*noticb));
- if (!noticb)
+ if (!noticb) {
+ pthread_mutex_unlock(¬i_cbs_lock);
return -1;
+ }
noticb->deleted = FALSE;
noticb->callback = notify;
noti->callbacks = g_list_append(noti->callbacks, noticb);
+ pthread_mutex_unlock(¬i_cbs_lock);
return 0;
}
assert(noti);
+ pthread_mutex_lock(¬i_cbs_lock);
for (l = noti->callbacks, ll = g_list_next(l); l;
l = ll, ll = g_list_next(ll)) {
noticb = l->data;
free(noticb);
}
}
+ pthread_mutex_unlock(¬i_cbs_lock);
noti->id = 0;
cnt = 0;
f = FALSE;
+
+ pthread_mutex_lock(¬i_cbs_lock);
for (l = noti->callbacks; l; l = g_list_next(l)) {
struct bxt_noti_cb *noticb = l->data;
if (noticb->deleted == FALSE)
cnt++;
}
+ pthread_mutex_unlock(¬i_cbs_lock);
if (!f) {
errno = ENOENT;
if (!noti)
return;
+ pthread_mutex_lock(&clients_lock);
g_list_free_full(noti->callbacks, (GDestroyNotify)free);
+ pthread_mutex_unlock(&clients_lock);
if (noti->id) {
g_source_remove(noti->id);