g_static_rec_mutex_lock (&priv->mutex);
+ e_cal_component_get_uid (comp, &uid);
+ rid = e_cal_component_get_recurid_as_string (comp);
+ e_intervaltree_remove (tree, uid, rid);
+
x = g_new (EIntervalNode, 1);
x->min = x->start = start;
x->max = x->end = end;
}
priv->root->left->red = FALSE;
- e_cal_component_get_uid (comp, &uid);
- rid = e_cal_component_get_recurid_as_string (comp);
g_hash_table_insert (priv->id_node_hash, component_key (uid, rid), newNode);
g_free (rid);
/**
* Caller should hold the lock.
**/
-static EIntervalNode*
+static EIntervalNode *
e_intervaltree_search_component (EIntervalTree *tree,
const gchar *searched_uid,
const gchar *searched_rid)
{
EIntervalTreePrivate *priv;
+ EIntervalNode *node;
+ gchar *key;
+
g_return_val_if_fail (tree != NULL, NULL);
g_return_val_if_fail (searched_uid != NULL, NULL);
return NULL;
}
- return g_hash_table_lookup (priv->id_node_hash, component_key (searched_uid, searched_rid));
+ key = component_key (searched_uid, searched_rid);
+ node = g_hash_table_lookup (priv->id_node_hash, key);
+ g_free (key);
+
+ return node;
}
/**
EIntervalNode *x;
EIntervalNode *z;
EIntervalNode *nil, *root;
+ gchar *key;
g_return_val_if_fail (tree != NULL, FALSE);
z = e_intervaltree_search_component (tree, uid, rid);
- if (!z || z == nil)
- {
- g_message (G_STRLOC ": Cannot remove node - could not find node in tree\n");
+ if (!z || z == nil) {
g_static_rec_mutex_unlock (&priv->mutex);
return FALSE;
}
e_intervaltree_fixup_deletion (tree, x);
}
- g_hash_table_remove (priv->id_node_hash, component_key (uid, rid));
+ key = component_key (uid, rid);
+ g_hash_table_remove (priv->id_node_hash, key);
+ g_free (key);
g_object_unref (z->comp);
g_free (z);
{
EIntervalTreePrivate *priv;
EIntervalNode *root, *nil;
- priv = g_new0 (EIntervalTreePrivate, 1);
- tree->priv = priv;
+
+ tree->priv = E_INTERVALTREE_GET_PRIVATE (tree);
+ priv = tree->priv;
priv->nil = nil = g_new (EIntervalNode, 1);
nil->parent = nil->left = nil->right = nil;
create_test_component (time_t start, time_t end)
{
ECalComponent *comp = e_cal_component_new ();
- ECalComponentText *summary;
+ ECalComponentText summary;
struct icaltimetype current;
e_cal_component_set_new_vtype (comp, E_CAL_COMPONENT_EVENT);
e_cal_component_set_dtend (comp, &dtend);
*/
- summary = g_new (ECalComponentText, 1);
+ summary.value = g_strdup_printf ("%ld - %ld", start, end);
+ summary.altrep = NULL;
- summary->value = g_strdup_printf ("%ld - %ld", start, end);
- summary->altrep = NULL;
+ e_cal_component_set_summary (comp, &summary);
- e_cal_component_set_summary (comp, summary);
+ g_free ((gchar *) summary.value);
current = icaltime_from_timet (time (NULL), 0);
e_cal_component_set_created (comp, ¤t);
*/
static void
-random_test ()
+random_test (void)
{
/*
* outline:
interval->start = start;
interval->end = end;
interval->comp = comp;
- g_object_ref (comp);
list = g_list_insert (list, interval, -1);
interval->start = start;
interval->end = _TIME_MAX;
interval->comp = comp;
- g_object_ref (comp);
list = g_list_insert (list, interval, -1);
e_intervaltree_insert (tree, start, interval->end, comp);
g_list_free (list);
}
+static void
+mem_test (void)
+{
+ EIntervalTree *tree;
+ time_t start = 10, end = 50;
+ ECalComponent *comp = create_test_component (start, end), *clone_comp;
+ const gchar *uid;
+ gchar *rid;
+
+ tree = e_intervaltree_new ();
+
+ g_assert (((GObject *) comp)->ref_count == 1);
+ e_intervaltree_insert (tree, start, end, comp);
+ g_assert (((GObject *) comp)->ref_count == 2);
+
+ e_cal_component_get_uid (comp, &uid);
+ rid = e_cal_component_get_recurid_as_string (comp);
+ e_intervaltree_remove (tree, uid, rid);
+ g_free (rid);
+ g_assert (((GObject *) comp)->ref_count == 1);
+
+ e_intervaltree_insert (tree, start, end, comp);
+ g_assert (((GObject *) comp)->ref_count == 2);
+
+ clone_comp = e_cal_component_clone (comp);
+ e_intervaltree_insert (tree, start, end, clone_comp);
+
+ g_assert (((GObject *) comp)->ref_count == 1);
+ g_assert (((GObject *) clone_comp)->ref_count == 2);
+
+ e_intervaltree_destroy (tree);
+
+ g_assert (((GObject *) comp)->ref_count == 1);
+ g_assert (((GObject *) clone_comp)->ref_count == 1);
+
+ g_object_unref (comp);
+ g_object_unref (clone_comp);
+}
+
gint
main (gint argc, gchar **argv)
{
g_type_init ();
myrand = g_rand_new ();
+ mem_test ();
random_test ();
g_print ("Everything OK\n");