Example #1
0
static GSequenceIter *
find_first_proposal (GscProviderDevhelp *devhelp)
{
	GSequenceIter *iter;
	GSequenceIter *prev;

	iter = g_sequence_search (devhelp->priv->proposals,
	                          NULL,
	                          (GCompareDataFunc)compare_items,
	                          devhelp);

	if (iter == NULL)
	{
		return NULL;
	}
	
	/* Test if this position might be after the last match */
	if (!g_sequence_iter_is_begin (iter) && 
	    (g_sequence_iter_is_end (iter) || 
	     !iter_match_prefix (devhelp, iter)))
	{
		iter = g_sequence_iter_prev (iter);
	
		/* Maybe there is actually nothing in the sequence */
		if (g_sequence_iter_is_end (iter) || 
		    !iter_match_prefix (devhelp, iter))
		{
			return NULL;
		}
	}
	
	if (g_sequence_iter_is_end (iter))
	{
		return NULL;
	}

	/* Go back while it matches */
	while (iter &&
	       (prev = g_sequence_iter_prev (iter)) && 
	       iter_match_prefix (devhelp, prev))
	{
		iter = prev;
		
		if (g_sequence_iter_is_begin (iter))
		{
			break;
		}
	}
	
	return iter;
}
Example #2
0
void
swfdec_text_buffer_insert_text (SwfdecTextBuffer *buffer,
    gsize pos, const char *text)
{
  gsize len;
  GSequenceIter *iter;
  SwfdecTextBufferFormat *format;

  g_return_if_fail (SWFDEC_IS_TEXT_BUFFER (buffer));
  g_return_if_fail (pos <= buffer->text->len);
  g_return_if_fail (text != NULL);

  len = strlen (text);
  if (len == 0)
    return;
  if (pos == buffer->text->len) {
    g_string_insert_len (buffer->text, pos, text, len);
    format = swfdec_text_buffer_format_new ();
    format->start = pos;
    swfdec_text_attributes_copy (&format->attr, 
	&buffer->default_attributes, SWFDEC_TEXT_ATTRIBUTES_MASK);
    iter = g_sequence_append (buffer->attributes, format);
    swfdec_text_buffer_remove_duplicates (g_sequence_iter_prev (iter),
	g_sequence_iter_next (iter));
  } else {
    g_string_insert_len (buffer->text, pos, text, len);
    iter = g_sequence_get_end_iter (buffer->attributes);
    for (;;) {
      iter = g_sequence_iter_prev (iter);
      format = g_sequence_get (iter);
      if (format->start <= pos)
	break;
      format->start += len;
    }
  }
  CHECK_ATTRIBUTES (buffer);

  /* adapt cursor */
  if (buffer->cursor_start >= pos)
    buffer->cursor_start += len;
  if (buffer->cursor_end >= pos)
    buffer->cursor_end += len;

  g_signal_emit (buffer, signals[TEXT_CHANGED], 0);
  g_signal_emit (buffer, signals[CURSOR_CHANGED], 0,
      (gulong) MIN (buffer->cursor_start, buffer->cursor_end),
      (gulong) MAX (buffer->cursor_start, buffer->cursor_end));
}
Example #3
0
void g_sequence_remove_sorted ( GSequence * seq, gpointer data, GCompareDataFunc cmp_func, gpointer cmp_data )
{
    gpointer found;
    GSequenceIter * sj, * si = g_sequence_lookup( seq, data, cmp_func, cmp_data );
    if ( si == NULL )
        return;
    
    sj = si;
    while ( !g_sequence_iter_is_end( sj ) )
    {
        found = g_sequence_get( sj );
        if ( found == data )
            return g_sequence_remove( sj );
        else if ( cmp_func( found, data, cmp_data ) != 0 )
            break;
        sj = g_sequence_iter_next( sj );
    }
    
    sj = si;
    while ( !g_sequence_iter_is_begin( sj ) )
    {
        sj = g_sequence_iter_prev( sj );
        found = g_sequence_get( sj );
        if ( found == data )
            return g_sequence_remove( sj );
        else if ( cmp_func( found, data, cmp_data ) != 0 )
            break;
    }
}
static gpointer
photos_base_manager_get_item (GListModel *list, guint position)
{
  PhotosBaseManager *self = PHOTOS_BASE_MANAGER (list);
  PhotosBaseManagerPrivate *priv;
  GSequenceIter *iter = NULL;
  gpointer ret_val = NULL;

  priv = photos_base_manager_get_instance_private (self);

  if (priv->last_position != G_MAXUINT)
    {
      if (priv->last_position == position + 1)
        iter = g_sequence_iter_prev (priv->last_iter);
      else if (priv->last_position == position - 1)
        iter = g_sequence_iter_next (priv->last_iter);
      else if (priv->last_position == position)
        iter = priv->last_iter;
    }

  if (iter == NULL)
    iter = g_sequence_get_iter_at_pos (priv->sequence, position);

  priv->last_iter = iter;
  priv->last_position = position;

  if (g_sequence_iter_is_end (iter))
    goto out;

  ret_val = g_object_ref (g_sequence_get (iter));

 out:
  return ret_val;
}
Example #5
0
gboolean sorted_sequence_contains(SortedSequence * sequence, gpointer data)
{
	GSequenceIter * iter = g_sequence_search(sequence -> seq, data, sequence -> cmp_func, NULL);
	GSequenceIter * prev = g_sequence_iter_prev(iter);
	if (g_sequence_iter_is_end(prev)) return FALSE;
	gpointer element = g_sequence_get(prev);
	return sequence -> cmp_func(data, element, NULL) == 0;
}
Example #6
0
static gboolean
clutter_list_model_iter_is_last (ClutterModelIter *iter)
{
  ClutterListModelIter *iter_default;
  ClutterModelIter *temp_iter;
  ClutterModel *model;
  GSequence *sequence;
  GSequenceIter *begin, *end;

  iter_default = CLUTTER_LIST_MODEL_ITER (iter);
  g_assert (iter_default->seq_iter != NULL);

  if (g_sequence_iter_is_end (iter_default->seq_iter))
    return TRUE;

  model = clutter_model_iter_get_model (iter);

  sequence = CLUTTER_LIST_MODEL (model)->priv->sequence;

  begin = g_sequence_get_end_iter (sequence);
  begin = g_sequence_iter_prev (begin);
  end   = iter_default->seq_iter;

  temp_iter = CLUTTER_LIST_MODEL (model)->priv->temp_iter;

  while (!g_sequence_iter_is_begin (begin))
    {
      CLUTTER_LIST_MODEL_ITER (temp_iter)->seq_iter = begin;

      if (clutter_model_filter_iter (model, temp_iter))
        {
          end = begin;
          break;
        }

      begin = g_sequence_iter_prev (begin);
    }

  /* This is because the 'end_iter' is always *after* the last valid iter.
   * Otherwise we'd have endless loops 
   */
  end = g_sequence_iter_next (end);

  return iter_default->seq_iter == end;
}
Example #7
0
void sorted_sequence_remove(SortedSequence * sequence, gpointer data)
{
	GSequenceIter * iter = g_sequence_search(sequence -> seq, data, sequence -> cmp_func, NULL);
	GSequenceIter * prev = g_sequence_iter_prev(iter);
	gpointer element = g_sequence_get(prev);
	if(sequence -> cmp_func(data, element, NULL) == 0){
		g_sequence_remove(prev);
	}
}
Example #8
0
static ClutterModelIter *
clutter_list_model_iter_prev (ClutterModelIter *iter)
{
  ClutterListModelIter *iter_default;
  ClutterModelIter *temp_iter;
  ClutterModel *model;
  GSequenceIter *filter_prev;
  guint row;

  iter_default = CLUTTER_LIST_MODEL_ITER (iter);
  g_assert (iter_default->seq_iter != NULL);

  model = clutter_model_iter_get_model (iter);
  row   = clutter_model_iter_get_row (iter);

  filter_prev = g_sequence_iter_prev (iter_default->seq_iter);
  g_assert (filter_prev != NULL);

  temp_iter = CLUTTER_LIST_MODEL (model)->priv->temp_iter;

  while (!g_sequence_iter_is_begin (filter_prev))
    {
      CLUTTER_LIST_MODEL_ITER (temp_iter)->seq_iter = filter_prev;

      if (clutter_model_filter_iter (model, temp_iter))
        {
          row -= 1;
          break;
        }

      filter_prev = g_sequence_iter_prev (filter_prev);
    }

  if (g_sequence_iter_is_begin (filter_prev))
    row -= 1;

  /* update the iterator and return it */
  clutter_model_iter_set_row (CLUTTER_MODEL_ITER (iter_default), row);
  iter_default->seq_iter = filter_prev;

  return CLUTTER_MODEL_ITER (iter_default);
}
Example #9
0
/* return iter to format relevant for position, that is the format pointed to
 * by iter will have a lower or equal start index than pos */
static GSequenceIter *
swfdec_text_buffer_get_iter_for_pos (SwfdecTextBuffer *buffer, guint pos)
{
  SwfdecTextBufferFormat format = { pos, };
  GSequenceIter *iter;

  iter = g_sequence_search (buffer->attributes, &format,
      swfdec_text_buffer_format_compare, NULL);
  if (g_sequence_iter_is_end (iter) ||
      ((SwfdecTextBufferFormat *) g_sequence_get (iter))->start > pos)
    iter = g_sequence_iter_prev (iter);

  return iter;
}
Example #10
0
const BlueSkyRangesetItem *bluesky_rangeset_lookup(BlueSkyRangeset *rangeset,
                                                   uint64_t offset)
{
    GSequenceIter *i;
    i = g_sequence_search(rangeset->seq, &offset, compare64, NULL);
    i = g_sequence_iter_prev(i);
    if (g_sequence_iter_is_end(i))
        return NULL;

    BlueSkyRangesetItem *item = (BlueSkyRangesetItem *)g_sequence_get(i);
    if (offset >= item->start && offset < item->start + item->length)
        return item;
    else
        return NULL;
}
Example #11
0
static void
decorator_blacklist_add (TrackerDecorator *decorator,
                         gint              id)
{
	TrackerDecoratorPrivate *priv = decorator->priv;
	GSequenceIter *iter;

	iter = g_sequence_search (priv->blacklist_items,
	                          GINT_TO_POINTER (id),
	                          sequence_compare_func,
	                          NULL);

	if (g_sequence_iter_is_end (iter) ||
	    g_sequence_get (g_sequence_iter_prev (iter)) != GINT_TO_POINTER (id))
		g_sequence_insert_before (iter, GINT_TO_POINTER (id));
}
Example #12
0
/* Look up the first rangeset item starting at or following the given address.
 * Can be used to iterate through a rangeset. */
const BlueSkyRangesetItem *bluesky_rangeset_lookup_next(BlueSkyRangeset *rangeset, uint64_t offset)
{
    GSequenceIter *i;
    i = g_sequence_search(rangeset->seq, &offset, compare64, NULL);
    i = g_sequence_iter_prev(i);
    if (g_sequence_iter_is_end(i))
        return NULL;
    BlueSkyRangesetItem *item = (BlueSkyRangesetItem *)g_sequence_get(i);
    if (item->start < offset) {
        i = g_sequence_iter_next(i);
        if (g_sequence_iter_is_end(i))
            item = NULL;
        else
            item = (BlueSkyRangesetItem *)g_sequence_get(i);
    }
    return item;
}
Example #13
0
void
swfdec_text_buffer_set_attributes (SwfdecTextBuffer *buffer, gsize start,
    gsize length, const SwfdecTextAttributes *attr, guint mask)
{
  SwfdecTextBufferFormat *format;
  GSequenceIter *start_iter, *iter, *end_iter;
  gsize end;

  g_return_if_fail (SWFDEC_IS_TEXT_BUFFER (buffer));
  g_return_if_fail (start + length <= buffer->text->len);
  g_return_if_fail (length > 0);
  g_return_if_fail (attr != NULL);
  g_return_if_fail (mask != 0);

  /* ensure start and end position have an attribtues entry. If not, create one */
  end = start + length;
  start_iter = swfdec_text_buffer_get_iter_for_pos (buffer, start);
  format = g_sequence_get (start_iter);
  if (format->start < start) {
    start_iter = swfdec_text_buffer_copy_format (buffer, start_iter, start);
  }
  if (end == buffer->text->len) {
    end_iter = g_sequence_get_end_iter (buffer->attributes);
  } else {
    end_iter = swfdec_text_buffer_get_iter_for_pos (buffer, end);
    format = g_sequence_get (end_iter);
    if (format->start < end) {
      end_iter = swfdec_text_buffer_copy_format (buffer, end_iter, end);
    }
  }
  /* start_iter points to first item to modify, end_iter points after last item to modify */

  /* modify all formats in range [start_iter, end_iter) */
  for (iter = start_iter; iter != end_iter; iter = g_sequence_iter_next (iter)) {
    format = g_sequence_get (iter);
    swfdec_text_attributes_copy (&format->attr, attr, mask);
  }

  /* remove entries that are identical now */
  swfdec_text_buffer_remove_duplicates (g_sequence_iter_prev (start_iter), 
      g_sequence_iter_next (end_iter));
  CHECK_ATTRIBUTES (buffer);

  g_signal_emit (buffer, signals[TEXT_CHANGED], 0);
}
Example #14
0
gboolean bluesky_rangeset_insert(BlueSkyRangeset *rangeset,
                                 uint64_t start, uint64_t length,
                                 gpointer data)
{
    GSequenceIter *i;
    i = g_sequence_search(rangeset->seq, &start, compare64, NULL);
    i = g_sequence_iter_prev(i);

    /* TODO: Checks that no other item overlaps. */

    BlueSkyRangesetItem *item = g_new(BlueSkyRangesetItem, 1);
    item->start = start;
    item->length = length;
    item->data = data;
    g_sequence_insert_sorted(rangeset->seq, item, compare64, NULL);

    return TRUE;
}
Example #15
0
/* removes duplicates in the range [iter, end) */
static void
swfdec_text_buffer_remove_duplicates (GSequenceIter *iter, GSequenceIter *end)
{
  SwfdecTextBufferFormat *format, *next;

  g_assert (iter != end);

  format = g_sequence_get (iter);
  for (iter = g_sequence_iter_next (iter); iter != end; iter = g_sequence_iter_next (iter)) {
    next = g_sequence_get (iter);
    if (swfdec_text_attributes_diff (&format->attr, &next->attr) == 0) {
      GSequenceIter *prev = g_sequence_iter_prev (iter);
      g_sequence_remove (iter);
      iter = prev;
    } else {
      format = next;
    }
  }
}
/**
 * gst_timed_value_control_source_find_control_point_iter:
 * @self: the control source to search in
 * @timestamp: the search key
 *
 * Find last value before given timestamp in control point list.
 * If all values in the control point list come after the given
 * timestamp or no values exist, %NULL is returned.
 *
 * For use in control source implementations.
 *
 * Returns: (transfer none): the found #GSequenceIter or %NULL
 */
GSequenceIter *gst_timed_value_control_source_find_control_point_iter
    (GstTimedValueControlSource * self, GstClockTime timestamp)
{
  GSequenceIter *iter;

  if (!self->values)
    return NULL;

  iter =
      g_sequence_search (self->values, &timestamp,
      (GCompareDataFunc) gst_control_point_find, NULL);

  /* g_sequence_search() returns the iter where timestamp
   * would be inserted, i.e. the iter > timestamp, so
   * we need to get the previous one. And of course, if
   * there is no previous one, we return NULL. */
  if (g_sequence_iter_is_begin (iter))
    return NULL;

  return g_sequence_iter_prev (iter);
}
Example #17
0
RmOff rm_offset_bytes_to_next_fragment(RmOffsetTable offset_list, RmOff file_offset) {
    if (offset_list != NULL) {
        RmOffsetEntry token;
        token.physical = 0;
        token.logical = file_offset;

        GSequenceIter *next_fragment = g_sequence_iter_prev(
                                           g_sequence_search(
                                               offset_list, &token,
                                               (GCompareDataFunc)rm_offset_find_logical, NULL
                                           )
                                       );

        if(!g_sequence_iter_is_end(next_fragment) && !g_sequence_iter_is_begin(next_fragment) ) {
            RmOffsetEntry *off = g_sequence_get(next_fragment);
            return off->logical - file_offset;
        }
    }
    /* default to 0 always */
    return 0;
}
Example #18
0
/* Determine the full extent of a rangeset--the smallest offset covered and the
 * length needed to extend to the end of the last item. */
void bluesky_rangeset_get_extents(BlueSkyRangeset *rangeset,
                                  uint64_t *start, uint64_t *length)
{
    GSequenceIter *i;
    BlueSkyRangesetItem *item;

    i = g_sequence_get_begin_iter(rangeset->seq);
    if (g_sequence_iter_is_end(i)) {
        *start = 0;
        *length = 0;
        return;
    }

    item = (BlueSkyRangesetItem *)g_sequence_get(i);
    *start = item->start;

    i = g_sequence_get_end_iter(rangeset->seq);
    i = g_sequence_iter_prev(i);
    item = (BlueSkyRangesetItem *)g_sequence_get(i);
    *length = (item->start + item->length) - *start;
}
Example #19
0
static GObject *
photos_base_manager_default_get_previous_object (PhotosBaseManager *self, GObject *object)
{
  PhotosBaseManagerPrivate *priv;
  GObject *ret_val = NULL;
  GSequenceIter *iter;
  PhotosBaseManagerObjectData *object_data;
  const gchar *id;

  priv = photos_base_manager_get_instance_private (self);

  id = photos_filterable_get_id (PHOTOS_FILTERABLE (object));
  object_data = g_hash_table_lookup (priv->objects, id);
  g_return_val_if_fail (object_data != NULL, NULL);

  iter = g_sequence_iter_prev (object_data->iter);
  if (g_sequence_iter_compare (iter, object_data->iter) == 0)
    goto out;

  ret_val = G_OBJECT (g_sequence_get (iter));

 out:
  return ret_val;
}
Example #20
0
static ClutterModelIter *
clutter_list_model_get_iter_at_row (ClutterModel *model,
                                    guint         row)
{
  ClutterListModel *model_default = CLUTTER_LIST_MODEL (model);
  GSequence *sequence = model_default->priv->sequence;
  gint seq_length = g_sequence_get_length (sequence);
  ClutterListModelIter *retval;

  if (row >= seq_length)
    return NULL;

  retval = g_object_new (CLUTTER_TYPE_LIST_MODEL_ITER,
                         "model", model,
                         "row", row,
                         NULL);

  /* short-circuit in case we don't have a filter in place */
  if (!clutter_model_get_filter_set (model))
    {
      retval->seq_iter = g_sequence_get_iter_at_pos (sequence, row);

      return CLUTTER_MODEL_ITER (retval);
    }

  if (row == 0)
    {
      GSequenceIter *filter_next;
      gboolean row_found = FALSE;

      filter_next = g_sequence_get_begin_iter (sequence);
      g_assert (filter_next != NULL);

      while (!g_sequence_iter_is_end (filter_next))
        {
          retval->seq_iter = filter_next;

          if (clutter_model_filter_iter (model, CLUTTER_MODEL_ITER (retval)))
            {
              /* We've found a row that is valid under the filter */
              row_found = TRUE;
              break;
            }

          filter_next = g_sequence_iter_next (filter_next);
        }

      /* Everything has been filtered -> there is no first row */
      if (!row_found)
        {
          g_object_unref (retval);
          return NULL;
        }
    }
  else
    {
      GSequenceIter *filter_prev;

      filter_prev = g_sequence_get_end_iter (sequence);
      g_assert (filter_prev != NULL);

      filter_prev = g_sequence_iter_prev (filter_prev);

      while (!g_sequence_iter_is_begin (filter_prev))
        {
          retval->seq_iter = filter_prev;

          if (clutter_model_filter_iter (model, CLUTTER_MODEL_ITER (retval)))
            break;

          filter_prev = g_sequence_iter_prev (filter_prev);
        }
    }

  return CLUTTER_MODEL_ITER (retval);
}
Example #21
0
gboolean rclib_lyric_load_file(const gchar *filename, guint index)
{
    RCLibLyricParsedData *parsed_data;
    gchar *line;
    GFile *file;
    GFileInputStream *input_stream;
    GDataInputStream *data_stream;
    gsize line_len;
    gint64 time = -1;
    RCLibLyricPrivate *priv;
    GSequenceIter *iter;
    RCLibLyricData *lyric_data;
    rclib_lyric_clean(index);
    if(lyric_instance==NULL) return FALSE;
    if(filename==NULL) return FALSE;
    priv = RCLIB_LYRIC(lyric_instance)->priv;
    if(priv==NULL) return FALSE;
    file = g_file_new_for_path(filename);
    if(file==NULL) return FALSE;
    if(!g_file_query_exists(file, NULL))
    {
        g_object_unref(file);
        return FALSE;
    }
    input_stream = g_file_read(file, NULL, NULL);
    g_object_unref(file);
    if(input_stream==NULL) return FALSE;
    data_stream = g_data_input_stream_new(G_INPUT_STREAM(input_stream));
    g_object_unref(input_stream);
    if(data_stream==NULL) return FALSE;
    g_data_input_stream_set_newline_type(data_stream,
        G_DATA_STREAM_NEWLINE_TYPE_ANY);
    if(index==1)
        parsed_data = &(priv->parsed_data2);
    else
        parsed_data = &(priv->parsed_data1);
    if(index!=1) index = 0;
    while((line=g_data_input_stream_read_line(data_stream, &line_len,
        NULL, NULL))!=NULL)
    {
        rclib_lyric_add_line(parsed_data, priv->regex, priv->encoding,
            line, line_len);
        g_free(line);
    }
    g_object_unref(data_stream);
    for(iter = g_sequence_get_end_iter(parsed_data->seq);
        !g_sequence_iter_is_begin(iter);)
    {
        iter = g_sequence_iter_prev(iter);
        lyric_data = g_sequence_get(iter);
        if(lyric_data==NULL) continue;
        if(time>=0)
        {
            lyric_data->length = time - lyric_data->time;
        }
        time = lyric_data->time;
    }
    parsed_data->filename = g_strdup(filename);
    g_signal_emit(lyric_instance, lyric_signals[SIGNAL_LYRIC_READY], 0,
        index);
    return TRUE;
}
Example #22
0
void close_har() {
	sds fname = sdsdup(destor.working_directory);
	fname = sdscat(fname, "recipes/bv");
	char s[20];
	sprintf(s, "%d", jcr.id);
	fname = sdscat(fname, s);
	fname = sdscat(fname, ".sparse");

	FILE* fp = fopen(fname, "w");
	if (!fp) {
		fprintf(stderr, "Can not create sparse file");
		perror("The reason is");
		exit(1);
	}

	jcr.total_container_num = g_hash_table_size(container_utilization_monitor);

	GSequence *seq = g_sequence_new(NULL);
	int64_t total_size = 0;
	int64_t sparse_size = 0;

	/* collect sparse containers */
	GHashTableIter iter;
	gpointer key, value;
	g_hash_table_iter_init(&iter, container_utilization_monitor);
	while (g_hash_table_iter_next(&iter, &key, &value)) {
		struct containerRecord* cr = (struct containerRecord*) value;
		total_size += cr->size;

		if((1.0*cr->size/(CONTAINER_SIZE - CONTAINER_META_SIZE))
				< destor.rewrite_har_utilization_threshold){
			/* It is sparse */
			if (inherited_sparse_containers
					&& g_hash_table_lookup(inherited_sparse_containers, &cr->cid))
				/* It is an inherited sparse container */
				jcr.inherited_sparse_num++;

			jcr.sparse_container_num++;
			sparse_size += cr->size;

			g_sequence_insert_sorted(seq, cr, g_record_cmp, NULL);
		}
	}

	/*
	 * If the sparse size is too large,
	 * we need to trim the sequence to control the rewrite ratio.
	 * We use sparse_size/total_size to estimate the rewrite ratio of next backup.
	 * However, the estimation is inaccurate (generally over-estimating), since:
	 * 	1. the sparse size is not an accurate indicator of utilization for next backup.
	 * 	2. self-references.
	 */
	while(sparse_size*1.0/total_size > destor.rewrite_har_rewrite_limit){
		/*
		 * The expected rewrite ratio exceeds the limit.
		 * We trim the last several records in the sequence.
		 * */
		GSequenceIter* iter = g_sequence_iter_prev(g_sequence_get_end_iter(seq));
		struct containerRecord* r = g_sequence_get(iter);
		NOTICE("Trim sparse container %lld", r->cid);
		sparse_size -= r->size;
		g_sequence_remove(iter);
	}

	GSequenceIter* sparse_iter = g_sequence_get_begin_iter(seq);
	while(sparse_iter != g_sequence_get_end_iter(seq)){
		struct containerRecord* r = g_sequence_get(sparse_iter);
		fprintf(fp, "%lld %d\n", r->cid, r->size);
		sparse_iter = g_sequence_iter_next(sparse_iter);
	}
	fclose(fp);

	NOTICE("Record %d sparse containers, and %d of them are inherited",
			g_sequence_get_length(seq),	jcr.inherited_sparse_num);

	g_sequence_free(seq);
	sdsfree(fname);
}