X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=buffer_tree.c;h=1c4e046ad8f2aa478bcd4eaf5d94171f0224fd63;hp=c62cbf13c3bdc4b621bd891d41e1b74fe24d98fe;hb=0eb69b6d45c54deda1724b2db2202cf4057b0309;hpb=6d9c357ff64e799dfeacda6a176012de10c7f5c1 diff --git a/buffer_tree.c b/buffer_tree.c index c62cbf13..1c4e046a 100644 --- a/buffer_tree.c +++ b/buffer_tree.c @@ -295,9 +295,10 @@ struct btr_node *btr_new_node(struct btr_node_description *bnd) bnd->child->parent = btrn; goto out; } - PARA_EMERG_LOG("inserting internal nodes not yet supported.\n"); - exit(EXIT_FAILURE); - assert(bnd->child->parent == bnd->parent); + list_add_tail(&btrn->node, &bnd->parent->children); + list_move(&bnd->child->node, &btrn->children); + bnd->child->parent = btrn; + PARA_INFO_LOG("added %s as internal node\n", bnd->name); out: return btrn; } @@ -602,7 +603,7 @@ static size_t btr_get_buffer_by_reference(struct btr_buffer_reference *br, char * * \param btrn The node whose input queue is to be queried. * \param omit Number of bytes to be omitted. - * \param bufp Result pointer. + * \param bufp Result pointer. It is OK to pass \p NULL here. * * If a buffer tree node needs more input data but can not consume the data it * already has (because it might be needed again later) this function can be @@ -878,37 +879,36 @@ size_t btr_get_output_queue_size(struct btr_node *btrn) } /** - * Execute a inter-node command on a parent node. + * Execute an inter-node command on the given node or on a parent node. * * \param btrn The node to start looking. * \param command The command to execute. * \param value_result Additional arguments and result value. * - * This function traverses the buffer tree upwards and looks for parent nodes - * of \a btrn that understands \a command. On the first such node the command - * is executed, and the result is stored in \a value_result. + * This function traverses the buffer tree from \a btrn upwards and looks for + * the first node that understands \a command. On this node \a command is + * executed, and the result is stored in \a value_result. * * \return \p -ENOTSUP if no parent node of \a btrn understands \a command. * Otherwise the return value of the command handler is returned. + * + * \sa \ref receiver::execute, filter::execute, writer::execute. */ int btr_exec_up(struct btr_node *btrn, const char *command, char **value_result) { int ret; for (; btrn; btrn = btrn->parent) { - struct btr_node *parent = btrn->parent; - if (!parent) - return -ERRNO_TO_PARA_ERROR(ENOTSUP); - if (!parent->execute) + if (!btrn->execute) continue; - PARA_INFO_LOG("parent: %s, cmd: %s\n", parent->name, command); - ret = parent->execute(parent, command, value_result); + PARA_INFO_LOG("executing %s on %s\n", command, btrn->name); + ret = btrn->execute(btrn, command, value_result); if (ret == -ERRNO_TO_PARA_ERROR(ENOTSUP)) continue; if (ret < 0) return ret; if (value_result && *value_result) - PARA_INFO_LOG("%s(%s): %s\n", command, parent->name, + PARA_INFO_LOG("%s(%s): %s\n", command, btrn->name, *value_result); return 1; } @@ -1226,3 +1226,8 @@ void btr_get_node_start(struct btr_node *btrn, struct timeval *tv) { *tv = btrn->start; } + +struct btr_node *btr_parent(struct btr_node *btrn) +{ + return btrn->parent; +}