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;
}