summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems/src/taskcreate.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/rtems/src/taskcreate.c')
-rw-r--r--cpukit/rtems/src/taskcreate.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/cpukit/rtems/src/taskcreate.c b/cpukit/rtems/src/taskcreate.c
index 26953828e9..4055e1eb50 100644
--- a/cpukit/rtems/src/taskcreate.c
+++ b/cpukit/rtems/src/taskcreate.c
@@ -20,12 +20,15 @@
#include <rtems/rtems/tasksimpl.h>
#include <rtems/rtems/attrimpl.h>
+#include <rtems/rtems/eventimpl.h>
#include <rtems/rtems/modesimpl.h>
#include <rtems/rtems/support.h>
#include <rtems/score/apimutex.h>
#include <rtems/score/schedulerimpl.h>
#include <rtems/score/sysstate.h>
#include <rtems/score/threadimpl.h>
+#include <rtems/score/userextimpl.h>
+#include <rtems/sysinit.h>
rtems_status_code rtems_task_create(
rtems_name name,
@@ -198,3 +201,62 @@ rtems_status_code rtems_task_create(
_Objects_Allocator_unlock();
return RTEMS_SUCCESSFUL;
}
+
+static void _RTEMS_tasks_Start_extension(
+ Thread_Control *executing,
+ Thread_Control *started
+)
+{
+ RTEMS_API_Control *api;
+
+ api = started->API_Extensions[ THREAD_API_RTEMS ];
+
+ _Event_Initialize( &api->Event );
+ _Event_Initialize( &api->System_event );
+}
+
+#if defined(RTEMS_MULTIPROCESSING)
+static void _RTEMS_tasks_Terminate_extension( Thread_Control *executing )
+{
+ if ( executing->is_global ) {
+ _Objects_MP_Close(
+ &_RTEMS_tasks_Information.Objects,
+ executing->Object.id
+ );
+ _RTEMS_tasks_MP_Send_process_packet(
+ RTEMS_TASKS_MP_ANNOUNCE_DELETE,
+ executing->Object.id,
+ 0 /* Not used */
+ );
+ }
+}
+#endif
+
+static User_extensions_Control _RTEMS_tasks_User_extensions = {
+ .Callouts = {
+#if defined(RTEMS_MULTIPROCESSING)
+ .thread_terminate = _RTEMS_tasks_Terminate_extension,
+#endif
+ .thread_start = _RTEMS_tasks_Start_extension,
+ .thread_restart = _RTEMS_tasks_Start_extension
+ }
+};
+
+static void _RTEMS_tasks_Manager_initialization(void)
+{
+ _Thread_Initialize_information( &_RTEMS_tasks_Information );
+ _User_extensions_Add_API_set( &_RTEMS_tasks_User_extensions );
+
+#if defined(RTEMS_MULTIPROCESSING)
+ _MPCI_Register_packet_processor(
+ MP_PACKET_TASKS,
+ _RTEMS_tasks_MP_Process_packet
+ );
+#endif
+}
+
+RTEMS_SYSINIT_ITEM(
+ _RTEMS_tasks_Manager_initialization,
+ RTEMS_SYSINIT_CLASSIC_TASKS,
+ RTEMS_SYSINIT_ORDER_MIDDLE
+);