-/*
- * Copyright (C) 2005 Andre Noll <maan@tuebingen.mpg.de>
- *
- * Licensed under the GPL v2. For licencing details see COPYING.
- */
+/* Copyright (C) 2005 Andre Noll <maan@tuebingen.mpg.de>, see file COPYING. */
/** \file filter_common.c Common helper functions for filter input/output. */
#include "string.h"
/** Iterate over all filters. */
-#define FOR_EACH_FILTER(j) for (j = 1; lls_cmd(j, filter_cmd_suite); j++)
+#define FOR_EACH_FILTER(j) for (j = 1; FILTER_CMD(j); j++)
/**
* Obtain a reference to a filter structure.
*
* \param filter_num Between zero and NUM_SUPPORTED_FILTERS, inclusively.
*
- * \return Pointer to the filter identified by the given filter number.
+ * \return Pointer to the filter identified by the given filter number, or
+ * NULL if the filter number is out of range.
*
- * It is a fatal error if the given number is out of range. In this case
- * the function aborts.
+ * \sa filter_name().
*/
const struct filter *filter_get(int filter_num)
{
- assert(filter_num >= 1);
- assert(filter_num <= LSG_NUM_FILTER_CMD_SUBCOMMANDS);
+ if (filter_num < 1 || filter_num > LSG_NUM_FILTER_CMD_SUBCOMMANDS)
+ return NULL;
return lls_user_data(FILTER_CMD(filter_num));
}
return lls_user_data(FILTER_CMD(filter_num));
}
+/**
+ * Return the name of a filter, given its number.
+ *
+ * \param filter_num See \ref filter_get().
+ *
+ * \return A pointer to a string literal, or NULL if filter_num is out of
+ * range. The caller must not attempt to call free(3) on the returned pointer.
+ */
const char *filter_name(int filter_num)
{
+ if (filter_num < 1 || filter_num > LSG_NUM_FILTER_CMD_SUBCOMMANDS)
+ return NULL;
return lls_command_name(FILTER_CMD(filter_num));
}
}
/**
- * Set select timeout of the scheduler.
+ * Print a short summary of all available filters to stdout.
+ *
+ * For each supported filter, the filter name and the purpose text is printed
+ * in a single line. Since no options are shown, the filter list is more
+ * concise than the text obtained from print_filter_helps().
+ */
+void print_filter_list(void)
+{
+ int i;
+
+ printf("Available filters:\n");
+ FOR_EACH_FILTER(i) {
+ const struct lls_command *cmd = FILTER_CMD(i);
+ if (!filter_supported(i))
+ continue;
+ printf("%-9s %s\n", filter_name(i), lls_purpose(cmd));
+ }
+}
+
+/**
+ * Request a minimal timeout if not idle.
*
- * \param s The scheduler.
- * \param context Pointer to the filter node (task context).
+ * \param s The scheduler instance.
+ * \param context Pointer to the filter node.
*
- * This looks at the status of the btr node of the filter. If data is available
- * in the input queue of the filter, or if an error occurred, a minimal timeout
- * for the next select call is requested from the scheduler. Otherwise the
- * scheduler timeout is left unchanged.
+ * If the buffer tree node of the given filter node has data available (or is
+ * in error state) a minimal I/O timeout is requested from the scheduler.
+ * Otherwise the function does nothing.
*/
-void generic_filter_pre_select(struct sched *s, void *context)
+void generic_filter_pre_monitor(struct sched *s, void *context)
{
struct filter_node *fn = context;