Ejemplo n.º 1
0
Archivo: avl.c Proyecto: urezki/libalgo
void
avl_remove(struct avl_node **r, long key)
{
	struct avl_node *t = NULL;

	t = avl_lookup(*r, key);
	if (t) {
#if 0
		/* is not head */
		if (t != *r) {
			struct avl_node *l = t->link[0];
			struct avl_node *r = t->link[1];
			struct avl_node *p = t->link[2];

			if (l && r) {
				/* two children */

			} else if (!l || !r) {
				/* one children */

			} else {
				/* no children */

			}
		} else {
			/*
			 * remove the head of the tree
			 */
		}
#endif
	}
}
Ejemplo n.º 2
0
// Find the *element* in t matching k, or NULL if not found.
void* VG_(OSet_Lookup)(AvlTree* t, void* k)
{
   AvlNode* n;
   vg_assert(t);
   n = avl_lookup(t, k);
   return ( n ? elem_of_node(n) : NULL );
}
Ejemplo n.º 3
0
static void
test_2()
{
    struct avl_node *root = NULL;
    struct timespec a;
    struct timespec b;
    uint64_t d = 0;
    int i = 0;
    int rv;
    int error = 0;

    srand(time(0));

    /* insert */
    for (i = 0; i < 100; i++) {
        struct avl_node *tmp = avl_alloc(0);

        tmp->key = rand() % 1000000000;
        time_now(&a);
        rv = avl_insert(&root, tmp);
        time_now(&b);

        if (!rv)
            error++;

        d += time_diff(&a, &b);
    }

    /* average */
    d = d / i;
    fprintf(stdout, "insertion: %lu nano/s, %f micro/s, errors: %d\n",
            d, (float) d / 1000, error);

    /* lookup */
    for (i = 0, d = 0, error = 0; i < 100; i++) {
        struct avl_node *tmp;
        size_t key;

        key = rand() % 1000000000;

        time_now(&a);
        tmp = avl_lookup(root, key);
        time_now(&b);

        if (!tmp)
            error++;

        d += time_diff(&a, &b);
    }

    /* average */
    d = d / i;
    fprintf(stdout, "lookup: %lu nano/s, %f micro/s, errors: %d\n",
            d, (float) d / 1000, error);

    avl_dump_to_file(root, __func__);
}
Ejemplo n.º 4
0
/* ----
 * avl_delete() -
 *
 *	Mark a given element as deleted. Subsequent lookups for the element
 *	will return NULL. Note that the caller should NOT free the memory
 *	of the element, as it is AVL's property altogether after the delete.
 *
 *	avl_delete() returns 1 on success, 0 if no such element was found.
 * ----
 */
int
avl_delete(AVLtree *tree, void *cdata)
{
	AVLnode    *node;

	if ((node = avl_lookup(tree, cdata)) == NULL)
		return 0;

	node->deleted = 1;
	return 1;
}
Ejemplo n.º 5
0
/*
 * XL-COM Connection Poller
 */
void* thr_poller(void* arg) {

	int status;
	int client_fd;
	struct epoll_event epoll_ev;
	client_request_t *request;

	while(1) {
		// wait forever (-1) for one (1) request
		if ((status = epoll_wait(Epoll_fd, &epoll_ev, 1, -1) != 1)) {
			printf("[xlcom_server] [P] epoll_wait returned %d, expecting 1\n", status);
		}

		// Initialize memory for a new request
		if ((request = malloc(sizeof(client_request_t))) == NULL) {
			printf("[xlcom_server] [P] malloc failed. No free memory?\n");
		}
		memset(request, 0, sizeof(client_request_t));

		// Get new request info
		client_fd = epoll_ev.data.fd;
		request->msg_size = recv(client_fd, (void*)&(request->msg), sizeof(request->msg), MSG_DONTWAIT);

		// Lookup user information
		if ((request->client = avl_lookup(Active_connections, &client_fd)) == NULL) {
			printf("[xlcom_server] [P] CRITICAL ERROR: Client is connected, but no record found. Rejecting request.\n");
			continue;
		}

		// Check if client disconnected
		if (request->msg_size == 0) {
			printf("[xlcom_server] [P] %s disconnected.\n", client_info_print_auth(request->client));
			avl_remove(Active_connections, &client_fd);
			if (epoll_ctl(Epoll_fd, EPOLL_CTL_DEL, client_fd, NULL) != 0) {
				printf("[xlcom_server] [P] Error removing connection from epoll.\n");
			}
			close(client_fd);
			free(request);
			continue;
		}

		// Check if there was an error
		if (request->msg_size < 0) {
			printf("[xlcom_server] [P] Error receiving request from %s.\n", request->client->address);
			free(request);
			return NULL;
		}

		// Place request in the requests FIFO
		queue_add(Queue_client_requests, request);
		sem_post(&Sem_client_requests);
	}

}
Ejemplo n.º 6
0
// Remove and return the element matching the key 'k', or NULL if not present.
void* VG_(OSet_Remove)(AvlTree* t, void* k)
{
   // Have to find the node first, then remove it.
   AvlNode* n = avl_lookup(t, k);
   if (n) {
      avl_remove(t, n);
      t->nElems--;
      t->stackTop = 0;     // So the iterator can't get out of sync
      return elem_of_node(n);
   } else {
      return NULL;
   }
}
Ejemplo n.º 7
0
int main(int argc, char **argv) {
    struct paging_state *s = (struct paging_state *) malloc(sizeof(struct paging_state));
    // Create Pointer to Pointer to the Root Node.
    s->phys_to_virt = (struct avl_node **) malloc(sizeof(struct avl_node *));
    s->virt_to_phys = (struct avl_node **) malloc(sizeof(struct avl_node *));

    int verbose = atoi(argv[1]);
    int no = atoi(argv[2]);
    long cop[no];
    long x;

    for(int i = 0; i < no; i++){
        scanf("%lu", &x);
        cop[i] = x;
        insert_mapping(s, x, x);
        if(verbose){
            printf("inserted %lu\n", x);
            //struct avl_node *root = *(s->phys_to_virt);
            //printf("Pointer to Tree Root: %p\n", s->phys_to_virt);
            //printf("Pointer to Root Node: %p\n", *(s->phys_to_virt));
            //printf("Current Root Node Value: %lu\n", (root->mapping->paddr));
        }
    }

    for(int i = 0; i < no; i++){
        addr_t res = avl_lookup(s, cop[i]);
        // printf("looking up %lu\n", cop[i]);
        if(verbose)
            printf("Found %lu (%i/%i)\n", res,  i, no);
    }
    if (verbose)
        printf("FOUND TRACE COMPLETE\n");

    for (int i = 0; i < no; i++) {
        if (verbose)
            printf("Removing %lu\n", cop[i]);
        remove_mapping(s, cop[i], cop[i]);
        if (verbose)
            printf("Removed %lu\n", cop[i]);
    }

    if (verbose)
        printf("Testing Complete\n");

    //clean_tree(*(s->virt_to_phys), false);
    //clean_tree(*(s->phys_to_virt), true);
}
Ejemplo n.º 8
0
static void
test_1()
{
    avl_node *root = NULL;
    int i, rv;

    int input[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
    /* int input[] = { 100, 20, 150, 6, 26, 27 }; */
    /* int input[] = { 100, 20, 150, 6, 26, 25 }; */

    /* int input[] = { 3769, 4163, 3465, 4143, 4396, 4011 }; */
    /* int input[] = { 3769, 4163, 3465, 4143, 4396, 4144 }; */

    for (i = 0; i < ARRAY_SIZE(input); i++) {
        struct avl_node *n;

        n = avl_alloc(0);
        n->key = input[i];
        rv = avl_insert(&root, n);
        if (rv == 0)
            fprintf(stdout, "'avl_insert()' error, %ld\n", n->key);
    }

    for (i = 0; i < ARRAY_SIZE(input); i++) {
        struct avl_node *n;

        n = avl_lookup(root, input[i]);
        if (n) {
            struct avl_node *l = n->link[0];
            struct avl_node *r = n->link[1];

            fprintf(stdout, "-> %ld { %ld, %ld } %d\n",
                    n->key, l ? l->key:-99, r ? r->key:-99, n->bf);
        }
    }

    avl_dump_to_file(root, __func__);
}
Ejemplo n.º 9
0
int main(int argc, char *argv[]) 
{
    avl_tree *ptree;
    avl_tree *itree;
    avl_tree *mtree;

    avl_node *lookup = (avl_node*)0x1;
    struct timeval start, finish;
    int i, x;



    printf("\nP-TREE:\n");

    for (i = 0; i < NNN; i++) ndata[i] = i;
    for (i = 0; i < MMM; i++) mdata[i] = i;
   
    ptree = avl_init(int_compare, NULL, 0);

    gettimeofday(&start, NULL);
    for (i = 0; i < MMM; i++) avl_insert(ptree, &mdata[i], NULL);
    //for (i = NNN; i > 0; i--) avl_insert(ptree, &ndata[i], NULL); 
    gettimeofday(&finish, NULL);
    printf("INSERT: n = %7d h = %2d v = %d (%d sec %u msec)\n", avl_size(ptree), 
                                                                avl_height(ptree), 
                                                                avl_validate(ptree, ptree->root, NULL),
                                                                (int)         (finish.tv_sec  - start.tv_sec ), 
                                                                (unsigned int)(finish.tv_usec - start.tv_usec)/1000);

    gettimeofday(&start, NULL);
    for (i = 0; i < MMM && lookup; i++) lookup = avl_lookup(ptree, &mdata[i], NULL);
    gettimeofday(&finish, NULL);
    printf("LOOKUP: n = %7d h = %2d v = %d (%d sec %u msec)\n", i, 
                                                                avl_height(ptree), 
                                                                avl_validate(ptree, ptree->root, NULL),
                                                                (int)         (finish.tv_sec  - start.tv_sec ), 
                                                                (unsigned int)(finish.tv_usec - start.tv_usec)/1000);

    gettimeofday(&start, NULL);

    for (i = NNN - 1; i >= 0; i--) { 
        avl_remove(ptree, &ndata[i], NULL);
    }

#if 0
    for (i = 0, srand(time(NULL)); i < NNN;) {
        x = rand() % NNN;
        if (avl_lookup(ptree, &ndata[x], NULL)) {
            avl_remove(ptree, &ndata[x], NULL);
            assert(avl_validate(ptree, ptree->root, NULL));
            i++;
        }
    }
#endif

    gettimeofday(&finish, NULL);
    printf("REMOVE: n = %7d h = %2d v = %d (%d sec %u msec)\n", avl_size(ptree),
                                                                avl_height(ptree),
                                                                avl_validate(ptree, ptree->root, NULL),
                                                                (int)         (finish.tv_sec  - start.tv_sec ), 
                                                                (unsigned int)(finish.tv_usec - start.tv_usec)/1000);

    gettimeofday(&start, NULL);
    avl_free(ptree);
    gettimeofday(&finish, NULL);
    printf("DSTROY: n = %7d h = %2d v = %d (%d sec  %u msec)\n", 0, 
                                                                 0,
                                                                 1,
                                                                 (int)         (finish.tv_sec  - start.tv_sec ),
                                                                 (unsigned int)(finish.tv_usec - start.tv_usec)/1000); 
   

    printf("\nI-TREE:\n");

    memset(nintr, 0, NNN * sizeof(intr));
    memset(mintr, 0, MMM * sizeof(intr));
    for (i = 0; i < NNN; i++) nintr[i].data = i;
    for (i = 0; i < MMM; i++) mintr[i].data = i;

    itree = avl_init(intr_compare, NULL, AVL_TREE_INTRUSIVE);


    gettimeofday(&start, NULL);
    for (i = 0; i < MMM; i++) avl_insert(itree, &mintr[i], NULL);
    //for (i = NNN - 1; i >= 0; i--) avl_insert(itree, &nintr[i], NULL); 
    gettimeofday(&finish, NULL);
    printf("INSERT: n = %7d h = %2d v = %d (%d sec %u msec)\n", avl_size(itree), 
                                                                avl_height(itree),
                                                                avl_validate(itree, itree->root, NULL),
                                                                (int)         (finish.tv_sec  - start.tv_sec ), 
                                                                (unsigned int)(finish.tv_usec - start.tv_usec)/1000);

    gettimeofday(&start, NULL);
    for (i = 0; i < MMM && lookup; i++) lookup = avl_lookup(itree, &mintr[i], NULL);
    gettimeofday(&finish, NULL);
    printf("LOOKUP: n = %7d h = %2d v = %d (%d sec %u msec)\n", i, 
                                                                avl_height(itree), 
                                                                avl_validate(itree, itree->root, NULL),
                                                                (int)         (finish.tv_sec  - start.tv_sec ), 
                                                                (unsigned int)(finish.tv_usec - start.tv_usec)/1000);

    gettimeofday(&start, NULL);

   
    for (i = NNN - 1; i >= 0; i--) { 
        avl_remove(itree, &nintr[i], NULL);
    }

#if 0
    for (i = 0, srand(time(NULL)); i < NNN;) {
        x = rand() % NNN;
        if (avl_lookup(itree, &nintr[x], NULL)) {
            avl_remove(itree, &nintr[x], NULL);
            assert(avl_validate(itree, itree->root, NULL));
            i++;
        }
    }
#endif

    gettimeofday(&finish, NULL);
    printf("REMOVE: n = %7d h = %2d v = %d (%d sec %u msec)\n", avl_size(itree),
                                                                avl_height(itree),
                                                                avl_validate(itree, itree->root, NULL),
                                                                (int)         (finish.tv_sec  - start.tv_sec ), 
                                                                (unsigned int)(finish.tv_usec - start.tv_usec)/1000);


    gettimeofday(&start, NULL);
    avl_free(itree);
    gettimeofday(&finish, NULL);
    printf("DSTROY: n = %7d h = %2d v = %d (%d sec  %u msec)\n\n", 0, 
                                                                   0,
                                                                   1,
                                                                   (int)         (finish.tv_sec  - start.tv_sec ),
                                                                   (unsigned int)(finish.tv_usec - start.tv_usec)/1000); 




    printf("\nM-TREE:\n");

    memset(nmulti, 0, NNN * sizeof(multi));
    memset(mmulti, 0, MMM * sizeof(multi));
    for (i = 0; i < NNN; i++) {nmulti[i].key[0] = i;nmulti[i].key[1] = i+1;}
    for (i = 0; i < MMM; i++) {mmulti[i].key[0] = i;mmulti[i].key[1] = i+1;}


    avl_compare_fn comps[2] = { multi_comp_0, multi_comp_1 };

    mtree = avl_multi_init(comps, NULL, 2, AVL_TREE_INTRUSIVE);


    gettimeofday(&start, NULL);
    for (i = 0; i < MMM; i++) avl_multi_insert(mtree, &mmulti[i], NULL);
    //for (i = NNN - 1; i >= 0; i--) avl_multi_insert(mtree, &nmulti[i], NULL); 
    gettimeofday(&finish, NULL);
    printf("INSERT: n = %7d h = %2d v = %d (%d sec %u msec)\n", avl_size(mtree), 
                                                                avl_height(mtree),
                                                                avl_validate(mtree, mtree->root, NULL) &&
                                                                avl_validate(&mtree[0], mtree[0].root, NULL) ==
                                                                avl_validate(&mtree[1], mtree[1].root, NULL) ,
                                                                (int)         (finish.tv_sec  - start.tv_sec ), 
                                                                (unsigned int)(finish.tv_usec - start.tv_usec)/1000);

    gettimeofday(&start, NULL);
    for (i = 0; i < MMM && lookup; i++) lookup = avl_lookup(mtree, &mmulti[i], NULL);
    gettimeofday(&finish, NULL);
    printf("LOOKUP: n = %7d h = %2d v = %d (%d sec %u msec)\n", avl_size(mtree), 
                                                                avl_height(mtree),
                                                                avl_validate(mtree, mtree->root, NULL) &&
                                                                avl_validate(&mtree[0], mtree[0].root, NULL) ==
                                                                avl_validate(&mtree[1], mtree[1].root, NULL) ,
                                                                (int)         (finish.tv_sec  - start.tv_sec ), 
                                                                (unsigned int)(finish.tv_usec - start.tv_usec)/1000);

    gettimeofday(&start, NULL);


    //avl_walk(&mtree[0], multi_print_0, NULL, 0); printf("---\n");fflush(stdout);
    //avl_walk(&mtree[1], multi_print_1, NULL, 0); printf("===\n");fflush(stdout);

   
    for (i = MMM - 1; i >= 1000; i--) { 
        avl_multi_remove(mtree, &mmulti[i], NULL);
    }

    //avl_walk(&mtree[0], multi_print_0, NULL, 0); printf("---\n");fflush(stdout);
    //avl_walk(&mtree[1], multi_print_1, NULL, 0); printf("===\n");fflush(stdout);

#if 0
    for (i = 0, srand(time(NULL)); i < NNN;) {
        x = rand() % NNN;
        if (avl_lookup(itree, &nintr[x], NULL)) {
            avl_remove(itree, &nintr[x], NULL);
            assert(avl_validate(itree, itree->root, NULL));
            i++;
        }
    }
#endif

    gettimeofday(&finish, NULL);
    printf("REMOVE: n = %7d h = %2d v = %d (%d sec %u msec)\n", avl_size(mtree), 
                                                                avl_height(mtree),
                                                                avl_validate(mtree, mtree->root, NULL) &&
                                                                avl_validate(&mtree[0], mtree[0].root, NULL) ==
                                                                avl_validate(&mtree[1], mtree[1].root, NULL) ,
                                                                (int)         (finish.tv_sec  - start.tv_sec ), 
                                                                (unsigned int)(finish.tv_usec - start.tv_usec)/1000);


    gettimeofday(&start, NULL);
    avl_free(mtree);
    gettimeofday(&finish, NULL);
    printf("DSTROY: n = %7d h = %2d v = %d (%d sec  %u msec)\n\n", 0, 
                                                                   0,
                                                                   1,
                                                                   (int)         (finish.tv_sec  - start.tv_sec ),
                                                                   (unsigned int)(finish.tv_usec - start.tv_usec)/1000); 

  

    return 0;
}