gboolean marked_for_offline;
/* our operations */
- GRecMutex op_hash_mutex;
+ GRecMutex op_hash_mutex; /* lock also eds_ldap_handler_lock before this lock */
GHashTable *id_to_op;
gint active_ops;
guint poll_timeout;
op->handler = handler;
op->dtor = dtor;
+ g_rec_mutex_lock (&eds_ldap_handler_lock);
g_rec_mutex_lock (&bl->priv->op_hash_mutex);
if (g_hash_table_lookup (bl->priv->id_to_op, &op->id)) {
g_warning ("conflicting ldap msgid's");
LDAP_POLL_INTERVAL,
(GSourceFunc) poll_ldap, bl);
g_rec_mutex_unlock (&bl->priv->op_hash_mutex);
+ g_rec_mutex_unlock (&eds_ldap_handler_lock);
}
static void
EBookBackend *backend = op->backend;
EBookBackendLDAP *bl = E_BOOK_BACKEND_LDAP (backend);
+ g_rec_mutex_lock (&eds_ldap_handler_lock);
g_rec_mutex_lock (&bl->priv->op_hash_mutex);
g_hash_table_remove (bl->priv->id_to_op, &op->id);
book_view_notify_status (bl, find_book_view (bl), "");
/* should handle errors here */
- g_rec_mutex_lock (&eds_ldap_handler_lock);
if (bl->priv->ldap)
ldap_abandon (bl->priv->ldap, op->id);
- g_rec_mutex_unlock (&eds_ldap_handler_lock);
if (op->dtor)
op->dtor (op);
}
}
g_rec_mutex_unlock (&bl->priv->op_hash_mutex);
+ g_rec_mutex_unlock (&eds_ldap_handler_lock);
}
static void
EBookBackend *backend = op->backend;
EBookBackendLDAP *bl = E_BOOK_BACKEND_LDAP (backend);
+ g_rec_mutex_lock (&eds_ldap_handler_lock);
g_rec_mutex_lock (&bl->priv->op_hash_mutex);
g_hash_table_remove (bl->priv->id_to_op, &op->id);
g_hash_table_insert (bl->priv->id_to_op, &op->id, op);
g_rec_mutex_unlock (&bl->priv->op_hash_mutex);
+ g_rec_mutex_unlock (&eds_ldap_handler_lock);
}
static GError *
LDAPOp *op = value;
/* ignore errors, its only best effort? */
- g_rec_mutex_lock (&eds_ldap_handler_lock);
+ /* lock is held by the caller */
+ /* g_rec_mutex_lock (&eds_ldap_handler_lock); */
if (bl->priv->ldap)
ldap_abandon (bl->priv->ldap, op->id);
- g_rec_mutex_unlock (&eds_ldap_handler_lock);
+ /* g_rec_mutex_unlock (&eds_ldap_handler_lock); */
}
static void
{
EBookBackendLDAP *bl = E_BOOK_BACKEND_LDAP (backend);
+ g_rec_mutex_lock (&eds_ldap_handler_lock);
g_rec_mutex_lock (&bl->priv->op_hash_mutex);
g_hash_table_foreach (bl->priv->id_to_op, ldap_cancel_op, bl);
g_rec_mutex_unlock (&bl->priv->op_hash_mutex);
+ g_rec_mutex_unlock (&eds_ldap_handler_lock);
}
static void
bl = E_BOOK_BACKEND_LDAP (op->backend);
- g_rec_mutex_lock (&eds_ldap_handler_lock);
+ /* lock is held by the caller */
+ /* g_rec_mutex_lock (&eds_ldap_handler_lock); */
if (bl->priv->ldap)
ldap_abandon (bl->priv->ldap, op->id);
- g_rec_mutex_unlock (&eds_ldap_handler_lock);
+ /* g_rec_mutex_unlock (&eds_ldap_handler_lock); */
op->dtor (op);
priv = E_BOOK_BACKEND_LDAP_GET_PRIVATE (object);
+ g_rec_mutex_lock (&eds_ldap_handler_lock);
g_rec_mutex_lock (&priv->op_hash_mutex);
g_hash_table_foreach_remove (priv->id_to_op, (GHRFunc) call_dtor, NULL);
g_hash_table_destroy (priv->id_to_op);
g_rec_mutex_unlock (&priv->op_hash_mutex);
+ g_rec_mutex_unlock (&eds_ldap_handler_lock);
g_rec_mutex_clear (&priv->op_hash_mutex);
/* Remove the timeout before unbinding to avoid a race. */