(keys_len + 1) * sizeof (char *));
if (tmp == NULL)
{
- ERROR ("uc_purge: realloc failed.");
+ ERROR ("uc_check_timeout: realloc failed.");
c_avl_iterator_destroy (iter);
+ sfree (keys);
pthread_mutex_unlock (&cache_lock);
return (-1);
}
}
} /* while (c_avl_iterator_next) */
+ ce = NULL;
+
for (i = 0; i < keys_len; i++)
{
int status;
{
ERROR ("uc_check_timeout: ut_check_interesting failed.");
sfree (keys[i]);
+ continue;
}
else if (status == 0) /* ``service'' is uninteresting */
{
- ce = NULL;
DEBUG ("uc_check_timeout: %s is missing but ``uninteresting''",
keys[i]);
status = c_avl_remove (cache_tree, keys[i],
sfree (keys[i]);
sfree (key);
cache_free (ce);
+ continue;
}
- else if (status == 1) /* persist */
+
+ /* If we get here, the value is ``interesting''. Query the record from the
+ * cache and update the state field. */
+ if (c_avl_get (cache_tree, keys[i], (void *) &ce) != 0)
+ {
+ ERROR ("uc_check_timeout: cannot get data for %s from cache", keys[i]);
+ /* Do not free `keys[i]' so a notification is sent further down. */
+ continue;
+ }
+ assert (ce != NULL);
+
+ if (status == 2) /* persist */
{
DEBUG ("uc_check_timeout: %s is missing, sending notification.",
keys[i]);
ce->state = STATE_MISSING;
+ /* Do not free `keys[i]' so a notification is sent further down. */
}
- else if (status == 2) /* do not persist */
+ else if (status == 1) /* do not persist */
{
if (ce->state == STATE_MISSING)
{
DEBUG ("uc_check_timeout: %s is missing but "
"notification has already been sent.",
keys[i]);
+ /* Set `keys[i]' to NULL to no notification is sent. */
sfree (keys[i]);
}
else /* (ce->state != STATE_MISSING) */
DEBUG ("uc_check_timeout: %s is missing, sending one notification.",
keys[i]);
ce->state = STATE_MISSING;
+ /* Do not free `keys[i]' so a notification is sent further down. */
}
}
else
WARNING ("uc_check_timeout: ut_check_interesting (%s) returned "
"invalid status %i.",
keys[i], status);
+ sfree (keys[i]);
}
+
+ /* Make really sure the next iteration doesn't work with this pointer.
+ * There have been too many bugs in the past.. :/ -- octo */
+ ce = NULL;
} /* for (keys[i]) */
c_avl_iterator_destroy (iter);
if (FORMAT_VL (name, sizeof (name), vl, ds) != 0)
{
- ERROR ("uc_insert: FORMAT_VL failed.");
+ ERROR ("utils_cache: uc_get_rate: FORMAT_VL failed.");
return (NULL);
}