forked from Imagelibrary/rtems
added initial set of api extension callouts
This commit is contained in:
@@ -21,6 +21,9 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <rtems/posix/config.h>
|
||||||
|
#include <rtems/posix/threadsup.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Data Structure used to manage a POSIX thread
|
* Data Structure used to manage a POSIX thread
|
||||||
*/
|
*/
|
||||||
@@ -33,6 +36,15 @@ typedef Thread_Control POSIX_Threads_Control;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
EXTERN Objects_Information _POSIX_Threads_Information;
|
EXTERN Objects_Information _POSIX_Threads_Information;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These are used to manage the user initialization tasks.
|
||||||
|
*/
|
||||||
|
|
||||||
|
EXTERN posix_initialization_tasks_table
|
||||||
|
*_POSIX_Threads_User_initialization_tasks;
|
||||||
|
EXTERN unsigned32 _POSIX_Threads_Number_of_initialization_tasks;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* _POSIX_Threads_Manager_initialization
|
* _POSIX_Threads_Manager_initialization
|
||||||
@@ -43,7 +55,9 @@ EXTERN Objects_Information _POSIX_Threads_Information;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
void _POSIX_Threads_Manager_initialization(
|
void _POSIX_Threads_Manager_initialization(
|
||||||
unsigned32 maximum_pthreads
|
unsigned32 maximum_pthreads,
|
||||||
|
unsigned32 number_of_initialization_tasks,
|
||||||
|
posix_initialization_tasks_table *user_tasks
|
||||||
);
|
);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ typedef struct {
|
|||||||
int cancelation_requested;
|
int cancelation_requested;
|
||||||
Chain_Control Cancellation_Handlers;
|
Chain_Control Cancellation_Handlers;
|
||||||
|
|
||||||
} POSIX_API_Thread_Support_Control;
|
} POSIX_API_Control;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
/* end of include file */
|
/* end of include file */
|
||||||
|
|||||||
@@ -21,6 +21,9 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <rtems/posix/config.h>
|
||||||
|
#include <rtems/posix/threadsup.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Data Structure used to manage a POSIX thread
|
* Data Structure used to manage a POSIX thread
|
||||||
*/
|
*/
|
||||||
@@ -33,6 +36,15 @@ typedef Thread_Control POSIX_Threads_Control;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
EXTERN Objects_Information _POSIX_Threads_Information;
|
EXTERN Objects_Information _POSIX_Threads_Information;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These are used to manage the user initialization tasks.
|
||||||
|
*/
|
||||||
|
|
||||||
|
EXTERN posix_initialization_tasks_table
|
||||||
|
*_POSIX_Threads_User_initialization_tasks;
|
||||||
|
EXTERN unsigned32 _POSIX_Threads_Number_of_initialization_tasks;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* _POSIX_Threads_Manager_initialization
|
* _POSIX_Threads_Manager_initialization
|
||||||
@@ -43,7 +55,9 @@ EXTERN Objects_Information _POSIX_Threads_Information;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
void _POSIX_Threads_Manager_initialization(
|
void _POSIX_Threads_Manager_initialization(
|
||||||
unsigned32 maximum_pthreads
|
unsigned32 maximum_pthreads,
|
||||||
|
unsigned32 number_of_initialization_tasks,
|
||||||
|
posix_initialization_tasks_table *user_tasks
|
||||||
);
|
);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ typedef struct {
|
|||||||
int cancelation_requested;
|
int cancelation_requested;
|
||||||
Chain_Control Cancellation_Handlers;
|
Chain_Control Cancellation_Handlers;
|
||||||
|
|
||||||
} POSIX_API_Thread_Support_Control;
|
} POSIX_API_Control;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
/* end of include file */
|
/* end of include file */
|
||||||
|
|||||||
@@ -7,9 +7,13 @@
|
|||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|
||||||
#include <rtems/system.h>
|
#include <rtems/system.h>
|
||||||
|
#include <rtems/score/apiext.h>
|
||||||
#include <rtems/score/stack.h>
|
#include <rtems/score/stack.h>
|
||||||
#include <rtems/score/thread.h>
|
#include <rtems/score/thread.h>
|
||||||
|
#include <rtems/score/userext.h>
|
||||||
|
#include <rtems/score/wkspace.h>
|
||||||
#include <rtems/posix/pthread.h>
|
#include <rtems/posix/pthread.h>
|
||||||
|
#include <rtems/posix/config.h>
|
||||||
|
|
||||||
/*PAGE
|
/*PAGE
|
||||||
*
|
*
|
||||||
@@ -33,6 +37,100 @@ const pthread_attr_t _POSIX_Threads_Default_attributes = {
|
|||||||
1 /* cputime_clock_allowed */
|
1 /* cputime_clock_allowed */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*PAGE
|
||||||
|
*
|
||||||
|
* _POSIX_Threads_Create_extension
|
||||||
|
*
|
||||||
|
* XXX
|
||||||
|
*/
|
||||||
|
|
||||||
|
boolean _POSIX_Threads_Create_extension(
|
||||||
|
Thread_Control *executing,
|
||||||
|
Thread_Control *created
|
||||||
|
)
|
||||||
|
{
|
||||||
|
POSIX_API_Control *api;
|
||||||
|
|
||||||
|
api = _Workspace_Allocate( sizeof( POSIX_API_Control ) );
|
||||||
|
|
||||||
|
if ( !api )
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
created->API_Extensions[ THREAD_API_POSIX ] = api;
|
||||||
|
|
||||||
|
/* XXX something should go here */
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*PAGE
|
||||||
|
*
|
||||||
|
* _POSIX_Threads_Delete_extension
|
||||||
|
*
|
||||||
|
* XXX
|
||||||
|
*/
|
||||||
|
|
||||||
|
User_extensions_routine _POSIX_Threads_Delete_extension(
|
||||||
|
Thread_Control *executing,
|
||||||
|
Thread_Control *deleted
|
||||||
|
)
|
||||||
|
{
|
||||||
|
(void) _Workspace_Free( deleted->API_Extensions[ THREAD_API_POSIX ] );
|
||||||
|
|
||||||
|
deleted->API_Extensions[ THREAD_API_POSIX ] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*PAGE
|
||||||
|
*
|
||||||
|
* _POSIX_Threads_Initialize_user_tasks
|
||||||
|
*
|
||||||
|
* This routine creates and starts all configured user
|
||||||
|
* initialzation threads.
|
||||||
|
*
|
||||||
|
* Input parameters: NONE
|
||||||
|
*
|
||||||
|
* Output parameters: NONE
|
||||||
|
*/
|
||||||
|
|
||||||
|
void _POSIX_Threads_Initialize_user_tasks( void )
|
||||||
|
{
|
||||||
|
unsigned32 index;
|
||||||
|
unsigned32 maximum;
|
||||||
|
posix_initialization_tasks_table *user_tasks;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NOTE: This is slightly different from the Ada implementation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
user_tasks = _POSIX_Threads_User_initialization_tasks;
|
||||||
|
maximum = _POSIX_Threads_Number_of_initialization_tasks;
|
||||||
|
|
||||||
|
for ( index=0 ; index < maximum ; index++ ) {
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
API_extensions_Control _POSIX_Threads_API_extensions = {
|
||||||
|
{ NULL, NULL },
|
||||||
|
NULL, /* predriver */
|
||||||
|
_POSIX_Threads_Initialize_user_tasks, /* postdriver */
|
||||||
|
NULL, /* post switch */
|
||||||
|
};
|
||||||
|
|
||||||
|
User_extensions_Control _POSIX_Threads_User_extensions = {
|
||||||
|
{ NULL, NULL },
|
||||||
|
{ _POSIX_Threads_Create_extension, /* create */
|
||||||
|
NULL, /* start */
|
||||||
|
NULL, /* restart */
|
||||||
|
_POSIX_Threads_Delete_extension, /* delete */
|
||||||
|
NULL, /* switch */
|
||||||
|
NULL, /* begin */
|
||||||
|
NULL, /* exitted */
|
||||||
|
NULL /* fatal */
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/*PAGE
|
/*PAGE
|
||||||
*
|
*
|
||||||
* _POSIX_Threads_Manager_initialization
|
* _POSIX_Threads_Manager_initialization
|
||||||
@@ -46,9 +144,19 @@ const pthread_attr_t _POSIX_Threads_Default_attributes = {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
void _POSIX_Threads_Manager_initialization(
|
void _POSIX_Threads_Manager_initialization(
|
||||||
unsigned32 maximum_pthreads
|
unsigned32 maximum_pthreads,
|
||||||
|
unsigned32 number_of_initialization_tasks,
|
||||||
|
posix_initialization_tasks_table *user_tasks
|
||||||
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
_POSIX_Threads_Number_of_initialization_tasks =
|
||||||
|
number_of_initialization_tasks;
|
||||||
|
_POSIX_Threads_User_initialization_tasks = user_tasks;
|
||||||
|
|
||||||
|
if ( user_tasks == NULL || number_of_initialization_tasks == 0 )
|
||||||
|
_Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, TRUE, EINVAL );
|
||||||
|
|
||||||
_Objects_Initialize_information(
|
_Objects_Initialize_information(
|
||||||
&_POSIX_Threads_Information,
|
&_POSIX_Threads_Information,
|
||||||
OBJECTS_POSIX_THREADS,
|
OBJECTS_POSIX_THREADS,
|
||||||
@@ -59,6 +167,8 @@ void _POSIX_Threads_Manager_initialization(
|
|||||||
_POSIX_PATH_MAX,
|
_POSIX_PATH_MAX,
|
||||||
TRUE
|
TRUE
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/* XXX add api extensions */
|
||||||
}
|
}
|
||||||
|
|
||||||
/*PAGE
|
/*PAGE
|
||||||
@@ -402,7 +512,29 @@ int pthread_create(
|
|||||||
void *arg
|
void *arg
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return POSIX_NOT_IMPLEMENTED();
|
const pthread_attr_t *local_attr;
|
||||||
|
|
||||||
|
local_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
|
||||||
|
|
||||||
|
if ( !local_attr->is_initialized )
|
||||||
|
return EINVAL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Core Thread Initialize insures we get the minimum amount of
|
||||||
|
* stack space.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
int contentionscope;
|
||||||
|
int inheritsched;
|
||||||
|
int schedpolicy;
|
||||||
|
struct sched_param schedparam;
|
||||||
|
|
||||||
|
#if defined(_POSIX_THREAD_CPUTIME)
|
||||||
|
int cputime_clock_allowed; /* see time.h */
|
||||||
|
#endif
|
||||||
|
int detachstate;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*PAGE
|
/*PAGE
|
||||||
|
|||||||
@@ -21,6 +21,9 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <rtems/posix/config.h>
|
||||||
|
#include <rtems/posix/threadsup.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Data Structure used to manage a POSIX thread
|
* Data Structure used to manage a POSIX thread
|
||||||
*/
|
*/
|
||||||
@@ -33,6 +36,15 @@ typedef Thread_Control POSIX_Threads_Control;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
EXTERN Objects_Information _POSIX_Threads_Information;
|
EXTERN Objects_Information _POSIX_Threads_Information;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These are used to manage the user initialization tasks.
|
||||||
|
*/
|
||||||
|
|
||||||
|
EXTERN posix_initialization_tasks_table
|
||||||
|
*_POSIX_Threads_User_initialization_tasks;
|
||||||
|
EXTERN unsigned32 _POSIX_Threads_Number_of_initialization_tasks;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* _POSIX_Threads_Manager_initialization
|
* _POSIX_Threads_Manager_initialization
|
||||||
@@ -43,7 +55,9 @@ EXTERN Objects_Information _POSIX_Threads_Information;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
void _POSIX_Threads_Manager_initialization(
|
void _POSIX_Threads_Manager_initialization(
|
||||||
unsigned32 maximum_pthreads
|
unsigned32 maximum_pthreads,
|
||||||
|
unsigned32 number_of_initialization_tasks,
|
||||||
|
posix_initialization_tasks_table *user_tasks
|
||||||
);
|
);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ typedef struct {
|
|||||||
int cancelation_requested;
|
int cancelation_requested;
|
||||||
Chain_Control Cancellation_Handlers;
|
Chain_Control Cancellation_Handlers;
|
||||||
|
|
||||||
} POSIX_API_Thread_Support_Control;
|
} POSIX_API_Control;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
/* end of include file */
|
/* end of include file */
|
||||||
|
|||||||
@@ -7,9 +7,13 @@
|
|||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|
||||||
#include <rtems/system.h>
|
#include <rtems/system.h>
|
||||||
|
#include <rtems/score/apiext.h>
|
||||||
#include <rtems/score/stack.h>
|
#include <rtems/score/stack.h>
|
||||||
#include <rtems/score/thread.h>
|
#include <rtems/score/thread.h>
|
||||||
|
#include <rtems/score/userext.h>
|
||||||
|
#include <rtems/score/wkspace.h>
|
||||||
#include <rtems/posix/pthread.h>
|
#include <rtems/posix/pthread.h>
|
||||||
|
#include <rtems/posix/config.h>
|
||||||
|
|
||||||
/*PAGE
|
/*PAGE
|
||||||
*
|
*
|
||||||
@@ -33,6 +37,100 @@ const pthread_attr_t _POSIX_Threads_Default_attributes = {
|
|||||||
1 /* cputime_clock_allowed */
|
1 /* cputime_clock_allowed */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*PAGE
|
||||||
|
*
|
||||||
|
* _POSIX_Threads_Create_extension
|
||||||
|
*
|
||||||
|
* XXX
|
||||||
|
*/
|
||||||
|
|
||||||
|
boolean _POSIX_Threads_Create_extension(
|
||||||
|
Thread_Control *executing,
|
||||||
|
Thread_Control *created
|
||||||
|
)
|
||||||
|
{
|
||||||
|
POSIX_API_Control *api;
|
||||||
|
|
||||||
|
api = _Workspace_Allocate( sizeof( POSIX_API_Control ) );
|
||||||
|
|
||||||
|
if ( !api )
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
created->API_Extensions[ THREAD_API_POSIX ] = api;
|
||||||
|
|
||||||
|
/* XXX something should go here */
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*PAGE
|
||||||
|
*
|
||||||
|
* _POSIX_Threads_Delete_extension
|
||||||
|
*
|
||||||
|
* XXX
|
||||||
|
*/
|
||||||
|
|
||||||
|
User_extensions_routine _POSIX_Threads_Delete_extension(
|
||||||
|
Thread_Control *executing,
|
||||||
|
Thread_Control *deleted
|
||||||
|
)
|
||||||
|
{
|
||||||
|
(void) _Workspace_Free( deleted->API_Extensions[ THREAD_API_POSIX ] );
|
||||||
|
|
||||||
|
deleted->API_Extensions[ THREAD_API_POSIX ] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*PAGE
|
||||||
|
*
|
||||||
|
* _POSIX_Threads_Initialize_user_tasks
|
||||||
|
*
|
||||||
|
* This routine creates and starts all configured user
|
||||||
|
* initialzation threads.
|
||||||
|
*
|
||||||
|
* Input parameters: NONE
|
||||||
|
*
|
||||||
|
* Output parameters: NONE
|
||||||
|
*/
|
||||||
|
|
||||||
|
void _POSIX_Threads_Initialize_user_tasks( void )
|
||||||
|
{
|
||||||
|
unsigned32 index;
|
||||||
|
unsigned32 maximum;
|
||||||
|
posix_initialization_tasks_table *user_tasks;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NOTE: This is slightly different from the Ada implementation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
user_tasks = _POSIX_Threads_User_initialization_tasks;
|
||||||
|
maximum = _POSIX_Threads_Number_of_initialization_tasks;
|
||||||
|
|
||||||
|
for ( index=0 ; index < maximum ; index++ ) {
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
API_extensions_Control _POSIX_Threads_API_extensions = {
|
||||||
|
{ NULL, NULL },
|
||||||
|
NULL, /* predriver */
|
||||||
|
_POSIX_Threads_Initialize_user_tasks, /* postdriver */
|
||||||
|
NULL, /* post switch */
|
||||||
|
};
|
||||||
|
|
||||||
|
User_extensions_Control _POSIX_Threads_User_extensions = {
|
||||||
|
{ NULL, NULL },
|
||||||
|
{ _POSIX_Threads_Create_extension, /* create */
|
||||||
|
NULL, /* start */
|
||||||
|
NULL, /* restart */
|
||||||
|
_POSIX_Threads_Delete_extension, /* delete */
|
||||||
|
NULL, /* switch */
|
||||||
|
NULL, /* begin */
|
||||||
|
NULL, /* exitted */
|
||||||
|
NULL /* fatal */
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/*PAGE
|
/*PAGE
|
||||||
*
|
*
|
||||||
* _POSIX_Threads_Manager_initialization
|
* _POSIX_Threads_Manager_initialization
|
||||||
@@ -46,9 +144,19 @@ const pthread_attr_t _POSIX_Threads_Default_attributes = {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
void _POSIX_Threads_Manager_initialization(
|
void _POSIX_Threads_Manager_initialization(
|
||||||
unsigned32 maximum_pthreads
|
unsigned32 maximum_pthreads,
|
||||||
|
unsigned32 number_of_initialization_tasks,
|
||||||
|
posix_initialization_tasks_table *user_tasks
|
||||||
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
_POSIX_Threads_Number_of_initialization_tasks =
|
||||||
|
number_of_initialization_tasks;
|
||||||
|
_POSIX_Threads_User_initialization_tasks = user_tasks;
|
||||||
|
|
||||||
|
if ( user_tasks == NULL || number_of_initialization_tasks == 0 )
|
||||||
|
_Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, TRUE, EINVAL );
|
||||||
|
|
||||||
_Objects_Initialize_information(
|
_Objects_Initialize_information(
|
||||||
&_POSIX_Threads_Information,
|
&_POSIX_Threads_Information,
|
||||||
OBJECTS_POSIX_THREADS,
|
OBJECTS_POSIX_THREADS,
|
||||||
@@ -59,6 +167,8 @@ void _POSIX_Threads_Manager_initialization(
|
|||||||
_POSIX_PATH_MAX,
|
_POSIX_PATH_MAX,
|
||||||
TRUE
|
TRUE
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/* XXX add api extensions */
|
||||||
}
|
}
|
||||||
|
|
||||||
/*PAGE
|
/*PAGE
|
||||||
@@ -402,7 +512,29 @@ int pthread_create(
|
|||||||
void *arg
|
void *arg
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return POSIX_NOT_IMPLEMENTED();
|
const pthread_attr_t *local_attr;
|
||||||
|
|
||||||
|
local_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
|
||||||
|
|
||||||
|
if ( !local_attr->is_initialized )
|
||||||
|
return EINVAL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Core Thread Initialize insures we get the minimum amount of
|
||||||
|
* stack space.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
int contentionscope;
|
||||||
|
int inheritsched;
|
||||||
|
int schedpolicy;
|
||||||
|
struct sched_param schedparam;
|
||||||
|
|
||||||
|
#if defined(_POSIX_THREAD_CPUTIME)
|
||||||
|
int cputime_clock_allowed; /* see time.h */
|
||||||
|
#endif
|
||||||
|
int detachstate;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*PAGE
|
/*PAGE
|
||||||
|
|||||||
Reference in New Issue
Block a user