Add interrupt server suspend/resume

This mechanism can be used to safely move the interrupt server from one
scheduler instance to another for example.

Update #3071.
This commit is contained in:
Sebastian Huber
2017-07-11 08:48:15 +02:00
parent e7ee719f79
commit a961e1980c
3 changed files with 104 additions and 2 deletions

View File

@@ -635,7 +635,7 @@ void rtems_interrupt_server_entry_submit(
bsp_interrupt_server_trigger(entry);
}
static void bsp_interrupt_server_entry_destroy_helper(void *arg)
static void bsp_interrupt_server_entry_synchronize_helper(void *arg)
{
bsp_interrupt_server_helper_data *hd = arg;
@@ -665,7 +665,7 @@ void rtems_interrupt_server_entry_destroy(
0,
NULL,
NULL,
bsp_interrupt_server_entry_destroy_helper
bsp_interrupt_server_entry_synchronize_helper
);
}
@@ -693,3 +693,60 @@ rtems_status_code rtems_interrupt_server_request_initialize(
);
return RTEMS_SUCCESSFUL;
}
static void bsp_interrupt_server_entry_suspend_helper(void *arg)
{
bsp_interrupt_server_helper_data *hd = arg;
rtems_event_set events;
rtems_event_transient_send(hd->task);
rtems_event_system_receive(
RTEMS_EVENT_SYSTEM_SERVER_RESUME,
RTEMS_WAIT,
RTEMS_NO_TIMEOUT,
&events
);
}
rtems_status_code rtems_interrupt_server_suspend(uint32_t server_index)
{
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_call_helper(
s,
BSP_INTERRUPT_SERVER_MANAGEMENT_VECTOR,
0,
NULL,
NULL,
bsp_interrupt_server_entry_suspend_helper
);
return RTEMS_SUCCESSFUL;
}
rtems_status_code rtems_interrupt_server_resume(uint32_t server_index)
{
rtems_status_code sc;
bsp_interrupt_server_context *s;
s = bsp_interrupt_server_get_context(server_index, &sc);
if (s == NULL) {
return sc;
}
rtems_event_system_send(s->server, RTEMS_EVENT_SYSTEM_SERVER_RESUME);
bsp_interrupt_server_call_helper(
s,
BSP_INTERRUPT_SERVER_MANAGEMENT_VECTOR,
0,
NULL,
NULL,
bsp_interrupt_server_entry_synchronize_helper
);
return RTEMS_SUCCESSFUL;
}

View File

@@ -361,6 +361,45 @@ rtems_status_code rtems_interrupt_server_handler_iterate(
void *arg
);
/**
* @brief Suspends the specified interrupt server.
*
* A suspend request is sent to the specified interrupt server. This function
* waits for an acknowledgment from the specified interrupt server.
*
* This function must be called from thread context. It may block. Calling
* this function within the context of an interrupt server is undefined
* behaviour.
*
* @param[in] server_index The interrupt server index. Use
* @c RTEMS_INTERRUPT_SERVER_DEFAULT to specify the default server.
*
* @see rtems_interrupt_server_resume().
*
* @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.
*/
rtems_status_code rtems_interrupt_server_suspend( uint32_t server_index );
/**
* @brief Resumes the specified interrupt server.
*
* This function must be called from thread context. It may block. Calling
* this function within the context of an interrupt server is undefined
* behaviour.
*
* @param[in] server_index The interrupt server index. Use
* @c RTEMS_INTERRUPT_SERVER_DEFAULT to specify the default server.
*
* @see rtems_interrupt_server_suspend().
*
* @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.
*/
rtems_status_code rtems_interrupt_server_resume( uint32_t server_index );
/**
* @brief Initializes the specified interrupt server entry.
*

View File

@@ -318,6 +318,12 @@ rtems_status_code rtems_event_receive (
*/
#define RTEMS_EVENT_SYSTEM_NETWORK_CLOSE RTEMS_EVENT_26
/**
* @brief Reserved system event to resume server threads, e.g timer or
* interrupt server.
*/
#define RTEMS_EVENT_SYSTEM_SERVER_RESUME RTEMS_EVENT_29
/**
* @brief Reserved system event for the server threads, e.g timer or interrupt
* server.