+2004-07-16 Chris Toshok <toshok@ximian.com>
+
+ [ fixes #61052 ]
+
+ * libebook/e-book.c (e_book_op_remove): lock the book's mutex
+ around operations on the id_to_op hashtable, as is done in all
+ other e_book_* functions.
+ (emit_async_add_contact_response): lock the book's mutex around
+ operations on the pending_idle list.
+ (e_book_response_add_contact): same.
+ (emit_async_elist_response): same.
+ (e_book_response_get_supported_fields): same.
+ (e_book_response_get_supported_auth_methods): same.
+ (emit_async_get_contact_response): same.
+ (e_book_response_get_contact): same.
+ (emit_async_get_book_view_response): same.
+ (e_book_response_get_book_view): same.
+ (emit_async_get_contacts_response): same.
+ (e_book_response_get_contacts): same.
+ (emit_async_get_changes_response): same.
+ (e_book_response_get_changes): same.
+ (emit_async_generic_response): same.
+ (e_book_response_generic): same.
+ (emit_async_open_response): same.
+ (e_book_response_open): same.
+ (e_book_response_remove): same.
+
2004-07-14 Chris Toshok <toshok@ximian.com>
* libebook/e-book.c (e_book_idle_writable): simplify this a bit,
e_book_op_remove (EBook *book,
EBookOp *op)
{
+ g_mutex_lock (book->priv->mutex);
g_hash_table_remove (book->priv->id_to_op,
&op->opid);
+ g_mutex_unlock (book->priv->mutex);
}
static void
g_free (op->id);
+ g_mutex_lock (book->priv->mutex);
book->priv->pending_idles = g_list_remove (book->priv->pending_idles,
GINT_TO_POINTER (op->idle_id));
+ g_mutex_unlock (book->priv->mutex);
e_book_clear_op (book, op);
op->book = g_object_ref (book);
op->idle_id = g_idle_add (emit_async_add_contact_response, op);
+ g_mutex_lock (book->priv->mutex);
book->priv->pending_idles = g_list_prepend (book->priv->pending_idles,
GINT_TO_POINTER (op->idle_id));
+ g_mutex_unlock (book->priv->mutex);
}
}
g_object_unref (op->elist);
+ g_mutex_lock (book->priv->mutex);
book->priv->pending_idles = g_list_remove (book->priv->pending_idles,
GINT_TO_POINTER (op->idle_id));
+ g_mutex_unlock (book->priv->mutex);
e_book_clear_op (book, op);
op->elist = efields;
op->idle_id = g_idle_add (emit_async_elist_response, op);
+ g_mutex_lock (book->priv->mutex);
book->priv->pending_idles = g_list_prepend (book->priv->pending_idles,
GINT_TO_POINTER (op->idle_id));
+ g_mutex_unlock (book->priv->mutex);
}
}
op->elist = emethods;
op->idle_id = g_idle_add (emit_async_elist_response, op);
+ g_mutex_lock (book->priv->mutex);
book->priv->pending_idles = g_list_prepend (book->priv->pending_idles,
GINT_TO_POINTER (op->idle_id));
+ g_mutex_unlock (book->priv->mutex);
}
}
g_object_unref (op->contact);
+ g_mutex_lock (book->priv->mutex);
book->priv->pending_idles = g_list_remove (book->priv->pending_idles,
GINT_TO_POINTER (op->idle_id));
+ g_mutex_unlock (book->priv->mutex);
e_book_clear_op (book, op);
op->book = g_object_ref (book);
op->idle_id = g_idle_add (emit_async_get_contact_response, op);
+ g_mutex_lock (book->priv->mutex);
book->priv->pending_idles = g_list_prepend (book->priv->pending_idles,
GINT_TO_POINTER (op->idle_id));
+ g_mutex_unlock (book->priv->mutex);
}
}
g_object_unref (op->view);
+ g_mutex_lock (book->priv->mutex);
book->priv->pending_idles = g_list_remove (book->priv->pending_idles,
GINT_TO_POINTER (op->idle_id));
+ g_mutex_unlock (book->priv->mutex);
e_book_clear_op (book, op);
op->book = g_object_ref (book);
op->idle_id = g_idle_add (emit_async_get_book_view_response, op);
+ g_mutex_lock (book->priv->mutex);
book->priv->pending_idles = g_list_prepend (book->priv->pending_idles,
GINT_TO_POINTER (op->idle_id));
+ g_mutex_unlock (book->priv->mutex);
}
}
g_list_foreach (op->list, (GFunc)g_object_unref, NULL);
g_list_free (op->list);
+ g_mutex_lock (book->priv->mutex);
book->priv->pending_idles = g_list_remove (book->priv->pending_idles,
GINT_TO_POINTER (op->idle_id));
+ g_mutex_unlock (book->priv->mutex);
+
e_book_clear_op (book, op);
g_object_unref (book);
op->book = g_object_ref (book);
op->status = status;
op->idle_id = g_idle_add (emit_async_get_contacts_response, op);
+ g_mutex_lock (book->priv->mutex);
book->priv->pending_idles = g_list_prepend (book->priv->pending_idles,
GINT_TO_POINTER (op->idle_id));
+ g_mutex_unlock (book->priv->mutex);
}
}
op->cb.list (book, op->status, op->list, op->closure);
e_book_free_change_list (op->list);
+ g_mutex_lock (book->priv->mutex);
book->priv->pending_idles = g_list_remove (book->priv->pending_idles,
GINT_TO_POINTER (op->idle_id));
+ g_mutex_unlock (book->priv->mutex);
+
e_book_clear_op (book, op);
g_object_unref (book);
else {
op->book = g_object_ref (book);
op->idle_id = g_idle_add (emit_async_get_changes_response, op);
+ g_mutex_lock (book->priv->mutex);
book->priv->pending_idles = g_list_prepend (book->priv->pending_idles,
GINT_TO_POINTER (op->idle_id));
+ g_mutex_unlock (book->priv->mutex);
}
}
if (op->cb.status)
op->cb.status (book, op->status, op->closure);
+ g_mutex_lock (book->priv->mutex);
book->priv->pending_idles = g_list_remove (book->priv->pending_idles,
GINT_TO_POINTER (op->idle_id));
+ g_mutex_unlock (book->priv->mutex);
+
e_book_clear_op (book, op);
g_object_unref (book);
op->book = g_object_ref (book);
op->status = status;
op->idle_id = g_idle_add (emit_async_generic_response, op);
+ g_mutex_lock (book->priv->mutex);
book->priv->pending_idles = g_list_prepend (book->priv->pending_idles,
GINT_TO_POINTER (op->idle_id));
+ g_mutex_unlock (book->priv->mutex);
}
}
if (op->cb.status)
op->cb.status (book, op->status, op->closure);
+ g_mutex_lock (book->priv->mutex);
book->priv->pending_idles = g_list_remove (book->priv->pending_idles,
GINT_TO_POINTER (op->idle_id));
+ g_mutex_unlock (book->priv->mutex);
+
e_book_clear_op (book, op);
g_object_unref (book);
op->book = g_object_ref (book);
op->status = status;
op->idle_id = g_idle_add (emit_async_open_response, op);
+ g_mutex_lock (book->priv->mutex);
book->priv->pending_idles = g_list_prepend (book->priv->pending_idles,
GINT_TO_POINTER (op->idle_id));
+ g_mutex_unlock (book->priv->mutex);
}
}
op->book = g_object_ref (book);
op->status = status;
op->idle_id = g_idle_add (emit_async_generic_response, op);
+ g_mutex_lock (book->priv->mutex);
book->priv->pending_idles = g_list_prepend (book->priv->pending_idles,
GINT_TO_POINTER (op->idle_id));
+ g_mutex_unlock (book->priv->mutex);
}
}