There should probably be a ticket for this change. Is there a reason someone might have to not want one server per core when using SMP? That is, should this be configurable?
On Tue, Jul 11, 2017 at 9:41 AM, Sebastian Huber <sebastian.hu...@embedded-brains.de> wrote: > This allows load balancing of interrupt processing in SMP > configurations. > --- > c/src/lib/libbsp/shared/src/irq-server.c | 263 > +++++++++++++++++++++---------- > cpukit/include/rtems/irq-extension.h | 129 ++++++++------- > 2 files changed, 254 insertions(+), 138 deletions(-) > > diff --git a/c/src/lib/libbsp/shared/src/irq-server.c > b/c/src/lib/libbsp/shared/src/irq-server.c > index 1f9b75ffd9..a37c9caafc 100644 > --- a/c/src/lib/libbsp/shared/src/irq-server.c > +++ b/c/src/lib/libbsp/shared/src/irq-server.c > @@ -30,47 +30,70 @@ > > #define BSP_INTERRUPT_SERVER_MANAGEMENT_VECTOR (BSP_INTERRUPT_VECTOR_MAX + 1) > > -RTEMS_INTERRUPT_LOCK_DEFINE( > - static, > - bsp_interrupt_server_lock, > - "Interrupt Server" > +typedef struct { > + RTEMS_INTERRUPT_LOCK_MEMBER(lock); > + rtems_chain_control entries; > + rtems_id server; > + unsigned errors; > +} bsp_interrupt_server_context; > + > +#if defined(RTEMS_SMP) > +static bsp_interrupt_server_context *bsp_interrupt_server_instances; > +#else > +static bsp_interrupt_server_context bsp_interrupt_server_instance; > +#endif > + > +static bsp_interrupt_server_context *bsp_interrupt_server_get_context( > + uint32_t server_index, > + rtems_status_code *sc > ) > - > -static rtems_id bsp_interrupt_server_id = RTEMS_ID_NONE; > - > -static RTEMS_CHAIN_DEFINE_EMPTY(bsp_interrupt_server_chain); > - > -static rtems_status_code bsp_interrupt_server_is_initialized(void) > { > - if (bsp_interrupt_server_id != RTEMS_ID_NONE) { > - return RTEMS_SUCCESSFUL; > - } else { > - return RTEMS_INCORRECT_STATE; > +#if defined(RTEMS_SMP) > + if (bsp_interrupt_server_instances == NULL) { > + *sc = RTEMS_INCORRECT_STATE; > + return NULL; > } > -} > +#else > + if (bsp_interrupt_server_instance.server == RTEMS_ID_NONE) { > + *sc = RTEMS_INCORRECT_STATE; > + return NULL; > + } > +#endif > > -static unsigned bsp_interrupt_server_errors; > + if (server_index >= rtems_get_processor_count()) { > + *sc = RTEMS_INVALID_ID; > + return NULL; > + } > + > + *sc = RTEMS_SUCCESSFUL; > +#if defined(RTEMS_SMP) > + return &bsp_interrupt_server_instances[server_index]; > +#else > + return &bsp_interrupt_server_instance; > +#endif > +} > > static void bsp_interrupt_server_trigger(void *arg) > { > rtems_interrupt_lock_context lock_context; > rtems_interrupt_server_entry *e = arg; > + bsp_interrupt_server_context *s = e->server; > > if (bsp_interrupt_is_valid_vector(e->vector)) { > bsp_interrupt_vector_disable(e->vector); > } > > - rtems_interrupt_lock_acquire(&bsp_interrupt_server_lock, &lock_context); > + rtems_interrupt_lock_acquire(&s->lock, &lock_context); > > if (rtems_chain_is_node_off_chain(&e->node)) { > - rtems_chain_append_unprotected(&bsp_interrupt_server_chain, &e->node); > + rtems_chain_append_unprotected(&s->entries, &e->node); > } else { > - ++bsp_interrupt_server_errors; > + ++s->errors; > } > > - rtems_interrupt_lock_release(&bsp_interrupt_server_lock, &lock_context); > + rtems_interrupt_lock_release(&s->lock, &lock_context); > > - rtems_event_system_send(bsp_interrupt_server_id, > RTEMS_EVENT_SYSTEM_SERVER); > + rtems_event_system_send(s->server, RTEMS_EVENT_SYSTEM_SERVER); > } > > typedef struct { > @@ -114,6 +137,7 @@ static rtems_interrupt_server_entry > *bsp_interrupt_server_query_entry( > } > > typedef struct { > + bsp_interrupt_server_context *server; > rtems_vector_number vector; > rtems_option options; > rtems_interrupt_handler handler; > @@ -146,6 +170,7 @@ static void bsp_interrupt_server_install_helper(void *arg) > if (e == NULL) { > e = calloc(1, sizeof(*e)); > if (e != NULL) { > + e->server = hd->server; > e->vector = hd->vector; > e->actions = a; > > @@ -162,6 +187,10 @@ static void bsp_interrupt_server_install_helper(void > *arg) > } else { > sc = RTEMS_NO_MEMORY; > } > +#if defined(RTEMS_SMP) > + } else if (e->server != hd->server) { > + sc = RTEMS_RESOURCE_IN_USE; > +#endif > } else if ( > RTEMS_INTERRUPT_IS_UNIQUE(hd->options) > || RTEMS_INTERRUPT_IS_UNIQUE(trigger_options) > @@ -252,6 +281,7 @@ static void bsp_interrupt_server_remove_helper(void *arg) > } > > static rtems_status_code bsp_interrupt_server_call_helper( > + bsp_interrupt_server_context *s, > rtems_vector_number vector, > rtems_option options, > rtems_interrupt_handler handler, > @@ -260,6 +290,7 @@ static rtems_status_code bsp_interrupt_server_call_helper( > ) > { > bsp_interrupt_server_helper_data hd = { > + .server = s, > .vector = vector, > .options = options, > .handler = handler, > @@ -271,6 +302,7 @@ static rtems_status_code bsp_interrupt_server_call_helper( > .arg = &hd > }; > rtems_interrupt_server_entry e = { > + .server = s, > .vector = BSP_INTERRUPT_SERVER_MANAGEMENT_VECTOR, > .actions = &a > }; > @@ -281,30 +313,32 @@ static rtems_status_code > bsp_interrupt_server_call_helper( > return hd.sc; > } > > -static rtems_interrupt_server_entry *bsp_interrupt_server_get_entry(void) > +static rtems_interrupt_server_entry *bsp_interrupt_server_get_entry( > + bsp_interrupt_server_context *s > +) > { > rtems_interrupt_lock_context lock_context; > rtems_interrupt_server_entry *e; > - rtems_chain_control *chain; > > - rtems_interrupt_lock_acquire(&bsp_interrupt_server_lock, &lock_context); > - chain = &bsp_interrupt_server_chain; > + rtems_interrupt_lock_acquire(&s->lock, &lock_context); > > - if (!rtems_chain_is_empty(chain)) { > + if (!rtems_chain_is_empty(&s->entries)) { > e = (rtems_interrupt_server_entry *) > - rtems_chain_get_first_unprotected(chain); > + rtems_chain_get_first_unprotected(&s->entries); > rtems_chain_set_off_chain(&e->node); > } else { > e = NULL; > } > > - rtems_interrupt_lock_release(&bsp_interrupt_server_lock, &lock_context); > + rtems_interrupt_lock_release(&s->lock, &lock_context); > > return e; > } > > static void bsp_interrupt_server_task(rtems_task_argument arg) > { > + bsp_interrupt_server_context *s = (bsp_interrupt_server_context *) arg; > + > while (true) { > rtems_event_set events; > rtems_interrupt_server_entry *e; > @@ -316,7 +350,7 @@ static void bsp_interrupt_server_task(rtems_task_argument > arg) > &events > ); > > - while ((e = bsp_interrupt_server_get_entry()) != NULL) { > + while ((e = bsp_interrupt_server_get_entry(s)) != NULL) { > rtems_interrupt_server_action *action = e->actions; > rtems_vector_number vector = e->vector; > > @@ -334,7 +368,7 @@ static void bsp_interrupt_server_task(rtems_task_argument > arg) > } > > rtems_status_code rtems_interrupt_server_handler_install( > - rtems_id server, > + uint32_t server_index, > rtems_vector_number vector, > const char *info, > rtems_option options, > @@ -343,17 +377,15 @@ rtems_status_code > rtems_interrupt_server_handler_install( > ) > { > rtems_status_code sc; > + bsp_interrupt_server_context *s; > > - sc = bsp_interrupt_server_is_initialized(); > - if (sc != RTEMS_SUCCESSFUL) { > + s = bsp_interrupt_server_get_context(server_index, &sc); > + if (s == NULL) { > return sc; > } > > - if (server != RTEMS_ID_NONE) { > - return RTEMS_NOT_IMPLEMENTED; > - } > - > return bsp_interrupt_server_call_helper( > + s, > vector, > options, > handler, > @@ -363,24 +395,22 @@ rtems_status_code > rtems_interrupt_server_handler_install( > } > > rtems_status_code rtems_interrupt_server_handler_remove( > - rtems_id server, > + uint32_t server_index, > rtems_vector_number vector, > rtems_interrupt_handler handler, > void *arg > ) > { > rtems_status_code sc; > + bsp_interrupt_server_context *s; > > - sc = bsp_interrupt_server_is_initialized(); > - if (sc != RTEMS_SUCCESSFUL) { > + s = bsp_interrupt_server_get_context(server_index, &sc); > + if (s == NULL) { > return sc; > } > > - if (server != RTEMS_ID_NONE) { > - return RTEMS_NOT_IMPLEMENTED; > - } > - > return bsp_interrupt_server_call_helper( > + s, > vector, > 0, > handler, > @@ -426,7 +456,7 @@ static void > bsp_interrupt_server_handler_iterate_helper(void *arg) > } > > rtems_status_code rtems_interrupt_server_handler_iterate( > - rtems_id server, > + uint32_t server_index, > rtems_vector_number vector, > rtems_interrupt_per_handler_routine routine, > void *arg > @@ -434,16 +464,13 @@ rtems_status_code > rtems_interrupt_server_handler_iterate( > { > rtems_status_code sc; > bsp_interrupt_server_handler_iterate_helper_data hihd; > + bsp_interrupt_server_context *s; > > - sc = bsp_interrupt_server_is_initialized(); > - if (sc != RTEMS_SUCCESSFUL) { > + s = bsp_interrupt_server_get_context(server_index, &sc); > + if (s == NULL) { > return sc; > } > > - if (server != RTEMS_ID_NONE) { > - return RTEMS_NOT_IMPLEMENTED; > - } > - > if (!bsp_interrupt_is_valid_vector(vector)) { > return RTEMS_INVALID_ID; > } > @@ -451,6 +478,7 @@ rtems_status_code rtems_interrupt_server_handler_iterate( > hihd.routine = routine; > hihd.arg = arg; > return bsp_interrupt_server_call_helper( > + s, > vector, > 0, > NULL, > @@ -464,42 +492,98 @@ rtems_status_code rtems_interrupt_server_initialize( > size_t stack_size, > rtems_mode modes, > rtems_attribute attributes, > - rtems_id *server > + uint32_t *server_count > ) > { > - rtems_status_code sc = RTEMS_SUCCESSFUL; > + uint32_t cpu_index; > + uint32_t cpu_count; > + uint32_t dummy; > + bsp_interrupt_server_context *instances; > > - if (server != NULL) { > - return RTEMS_NOT_IMPLEMENTED; > + if (server_count == NULL) { > + server_count = &dummy; > } > > - sc = rtems_task_create( > - rtems_build_name('I', 'R', 'Q', 'S'), > - priority, > - stack_size, > - modes, > - attributes, > - &bsp_interrupt_server_id > - ); > - if (sc != RTEMS_SUCCESSFUL) { > - return RTEMS_TOO_MANY; > + cpu_count = rtems_get_processor_count(); > + > +#if defined(RTEMS_SMP) > + instances = calloc(cpu_count, sizeof(*instances)); > + if (instances == NULL) { > + return RTEMS_NO_MEMORY; > } > +#else > + instances = &bsp_interrupt_server_instance; > +#endif > + > + for (cpu_index = 0; cpu_index < cpu_count; ++cpu_index) { > + bsp_interrupt_server_context *s = &instances[cpu_index]; > + rtems_status_code sc; > +#if defined(RTEMS_SMP) > + rtems_id scheduler; > + cpu_set_t cpu; > +#endif > + > + rtems_interrupt_lock_initialize(&s->lock, "Interrupt Server"); > + rtems_chain_initialize_empty(&s->entries); > + > + sc = rtems_task_create( > + rtems_build_name('I', 'R', 'Q', 'S'), > + priority, > + stack_size, > + modes, > + attributes, > + &s->server > + ); > + if (sc != RTEMS_SUCCESSFUL) { > + *server_count = cpu_index; > > - sc = rtems_task_start( > - bsp_interrupt_server_id, > - bsp_interrupt_server_task, > - 0 > - ); > - _Assert(sc == RTEMS_SUCCESSFUL); > +#if defined(RTEMS_SMP) > + if (cpu_index > 0) { > + return RTEMS_SUCCESSFUL; > + } > + > + free(instances); > +#endif > + > + return RTEMS_TOO_MANY; > + } > + > +#if defined(RTEMS_SMP) > + sc = rtems_scheduler_ident_by_processor(cpu_index, &scheduler); > + _Assert(sc == RTEMS_SUCCESSFUL); > + > + sc = rtems_task_set_scheduler(s->server, scheduler, priority); > + _Assert(sc == RTEMS_SUCCESSFUL); > + > + CPU_ZERO(&cpu); > + CPU_SET(cpu_index, &cpu); > + sc = rtems_task_set_affinity(s->server, sizeof(cpu), &cpu); > + _Assert(sc == RTEMS_SUCCESSFUL); > +#endif > + > + sc = rtems_task_start( > + s->server, > + bsp_interrupt_server_task, > + (rtems_task_argument) s > + ); > + _Assert(sc == RTEMS_SUCCESSFUL); > + } > + > +#if defined(RTEMS_SMP) > + bsp_interrupt_server_instances = instances; > +#endif > + *server_count = cpu_index; > > return RTEMS_SUCCESSFUL; > } > > static void bsp_interrupt_server_entry_initialize( > - rtems_interrupt_server_entry *entry > + rtems_interrupt_server_entry *entry, > + bsp_interrupt_server_context *s > ) > { > rtems_chain_set_off_chain(&entry->node); > + entry->server = s; > entry->vector = BSP_INTERRUPT_SERVER_MANAGEMENT_VECTOR; > entry->actions = NULL; > } > @@ -517,11 +601,21 @@ static void bsp_interrupt_server_action_prepend( > entry->actions = action; > } > > -void rtems_interrupt_server_entry_initialize( > +rtems_status_code rtems_interrupt_server_entry_initialize( > + uint32_t server_index, > rtems_interrupt_server_entry *entry > ) > { > - bsp_interrupt_server_entry_initialize(entry); > + rtems_status_code sc; > + bsp_interrupt_server_context *s; > + > + s = bsp_interrupt_server_get_context(server_index, &sc); > + if (s == NULL) { > + return sc; > + } > + > + bsp_interrupt_server_entry_initialize(entry, s); > + return RTEMS_SUCCESSFUL; > } > > void rtems_interrupt_server_action_prepend( > @@ -535,7 +629,6 @@ void rtems_interrupt_server_action_prepend( > } > > void rtems_interrupt_server_entry_submit( > - rtems_id server, > rtems_interrupt_server_entry *entry > ) > { > @@ -550,22 +643,24 @@ static void > bsp_interrupt_server_entry_destroy_helper(void *arg) > } > > void rtems_interrupt_server_entry_destroy( > - rtems_id server, > rtems_interrupt_server_entry *entry > ) > { > + bsp_interrupt_server_context *s; > rtems_interrupt_lock_context lock_context; > > - rtems_interrupt_lock_acquire(&bsp_interrupt_server_lock, &lock_context); > + s = entry->server; > + rtems_interrupt_lock_acquire(&s->lock, &lock_context); > > if (!rtems_chain_is_node_off_chain(&entry->node)) { > rtems_chain_extract_unprotected(&entry->node); > rtems_chain_set_off_chain(&entry->node); > } > > - rtems_interrupt_lock_release(&bsp_interrupt_server_lock, &lock_context); > + rtems_interrupt_lock_release(&s->lock, &lock_context); > > bsp_interrupt_server_call_helper( > + s, > BSP_INTERRUPT_SERVER_MANAGEMENT_VECTOR, > 0, > NULL, > @@ -574,17 +669,27 @@ void rtems_interrupt_server_entry_destroy( > ); > } > > -void rtems_interrupt_server_request_initialize( > +rtems_status_code rtems_interrupt_server_request_initialize( > + uint32_t server_index, > rtems_interrupt_server_request *request, > rtems_interrupt_handler handler, > void *arg > ) > { > - bsp_interrupt_server_entry_initialize(&request->entry); > + rtems_status_code sc; > + bsp_interrupt_server_context *s; > + > + s = bsp_interrupt_server_get_context(server_index, &sc); > + if (s == NULL) { > + return sc; > + } > + > + bsp_interrupt_server_entry_initialize(&request->entry, s); > bsp_interrupt_server_action_prepend( > &request->entry, > &request->action, > handler, > arg > ); > + return RTEMS_SUCCESSFUL; > } > diff --git a/cpukit/include/rtems/irq-extension.h > b/cpukit/include/rtems/irq-extension.h > index fec07675b8..0c72b6e086 100644 > --- a/cpukit/include/rtems/irq-extension.h > +++ b/cpukit/include/rtems/irq-extension.h > @@ -116,7 +116,7 @@ typedef void (*rtems_interrupt_handler)(void *); > * > * This function may block. > * > - * @retval RTEMS_SUCCESSFUL Shall be returned in case of success. > + * @retval RTEMS_SUCCESSFUL Successful operation. > * @retval RTEMS_CALLED_FROM_ISR If this function is called from interrupt > * context this shall be returned. > * @retval RTEMS_INVALID_ADDRESS If the handler address is NULL this shall be > @@ -149,7 +149,7 @@ rtems_status_code rtems_interrupt_handler_install( > * > * This function may block. > * > - * @retval RTEMS_SUCCESSFUL Shall be returned in case of success. > + * @retval RTEMS_SUCCESSFUL Successful operation. > * @retval RTEMS_CALLED_FROM_ISR If this function is called from interrupt > * context this shall be returned. > * @retval RTEMS_INVALID_ADDRESS If the handler address is NULL this shall be > @@ -189,7 +189,7 @@ typedef void (*rtems_interrupt_per_handler_routine)( > * This function may block. Never install or remove an interrupt handler > * within the iteration routine. This may result in a deadlock. > * > - * @retval RTEMS_SUCCESSFUL Shall be returned in case of success. > + * @retval RTEMS_SUCCESSFUL Successful operation. > * @retval RTEMS_CALLED_FROM_ISR If this function is called from interrupt > * context this shall be returned. > * @retval RTEMS_INVALID_ID If the vector number is out of range this shall > be > @@ -218,6 +218,11 @@ typedef struct rtems_interrupt_server_action { > } rtems_interrupt_server_action; > > /** > + * @brief The interrupt server index of the default interrupt server. > + */ > +#define RTEMS_INTERRUPT_SERVER_DEFAULT 0 > + > +/** > * @brief An interrupt server entry. > * > * This structure must be treated as an opaque data type. Members must not > be > @@ -230,6 +235,7 @@ typedef struct rtems_interrupt_server_action { > */ > typedef struct { > rtems_chain_node node; > + void *server; > rtems_vector_number vector; > rtems_interrupt_server_action *actions; > } rtems_interrupt_server_entry; > @@ -250,28 +256,29 @@ typedef struct { > } rtems_interrupt_server_request; > > /** > - * @brief Initializes an interrupt server task. > + * @brief Initializes the interrupt server tasks. > * > - * The task will have the priority @a priority, the stack size @a stack_size, > - * the modes @a modes and the attributes @a attributes. The identifier of > the > - * server task will be returned in @a server. Interrupt handlers can be > - * installed on the server with rtems_interrupt_server_handler_install() and > - * removed with rtems_interrupt_server_handler_remove() using this > identifier. > - * In case of an interrupt the request will be forwarded to the server. The > - * handlers are executed within the server context. If one handler blocks on > - * something this may delay the processing of other handlers. > + * This function tries to create an interrupt server task for each processor > in > + * the system. The tasks will have the priority @a priority, the stack size > @a > + * stack_size, the modes @a modes and the attributes @a attributes. The > count > + * of server tasks will be returned in @a server_count. Interrupt handlers > can > + * be installed on an interrupt server with > + * rtems_interrupt_server_handler_install() and removed with > + * rtems_interrupt_server_handler_remove() using a server index. In case of > an > + * interrupt, the request will be forwarded to the interrupt server. The > + * handlers are executed within the interrupt server context. If one handler > + * blocks on something this may delay the processing of other handlers. > * > - * The server identifier pointer @a server may be @a NULL to initialize the > - * default server. > + * The server count pointer @a server_count may be @a NULL. > * > * This function may block. > * > * @see rtems_task_create(). > * > - * @retval RTEMS_SUCCESSFUL Shall be returned in case of success. > - * @retval RTEMS_INCORRECT_STATE If the default server is already initialized > - * this shall be returned. > - * @retval RTEMS_TOO_MANY No free task available to create the server task. > + * @retval RTEMS_SUCCESSFUL Successful operation. > + * @retval RTEMS_INCORRECT_STATE The interrupt servers are not initialized. > + * @retval RTEMS_NO_MEMORY Not enough memory. > + * @retval RTEMS_TOO_MANY No free task available to create at least one > server task. > * @retval RTEMS_UNSATISFIED Task stack size too large. > * @retval RTEMS_INVALID_PRIORITY Invalid task priority. > */ > @@ -280,7 +287,7 @@ rtems_status_code rtems_interrupt_server_initialize( > size_t stack_size, > rtems_mode modes, > rtems_attribute attributes, > - rtems_id *server > + uint32_t *server_count > ); > > /** > @@ -288,20 +295,20 @@ rtems_status_code rtems_interrupt_server_initialize( > * vector with number @a vector on the server @a server. > * > * The handler routine will be executed on the corresponding interrupt server > - * task. A server identifier @a server of @c RTEMS_ID_NONE may be used to > - * install the handler on the default server. > + * task. A server index @a server_index of @c RTEMS_INTERRUPT_SERVER_DEFAULT > + * may be used to install the handler on the default server. > * > * This function may block. > * > * @see rtems_interrupt_handler_install(). > * > - * @retval RTEMS_SUCCESSFUL Shall be returned in case of success. > - * @retval RTEMS_INCORRECT_STATE If the interrupt handler server is not > - * initialized this shall be returned. > + * @retval RTEMS_SUCCESSFUL Successful operation. > + * @retval RTEMS_INCORRECT_STATE The interrupt servers are not initialized. > + * @retval RTEMS_INVALID_ID If the interrupt server index is invalid. > * @retval * For other errors see rtems_interrupt_handler_install(). > */ > rtems_status_code rtems_interrupt_server_handler_install( > - rtems_id server, > + uint32_t server_index, > rtems_vector_number vector, > const char *info, > rtems_option options, > @@ -313,20 +320,20 @@ rtems_status_code > rtems_interrupt_server_handler_install( > * @brief Removes the interrupt handler routine @a handler with argument @a > arg > * for the interrupt vector with number @a vector from the server @a server. > * > - * A server identifier @a server of @c RTEMS_ID_NONE may be used to remove > the > - * handler from the default server. > + * A server index @a server_index of @c RTEMS_INTERRUPT_SERVER_DEFAULT may be > + * used to remove the handler from the default server. > * > * This function may block. > * > * @see rtems_interrupt_handler_remove(). > * > - * @retval RTEMS_SUCCESSFUL Shall be returned in case of success. > - * @retval RTEMS_INCORRECT_STATE If the interrupt handler server is not > - * initialized this shall be returned. > + * @retval RTEMS_SUCCESSFUL Successful operation. > + * @retval RTEMS_INCORRECT_STATE The interrupt servers are not initialized. > + * @retval RTEMS_INVALID_ID If the interrupt server index is invalid. > * @retval * For other errors see rtems_interrupt_handler_remove(). > */ > rtems_status_code rtems_interrupt_server_handler_remove( > - rtems_id server, > + uint32_t server_index, > rtems_vector_number vector, > rtems_interrupt_handler handler, > void *arg > @@ -337,18 +344,18 @@ rtems_status_code rtems_interrupt_server_handler_remove( > * number @a vector which are installed on the interrupt server specified by > * @a server. > * > - * A server identifier @a server of @c RTEMS_ID_NONE may be used to specify > the > - * default server. > + * A server index @a server_index of @c RTEMS_INTERRUPT_SERVER_DEFAULT may be > + * used to specify the default server. > * > * @see rtems_interrupt_handler_iterate() > * > - * @retval RTEMS_SUCCESSFUL Shall be returned in case of success. > - * @retval RTEMS_INCORRECT_STATE If the interrupt handler server is not > - * initialized this shall be returned. > + * @retval RTEMS_SUCCESSFUL Successful operation. > + * @retval RTEMS_INCORRECT_STATE The interrupt servers are not initialized. > + * @retval RTEMS_INVALID_ID If the interrupt server index is invalid. > * @retval * For other errors see rtems_interrupt_handler_iterate(). > */ > rtems_status_code rtems_interrupt_server_handler_iterate( > - rtems_id server, > + uint32_t server_index, > rtems_vector_number vector, > rtems_interrupt_per_handler_routine routine, > void *arg > @@ -357,11 +364,18 @@ rtems_status_code > rtems_interrupt_server_handler_iterate( > /** > * @brief Initializes the specified interrupt server entry. > * > + * @param[in] server_index The interrupt server index. Use > + * @c RTEMS_INTERRUPT_SERVER_DEFAULT to specify the default server. > * @param[in] entry The interrupt server entry to initialize. > * > * @see rtems_interrupt_server_action_prepend(). > + * > + * @retval RTEMS_SUCCESSFUL Successful operation. > + * @retval RTEMS_INCORRECT_STATE The interrupt servers are not initialized. > + * @retval RTEMS_INVALID_ID If the interrupt server index is invalid. > */ > -void rtems_interrupt_server_entry_initialize( > +rtems_status_code rtems_interrupt_server_entry_initialize( > + uint32_t server_index, > rtems_interrupt_server_entry *entry > ); > > @@ -397,8 +411,6 @@ void rtems_interrupt_server_action_prepend( > * This function may be called from thread or interrupt context. It does not > * block. No error checking is performed. > * > - * @param[in] server The server identifier. Use @c RTEMS_ID_NONE to specify > - * the default server. > * @param[in] entry The interrupt server entry must be initialized before the > * first call to this function via > rtems_interrupt_server_entry_initialize() > * and rtems_interrupt_server_action_prepend(). The entry and its actions > @@ -406,36 +418,40 @@ void rtems_interrupt_server_action_prepend( > * rtems_interrupt_server_entry_destroy() to destroy an entry in use. > */ > void rtems_interrupt_server_entry_submit( > - rtems_id server, > rtems_interrupt_server_entry *entry > ); > > /** > * @brief Destroys the specified interrupt server entry. > * > - * This function must be called from thread context. It may block. No error > - * checking is performed. > + * This function must be called from thread context. It may block. Calling > + * this function within the context of an interrupt server is undefined > + * behaviour. No error checking is performed. > * > - * @param[in] server The server identifier. Use @c RTEMS_ID_NONE to specify > - * the default server. > + * @param[in] server_index The interrupt server index. Use > + * @c RTEMS_INTERRUPT_SERVER_DEFAULT to specify the default server. > * @param[in] entry The interrupt server entry to destroy. It must have been > * initialized via rtems_interrupt_server_entry_initialize(). > */ > void rtems_interrupt_server_entry_destroy( > - rtems_id server, > rtems_interrupt_server_entry *entry > ); > > /** > * @brief Initializes the specified interrupt server request. > * > - * No error checking is performed. > - * > + * @param[in] server_index The interrupt server index. Use > + * @c RTEMS_INTERRUPT_SERVER_DEFAULT to specify the default server. > * @param[in] request The interrupt server request to initialize. > * @param[in] handler The interrupt handler for the request action. > * @param[in] arg The interrupt handler argument for the request action. > + * > + * @retval RTEMS_SUCCESSFUL Successful operation. > + * @retval RTEMS_INCORRECT_STATE The interrupt servers are not initialized. > + * @retval RTEMS_INVALID_ID If the interrupt server index is invalid. > */ > -void rtems_interrupt_server_request_initialize( > +rtems_status_code rtems_interrupt_server_request_initialize( > + uint32_t server_index, > rtems_interrupt_server_request *request, > rtems_interrupt_handler handler, > void *arg > @@ -452,8 +468,6 @@ void rtems_interrupt_server_request_initialize( > * This function may be called from thread or interrupt context. It does not > * block. No error checking is performed. > * > - * @param[in] server The server identifier. Use @c RTEMS_ID_NONE to specify > - * the default server. > * @param[in] request The interrupt server request must be initialized > before the > * first call to this function via > * rtems_interrupt_server_request_initialize(). The request must not be > @@ -461,30 +475,27 @@ void rtems_interrupt_server_request_initialize( > * rtems_interrupt_server_request_destroy() to destroy a request in use. > */ > RTEMS_INLINE_ROUTINE void rtems_interrupt_server_request_submit( > - rtems_id server, > rtems_interrupt_server_request *request > ) > { > - rtems_interrupt_server_entry_submit( server, &request->entry ); > + rtems_interrupt_server_entry_submit( &request->entry ); > } > > /** > * @brief Destroys the specified interrupt server request. > * > - * This function must be called from thread context. It may block. No error > - * checking is performed. > + * This function must be called from thread context. It may block. Calling > + * this function within the context of an interrupt server is undefined > + * behaviour. No error checking is performed. > * > - * @param[in] server The server identifier. Use @c RTEMS_ID_NONE to specify > - * the default server. > * @param[in] request The interrupt server request to destroy. It must have > * been initialized via rtems_interrupt_server_request_initialize(). > */ > RTEMS_INLINE_ROUTINE void rtems_interrupt_server_request_destroy( > - rtems_id server, > rtems_interrupt_server_request *request > ) > { > - rtems_interrupt_server_entry_destroy( server, &request->entry ); > + rtems_interrupt_server_entry_destroy( &request->entry ); > } > > /** @} */ > -- > 2.12.3 > > _______________________________________________ > devel mailing list > devel@rtems.org > http://lists.rtems.org/mailman/listinfo/devel _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel