Beispiel #1
0
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);
}
Beispiel #2
0
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);
}
Beispiel #3
0
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;
}