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 } }
// 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 ); }
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__); }
/* ---- * 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; }
/* * 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); } }
// 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; } }
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); }
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__); }
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; }