int bus_write(struct bus_t *self_p, int id, const void *buf_p, size_t size) { ASSERTN(self_p != NULL, EINVAL); ASSERTN(buf_p != NULL, EINVAL); ASSERTN(size > 0, EINVAL); int number_of_receivers; struct bus_listener_t *curr_p; rwlock_reader_take(&self_p->rwlock); curr_p = (struct bus_listener_t *)binary_tree_search( &self_p->listeners, id); number_of_receivers = 0; while (curr_p != NULL) { ((struct chan_t *)curr_p->chan_p)->write(curr_p->chan_p, buf_p, size); number_of_receivers++; curr_p = curr_p->next_p; } rwlock_reader_give(&self_p->rwlock); return (number_of_receivers); }
int bus_detatch(struct bus_t *self_p, struct bus_listener_t *listener_p) { ASSERTN(self_p != NULL, EINVAL); ASSERTN(listener_p != NULL, EINVAL); int res = 0; struct bus_listener_t *head_p, *curr_p, *prev_p; rwlock_writer_take(&self_p->rwlock); head_p = (struct bus_listener_t *)binary_tree_search( &self_p->listeners, listener_p->id); if (head_p == NULL) { res = -1; } else if (head_p == listener_p) { res = binary_tree_delete(&self_p->listeners, listener_p->id); if (listener_p->next_p != NULL) { binary_tree_insert(&self_p->listeners, &listener_p->next_p->base); } } else { curr_p = head_p->next_p; prev_p = head_p; res = -1; while (curr_p != NULL) { if (curr_p == listener_p) { prev_p->next_p = listener_p->next_p; res = 0; break; } prev_p = curr_p; curr_p = curr_p->next_p; } } rwlock_writer_give(&self_p->rwlock); return (res); }
int bus_attach(struct bus_t *self_p, struct bus_listener_t *listener_p) { ASSERTN(self_p != NULL, EINVAL); ASSERTN(listener_p != NULL, EINVAL); struct bus_listener_t *head_p; rwlock_writer_take(&self_p->rwlock); /* Try to insert the node into the tree. It fails if there already * is a node with the same key (id).*/ if (binary_tree_insert(&self_p->listeners, &listener_p->base) != 0) { head_p = (struct bus_listener_t *)binary_tree_search( &self_p->listeners, listener_p->id); listener_p->next_p = head_p->next_p; head_p->next_p = listener_p; } rwlock_writer_give(&self_p->rwlock); return (0); }
int main(void) { struct binary_tree* tree = NULL; struct node* new_node = NULL, ** flat_tree = NULL; char choise, val; int key, size, buf[10]; while(1) { fprintf(stdout, "Binary Tree Demo\n\ta)Insert\n\tb)Remove\n\tc)Search\n\td)Display\n\te)Exit\n\tEnter Choise: "); fscanf(stdin, " %c", &choise); switch(choise) { case 'a': fprintf(stdout, "\tEnter key(number) and value(character) to Insert: "); fscanf(stdin, "%d %c", &key, &val); init_node(&new_node, key, val); if(!tree) init_binary_tree(&tree, new_node); else binary_tree_insert(tree, new_node); fprintf(stdout, "\tInserted %d-%c in the tree, new tree size %d\n", key, val, binary_tree_size(tree)); break; case 'b': fprintf(stdout, "\tEnter key(number) to Remove: "); fscanf(stdin, "%d", &key); binary_tree_remove(tree, key); fprintf(stdout, "\tRemoved %d from the tree, new tree size %d\n", key, binary_tree_size(tree)); break; case 'c': fprintf(stdout, "\tEnter key(number) to Search value(character): "); fscanf(stdin, "%d", &key); if(new_node = binary_tree_search(tree, key)) fprintf(stdout,"\tkey = %d, value = %c\n", new_node->key, (char)(new_node->val)); break; case 'd': fprintf(stdout, "\tOrder of Display\n\t\ta)depth-first(in-order)\n\t\tb)depth-first(pre-order)\n\t\tc)depth-first(post-order)\n\t\td)breadth-first\n\t\te)back to previous menu\n\t\tEnter choise: "); fscanf(stdin, " %c", &choise); if(choise < 'e' && choise >= 'a') { flat_tree = malloc(binary_tree_size(tree) * sizeof(struct node*)); if(!flat_tree) { fprintf(stdout, "can't allocate memory for flattened tree\n"); exit(EXIT_FAILURE); } switch(choise) { case 'a': binary_tree_flatten(tree, IN_ORDER, flat_tree); break; case 'b': binary_tree_flatten(tree, PRE_ORDER, flat_tree); break; case 'c': binary_tree_flatten(tree, POST_ORDER, flat_tree); break; case 'd': binary_tree_flatten(tree, BREADTH_FIRST, flat_tree); } fprintf(stdout,"\t"); for(size = 0; size < binary_tree_size(tree); size++) { fprintf(stdout, "(key = %d, value = %c) ", flat_tree[size]->key, (char)(flat_tree[size]->val)); } fprintf(stdout, "\n"); free(flat_tree); } break; case 'e': if(tree) destroy_binary_tree(&tree); exit(EXIT_SUCCESS); default: fprintf(stdout, "Enter a, b, c, d or e in lower-case\n"); } } return 0; }