Ejemplo n.º 1
0
END_TEST


START_TEST (test_config_lists_excl) {
    char *list_ops[] = { "sources", NULL };
    tn_hash *cnf, *s;
    tn_array *lines, *list;
    int i, maxno = 0;

    lines = n_array_new(16, 0, 0);

    i = 0;
    while (list_ops[i]) {
        maxno = 3;
        while (maxno >= 0) {
            n_array_push(lines, make_conf_line(list_ops[i], maxno, ' '));
            maxno--;
        }
        i++;
    }

    cnf = poldek_conf_addlines(NULL, "source", lines);
    fail_if(cnf == NULL, "load config failed");

    s = poldek_conf_get_section(cnf, "source");
    fail_if(s == NULL, "no source section?");

    i = 0;
    while (list_ops[i]) {
        list = poldek_conf_get_multi(s, list_ops[i]);
        fail_if(list == NULL, "no %s?", list_ops[i]);
        verify_list(list, 1, list_ops[i]);   /* maxno = 1 */
        i++;
    }
}
static void load_balance(int n, int non_zero, int *row_ind_tmp) {

    int proc_id, i, local_nz, local_nz_acc, A, B;

    local_nz = local_nz_acc = non_zero/nproc;

    /* number of rows owned by each process is stored in proc_row_list. This
       is supposed to be well load balanced, so that each process has almost
       same number of non-zero elements */
    proc_id = 0;
    if(me==0) printf("local_nz = %d\n", local_nz);
    for(i=0; i<n; i++) { /* as # of entries in row_ind_tmp = n+1 */
        if(row_ind_tmp[i] < local_nz_acc && row_ind_tmp[i+1] >= local_nz_acc) {
            proc_row_list[proc_id++] = i+1;
            local_nz_acc = local_nz*(proc_id+1);
            if(proc_id == nproc-1) local_nz_acc = non_zero;
            if(me==0 && proc_id<nproc) printf("local_nz = %d\n", local_nz_acc);
        }
    }

    proc_row_list[nproc-1] = n;

    for(i=0; i<nproc; i++) {
        A = (i==0) ? 0: proc_row_list[i-1];/* # of entries in row_ind_tmp is n+1*/
        B = proc_row_list[i];
        proc_nz_list[i] = row_ind_tmp[B]-row_ind_tmp[A];
    }

    if(proc_id != nproc)
        ARMCI_Error("Error while preparing Process Row list", proc_id-1);

#if 1
    if(me==0) verify_list(proc_row_list);
#endif

}
Ejemplo n.º 3
0
/**
 * @ingroup DBusListInternals
 * Unit test for DBusList
 * @returns #TRUE on success.
 */
dbus_bool_t
_dbus_list_test (void)
{
  DBusList *list1;
  DBusList *list2;
  DBusList *link1;
  DBusList *link2;
  DBusList *copy1;
  DBusList *copy2;
  int i;
  
  list1 = NULL;
  list2 = NULL;

  /* Test append and prepend */
  
  i = 0;
  while (i < 10)
    {
      if (!_dbus_list_append (&list1, _DBUS_INT_TO_POINTER (i)))
        _dbus_assert_not_reached ("could not allocate for append");
      
      if (!_dbus_list_prepend (&list2, _DBUS_INT_TO_POINTER (i)))
        _dbus_assert_not_reached ("count not allocate for prepend");
      ++i;

      verify_list (&list1);
      verify_list (&list2);
      
      _dbus_assert (_dbus_list_get_length (&list1) == i);
      _dbus_assert (_dbus_list_get_length (&list2) == i);
    }

  _dbus_assert (is_ascending_sequence (&list1));
  _dbus_assert (is_descending_sequence (&list2));

  /* Test list clear */
  _dbus_list_clear (&list1);
  _dbus_list_clear (&list2);

  verify_list (&list1);
  verify_list (&list2);

  /* Test get_first, get_last, pop_first, pop_last */
  
  i = 0;
  while (i < 10)
    {
      _dbus_list_append (&list1, _DBUS_INT_TO_POINTER (i));
      _dbus_list_prepend (&list2, _DBUS_INT_TO_POINTER (i));
      ++i;
    }

  --i;
  while (i >= 0)
    {
      void *got_data1;
      void *got_data2;
      
      void *data1;
      void *data2;

      got_data1 = _dbus_list_get_last (&list1);
      got_data2 = _dbus_list_get_first (&list2);
      
      data1 = _dbus_list_pop_last (&list1);
      data2 = _dbus_list_pop_first (&list2);

      _dbus_assert (got_data1 == data1);
      _dbus_assert (got_data2 == data2);
      
      _dbus_assert (_DBUS_POINTER_TO_INT (data1) == i);
      _dbus_assert (_DBUS_POINTER_TO_INT (data2) == i);

      verify_list (&list1);
      verify_list (&list2);

      _dbus_assert (is_ascending_sequence (&list1));
      _dbus_assert (is_descending_sequence (&list2));
      
      --i;
    }

  _dbus_assert (list1 == NULL);
  _dbus_assert (list2 == NULL);

  /* Test get_first_link, get_last_link, pop_first_link, pop_last_link */
  
  i = 0;
  while (i < 10)
    {
      _dbus_list_append (&list1, _DBUS_INT_TO_POINTER (i));
      _dbus_list_prepend (&list2, _DBUS_INT_TO_POINTER (i));
      ++i;
    }

  --i;
  while (i >= 0)
    {
      DBusList *got_link1;
      DBusList *got_link2;

      DBusList *link1;
      DBusList *link2;
      
      void *data1;
      void *data2;
      
      got_link1 = _dbus_list_get_last_link (&list1);
      got_link2 = _dbus_list_get_first_link (&list2);
      
      link1 = _dbus_list_pop_last_link (&list1);
      link2 = _dbus_list_pop_first_link (&list2);

      _dbus_assert (got_link1 == link1);
      _dbus_assert (got_link2 == link2);

      data1 = link1->data;
      data2 = link2->data;

      _dbus_list_free_link (link1);
      _dbus_list_free_link (link2);
      
      _dbus_assert (_DBUS_POINTER_TO_INT (data1) == i);
      _dbus_assert (_DBUS_POINTER_TO_INT (data2) == i);

      verify_list (&list1);
      verify_list (&list2);

      _dbus_assert (is_ascending_sequence (&list1));
      _dbus_assert (is_descending_sequence (&list2));
      
      --i;
    }

  _dbus_assert (list1 == NULL);
  _dbus_assert (list2 == NULL);
  
  /* Test iteration */
  
  i = 0;
  while (i < 10)
    {
      _dbus_list_append (&list1, _DBUS_INT_TO_POINTER (i));
      _dbus_list_prepend (&list2, _DBUS_INT_TO_POINTER (i));
      ++i;

      verify_list (&list1);
      verify_list (&list2);
      
      _dbus_assert (_dbus_list_get_length (&list1) == i);
      _dbus_assert (_dbus_list_get_length (&list2) == i);
    }

  _dbus_assert (is_ascending_sequence (&list1));
  _dbus_assert (is_descending_sequence (&list2));

  --i;
  link2 = _dbus_list_get_first_link (&list2);
  while (link2 != NULL)
    {
      verify_list (&link2); /* pretend this link is the head */
      
      _dbus_assert (_DBUS_POINTER_TO_INT (link2->data) == i);
      
      link2 = _dbus_list_get_next_link (&list2, link2);
      --i;
    }

  i = 0;
  link1 = _dbus_list_get_first_link (&list1);
  while (link1 != NULL)
    {
      verify_list (&link1); /* pretend this link is the head */
      
      _dbus_assert (_DBUS_POINTER_TO_INT (link1->data) == i);
      
      link1 = _dbus_list_get_next_link (&list1, link1);
      ++i;
    }

  --i;
  link1 = _dbus_list_get_last_link (&list1);
  while (link1 != NULL)
    {
      verify_list (&link1); /* pretend this link is the head */

      _dbus_assert (_DBUS_POINTER_TO_INT (link1->data) == i);
      
      link1 = _dbus_list_get_prev_link (&list1, link1);
      --i;
    }

  _dbus_list_clear (&list1);
  _dbus_list_clear (&list2);

  /* Test remove */
  
  i = 0;
  while (i < 10)
    {
      _dbus_list_append (&list1, _DBUS_INT_TO_POINTER (i));
      _dbus_list_prepend (&list2, _DBUS_INT_TO_POINTER (i));
      ++i;
    }

  --i;
  while (i >= 0)
    {
      if ((i % 2) == 0)
        {
          if (!_dbus_list_remove (&list1, _DBUS_INT_TO_POINTER (i)))
            _dbus_assert_not_reached ("element should have been in list");
          if (!_dbus_list_remove (&list2, _DBUS_INT_TO_POINTER (i)))
            _dbus_assert_not_reached ("element should have been in list");

          verify_list (&list1);
          verify_list (&list2);
        }
      --i;
    }

  _dbus_assert (all_odd_values (&list1));
  _dbus_assert (all_odd_values (&list2));

  _dbus_list_clear (&list1);
  _dbus_list_clear (&list2);

  /* test removing the other half of the elements */
  
  i = 0;
  while (i < 10)
    {
      _dbus_list_append (&list1, _DBUS_INT_TO_POINTER (i));
      _dbus_list_prepend (&list2, _DBUS_INT_TO_POINTER (i));
      ++i;
    }

  --i;
  while (i >= 0)
    {
      if ((i % 2) != 0)
        {
          if (!_dbus_list_remove (&list1, _DBUS_INT_TO_POINTER (i)))
            _dbus_assert_not_reached ("element should have been in list");
          if (!_dbus_list_remove (&list2, _DBUS_INT_TO_POINTER (i)))
            _dbus_assert_not_reached ("element should have been in list");

          verify_list (&list1);
          verify_list (&list2);
        }
      --i;
    }

  _dbus_assert (all_even_values (&list1));
  _dbus_assert (all_even_values (&list2));

  /* clear list using remove_link */
  while (list1 != NULL)
    {
      _dbus_list_remove_link (&list1, list1);
      verify_list (&list1);
    }
  while (list2 != NULL)
    {
      _dbus_list_remove_link (&list2, list2);
      verify_list (&list2);
    }

  /* Test remove link more generally */
  i = 0;
  while (i < 10)
    {
      _dbus_list_append (&list1, _DBUS_INT_TO_POINTER (i));
      _dbus_list_prepend (&list2, _DBUS_INT_TO_POINTER (i));
      ++i;
    }

  --i;
  link2 = _dbus_list_get_first_link (&list2);
  while (link2 != NULL)
    {
      DBusList *next = _dbus_list_get_next_link (&list2, link2);
      
      _dbus_assert (_DBUS_POINTER_TO_INT (link2->data) == i);

      if ((i % 2) == 0)
        _dbus_list_remove_link (&list2, link2);

      verify_list (&list2);
      
      link2 = next;
      --i;
    }

  _dbus_assert (all_odd_values (&list2));  
  _dbus_list_clear (&list2);
  
  i = 0;
  link1 = _dbus_list_get_first_link (&list1);
  while (link1 != NULL)
    {
      DBusList *next = _dbus_list_get_next_link (&list1, link1);

      _dbus_assert (_DBUS_POINTER_TO_INT (link1->data) == i);

      if ((i % 2) != 0)
        _dbus_list_remove_link (&list1, link1);

      verify_list (&list1);
      
      link1 = next;
      ++i;
    }

  _dbus_assert (all_even_values (&list1));
  _dbus_list_clear (&list1);

  /* Test copying a list */
  i = 0;
  while (i < 10)
    {
      _dbus_list_append (&list1, _DBUS_INT_TO_POINTER (i));
      _dbus_list_prepend (&list2, _DBUS_INT_TO_POINTER (i));
      ++i;
    }

  /* bad pointers, because they are allowed in the copy dest */
  copy1 = _DBUS_INT_TO_POINTER (0x342234);
  copy2 = _DBUS_INT_TO_POINTER (23);
  
  _dbus_list_copy (&list1, &copy1);
  verify_list (&list1);
  verify_list (&copy1);
  _dbus_assert (lists_equal (&list1, &copy1));
  
  _dbus_list_copy (&list2, &copy2);
  verify_list (&list2);
  verify_list (&copy2);
  _dbus_assert (lists_equal (&list2, &copy2));

  /* Now test copying empty lists */
  _dbus_list_clear (&list1);
  _dbus_list_clear (&list2);
  _dbus_list_clear (&copy1);
  _dbus_list_clear (&copy2);
  
  /* bad pointers, because they are allowed in the copy dest */
  copy1 = _DBUS_INT_TO_POINTER (0x342234);
  copy2 = _DBUS_INT_TO_POINTER (23);
  
  _dbus_list_copy (&list1, &copy1);
  verify_list (&list1);
  verify_list (&copy1);
  _dbus_assert (lists_equal (&list1, &copy1));
  
  _dbus_list_copy (&list2, &copy2);
  verify_list (&list2);
  verify_list (&copy2);
  _dbus_assert (lists_equal (&list2, &copy2));

  _dbus_list_clear (&list1);
  _dbus_list_clear (&list2);
  
  /* insert_before on empty list */
  _dbus_list_insert_before (&list1, NULL,
                            _DBUS_INT_TO_POINTER (0));
  verify_list (&list1);

  /* inserting before first element */
  _dbus_list_insert_before (&list1, list1,
                            _DBUS_INT_TO_POINTER (2));
  verify_list (&list1);
  _dbus_assert (is_descending_sequence (&list1));

  /* inserting in the middle */
  _dbus_list_insert_before (&list1, list1->next,
                            _DBUS_INT_TO_POINTER (1));
  verify_list (&list1);
  _dbus_assert (is_descending_sequence (&list1));  

  /* using insert_before to append */
  _dbus_list_insert_before (&list1, NULL,
                            _DBUS_INT_TO_POINTER (-1));
  verify_list (&list1);
  _dbus_assert (is_descending_sequence (&list1));
  
  _dbus_list_clear (&list1);

  /* insert_after on empty list */
  _dbus_list_insert_after (&list1, NULL,
                           _DBUS_INT_TO_POINTER (0));
  verify_list (&list1);

  /* inserting after first element */
  _dbus_list_insert_after (&list1, list1,
                           _DBUS_INT_TO_POINTER (1));
  verify_list (&list1);
  _dbus_assert (is_ascending_sequence (&list1));

  /* inserting at the end */
  _dbus_list_insert_after (&list1, list1->next,
                           _DBUS_INT_TO_POINTER (2));
  verify_list (&list1);
  _dbus_assert (is_ascending_sequence (&list1));

  /* using insert_after to prepend */
  _dbus_list_insert_after (&list1, NULL,
                           _DBUS_INT_TO_POINTER (-1));
  verify_list (&list1);
  _dbus_assert (is_ascending_sequence (&list1));
  
  _dbus_list_clear (&list1);

  /* using remove_last */
  _dbus_list_append (&list1, _DBUS_INT_TO_POINTER (2));
  _dbus_list_append (&list1, _DBUS_INT_TO_POINTER (1));
  _dbus_list_append (&list1, _DBUS_INT_TO_POINTER (3));

  _dbus_list_remove_last (&list1, _DBUS_INT_TO_POINTER (2));
  
  verify_list (&list1);
  _dbus_assert (is_ascending_sequence (&list1));
  
  _dbus_list_clear (&list1);
  
  return TRUE;
}
Ejemplo n.º 4
0
/*
 * Walk aggregate inode table marking blocks:
 *	- For inode map structures
 *	- For inode extents belonging to this table
 *	- For blocks belonging to inode's belonging to this table
 */
int32 walk_ait( int	device,
		struct dinode	*inode_buffer,
		boolean_t	is_primary )
{
    int32	rc = 0;
    xtpage_t	*btree_page;
    int32	index, lastindex;
    uint64	cur_block, last_block;
    dinomap_t	control_page, disk_cp;
    struct list_item	*top_freeiag = NULL;
    struct list_item	*top_inofree[MAXAG];
    struct list_item	*top_extfree[MAXAG];

    /*
     * Initialize control page and lists
     */
    memset( &control_page, 0, sizeof(dinomap_t) );
    memset( &top_inofree, 0, MAXAG * sizeof(struct list_item*) );
    memset( &top_extfree, 0, MAXAG * sizeof(struct list_item*) );

    btree_page = (xtpage_t *)&inode_buffer->di_btroot;

    /*
     * Mark blocks for the inode map structures (i.e. IAG's)
     */
    lastindex = btree_page->header.nextindex;
    for( index = XTENTRYSTART; index < lastindex; index++ ) {
	if( btree_page->header.flag & BT_LEAF ) {
	    /*
	     * Read the extent as IAG's and mark its blocks
	     */
	    walk_iag_extent( device, &(btree_page->xad[index]), is_primary,
				&control_page, &disk_cp, &top_freeiag,
				top_inofree, top_extfree,
				inode_buffer->di_inostamp );

	} else {
	    /*
	     * This is an internal page of the b-tree.  Mark these blocks and
	     * then walk that page
	     */
	    walk_internal_iag( device, &(btree_page->xad[index]), is_primary,
				&control_page, &disk_cp, &top_freeiag,
				top_inofree, top_extfree,
				inode_buffer->di_inostamp );
	}
    }

    /*
     * Now compare the computed control page to the on-disk one.
     * Right now we are only checking inode number counts, so we can't do a
     * straight memory comparison
     */
    if( is_primary ) {
#if 0
	rc = memcmp( &control_page, &disk_cp, sizeof(dinomap_t));
	if( rc != 0 ) {
	    error++;
	    printf("Miscompare of control page.\n");
	}
#else
	if( control_page.in_numinos != disk_cp.in_numinos) {
	    error++;
	    printf("Miscompare on in_numinos; found: %d\tdisk: %d\n",
			control_page.in_numinos, disk_cp.in_numinos );
	}
	if( control_page.in_numfree != disk_cp.in_numfree) {
	    error++;
	    printf("Miscompare on in_numfree; found: %d\tdisk: %d\n",
			control_page.in_numfree, disk_cp.in_numfree );
	}
	for( index = 0; index < MAXAG; index++ ) {
	    if( control_page.in_agctl[index].numinos !=
		disk_cp.in_agctl[index].numinos) {
		error++;
		printf("Miscompare on AG (%d) numinos; found: %d\tdisk: %d\n",
			index, control_page.in_agctl[index].numinos,
			disk_cp.in_agctl[index].numinos );
	    }
	    if( control_page.in_agctl[index].numfree !=
		disk_cp.in_agctl[index].numfree) {
		error++;
		printf("Miscompare on AG (%d) numfree; found: %d\tdisk: %d\n",
			index, control_page.in_agctl[index].numfree,
			disk_cp.in_agctl[index].numfree );
	    }
	}
	if( control_page.in_nextiag != disk_cp.in_nextiag) {
	    error++;
	    printf("Miscompare on in_nextiag; found: %d\tdisk: %d\n",
			control_page.in_nextiag, disk_cp.in_nextiag );
	}
#endif

	/*
	 * Add the on-disk start of the lists from the control page
	 */
	rc = search_and_add(&top_freeiag, disk_cp.in_freeiag, DISK_LIST);
	if( rc != 0 ) {
	    error++;
	    printf("Bad iagfree item on-disk: %d\n", disk_cp.in_freeiag);
	}
	for( index = 0; index < MAXAG; index++ ) {
	    rc = search_and_add(&(top_extfree[index]),
			disk_cp.in_agctl[index].extfree, DISK_LIST);
	    if( rc != 0 ) {
		error++;
		printf("Bad extfree[%d] item on-disk: %d\n", index,
			disk_cp.in_agctl[index].extfree);
	    }
	    rc = search_and_add(&(top_inofree[index]),
			disk_cp.in_agctl[index].inofree, DISK_LIST);
	    if( rc != 0 ) {
		error++;
		printf("Bad inofree[%d] item on-disk: %d\n", index,
			disk_cp.in_agctl[index].inofree);
	    }
	}

	/*
	 * Verify the lists
	 */
	verify_list(top_freeiag, "IAG free");
	for( index = 0; index < MAXAG; index++ ) {
	    verify_list(top_extfree[index], "AG Extent free");
	    verify_list(top_inofree[index], "AG Inode free");
	}
    }

    return 0;
}