diff options
Diffstat (limited to 'cpukit/include/rtems/printer.h')
-rw-r--r-- | cpukit/include/rtems/printer.h | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/cpukit/include/rtems/printer.h b/cpukit/include/rtems/printer.h index 2ed6b6ac3f..28b0b259f5 100644 --- a/cpukit/include/rtems/printer.h +++ b/cpukit/include/rtems/printer.h @@ -19,6 +19,9 @@ #define _RTEMS_PRINTER_H #include <rtems/print.h> +#include <rtems/chain.h> +#include <rtems/rtems/intr.h> +#include <rtems/rtems/tasks.h> #include <stdio.h> @@ -110,6 +113,109 @@ extern void rtems_print_printer_printf(rtems_printer *printer); */ extern void rtems_print_printer_fprintf(rtems_printer *printer, FILE *file); +typedef struct { + rtems_id task; + RTEMS_INTERRUPT_LOCK_MEMBER( lock ) + rtems_chain_control free_buffers; + rtems_chain_control todo_buffers; + size_t task_stack_size; + rtems_task_priority task_priority; + int fd; + void *buffer_table; + size_t buffer_count; + size_t buffer_size; +} rtems_printer_task_context; + +static inline void rtems_printer_task_initialize( + rtems_printer_task_context *context +) +{ + memset( context, 0, sizeof( *context ) ); +} + +static inline void rtems_printer_task_set_stack_size( + rtems_printer_task_context *context, + size_t stack_size +) +{ + context->task_stack_size = stack_size; +} + +static inline void rtems_printer_task_set_priority( + rtems_printer_task_context *context, + rtems_task_priority priority +) +{ + context->task_priority = priority; +} + +static inline void rtems_printer_task_set_file_descriptor( + rtems_printer_task_context *context, + int fd +) +{ + context->fd = fd; +} + +static inline void rtems_printer_task_set_buffer_table( + rtems_printer_task_context *context, + void *buffer_table +) +{ + context->buffer_table = buffer_table; +} + +static inline void rtems_printer_task_set_buffer_count( + rtems_printer_task_context *context, + size_t buffer_count +) +{ + context->buffer_count = buffer_count; +} + +static inline void rtems_printer_task_set_buffer_size( + rtems_printer_task_context *context, + size_t buffer_size +) +{ + context->buffer_size = buffer_size; +} + +/** + * @brief Creates a printer task. + * + * Print requests via rtems_printf() or rtems_vprintf() using a printer task + * printer are output to a buffer and then placed on a work queue in FIFO + * order. The work queue is emptied by the printer task. The printer task + * writes the buffer content to the file descriptor specified by the context. + * Buffers are allocated from a pool of buffers as specified by the context. + * + * @param[in] printer Pointer to the printer structure. + * @param[in] context The initialized printer task context. + * + * @retval 0 Successful operation. + * @retval EINVAL Invalid context parameters. + * @retval ENOMEM Not enough resources. + */ +int rtems_print_printer_task( + rtems_printer *printer, + rtems_printer_task_context *context +); + +/** + * @brief Drains the work queue of the printer task. + * + * Waits until all output buffers in the work queue at the time of this + * function call are written to the file descriptor and an fsync() completed. + * + * The printer task must be successfully started via rtems_print_printer_task() + * before this function can be used. Otherwise, the behaviour is undefined. + * + * @param[in] context The printer task context of a successfully started + * printer task. + */ +void rtems_printer_task_drain(rtems_printer_task_context *context); + /** @} */ #ifdef __cplusplus |