From 03598b162e66b6f3df8d9ed55ac18865c5ad2a22 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Mon, 25 Jan 1999 23:20:52 +0000 Subject: Split most of POSIX Threads Manager into multiple files. --- cpukit/posix/src/pthread.c | 957 -------------------------- cpukit/posix/src/pthreadatfork.c | 9 + cpukit/posix/src/pthreadattrdestroy.c | 30 + cpukit/posix/src/pthreadattrgetdetachstate.c | 30 + cpukit/posix/src/pthreadattrgetinheritsched.c | 30 + cpukit/posix/src/pthreadattrgetschedparam.c | 29 + cpukit/posix/src/pthreadattrgetschedpolicy.c | 30 + cpukit/posix/src/pthreadattrgetscope.c | 29 + cpukit/posix/src/pthreadattrgetstackaddr.c | 29 + cpukit/posix/src/pthreadattrgetstacksize.c | 29 + cpukit/posix/src/pthreadattrinit.c | 31 + cpukit/posix/src/pthreadattrsetdetachstate.c | 36 + cpukit/posix/src/pthreadattrsetinheritsched.c | 39 ++ cpukit/posix/src/pthreadattrsetschedparam.c | 29 + cpukit/posix/src/pthreadattrsetschedpolicy.c | 41 ++ cpukit/posix/src/pthreadattrsetscope.c | 41 ++ cpukit/posix/src/pthreadattrsetstackaddr.c | 29 + cpukit/posix/src/pthreadattrsetstacksize.c | 34 + cpukit/posix/src/pthreadcreate.c | 250 +++++++ cpukit/posix/src/pthreaddetach.c | 46 ++ cpukit/posix/src/pthreadequal.c | 79 +++ cpukit/posix/src/pthreadexit.c | 43 ++ cpukit/posix/src/pthreadgetcpuclockid.c | 25 + cpukit/posix/src/pthreadgetcputime.c | 29 + cpukit/posix/src/pthreadgetschedparam.c | 53 ++ cpukit/posix/src/pthreadjoin.c | 70 ++ cpukit/posix/src/pthreadonce.c | 40 ++ cpukit/posix/src/pthreadself.c | 25 + cpukit/posix/src/pthreadsetcputime.c | 36 + cpukit/posix/src/pthreadsetschedparam.c | 126 ++++ 30 files changed, 1347 insertions(+), 957 deletions(-) create mode 100644 cpukit/posix/src/pthreadattrdestroy.c create mode 100644 cpukit/posix/src/pthreadattrgetdetachstate.c create mode 100644 cpukit/posix/src/pthreadattrgetinheritsched.c create mode 100644 cpukit/posix/src/pthreadattrgetschedparam.c create mode 100644 cpukit/posix/src/pthreadattrgetschedpolicy.c create mode 100644 cpukit/posix/src/pthreadattrgetscope.c create mode 100644 cpukit/posix/src/pthreadattrgetstackaddr.c create mode 100644 cpukit/posix/src/pthreadattrgetstacksize.c create mode 100644 cpukit/posix/src/pthreadattrinit.c create mode 100644 cpukit/posix/src/pthreadattrsetdetachstate.c create mode 100644 cpukit/posix/src/pthreadattrsetinheritsched.c create mode 100644 cpukit/posix/src/pthreadattrsetschedparam.c create mode 100644 cpukit/posix/src/pthreadattrsetschedpolicy.c create mode 100644 cpukit/posix/src/pthreadattrsetscope.c create mode 100644 cpukit/posix/src/pthreadattrsetstackaddr.c create mode 100644 cpukit/posix/src/pthreadattrsetstacksize.c create mode 100644 cpukit/posix/src/pthreadcreate.c create mode 100644 cpukit/posix/src/pthreaddetach.c create mode 100644 cpukit/posix/src/pthreadequal.c create mode 100644 cpukit/posix/src/pthreadexit.c create mode 100644 cpukit/posix/src/pthreadgetcpuclockid.c create mode 100644 cpukit/posix/src/pthreadgetcputime.c create mode 100644 cpukit/posix/src/pthreadgetschedparam.c create mode 100644 cpukit/posix/src/pthreadjoin.c create mode 100644 cpukit/posix/src/pthreadonce.c create mode 100644 cpukit/posix/src/pthreadself.c create mode 100644 cpukit/posix/src/pthreadsetcputime.c create mode 100644 cpukit/posix/src/pthreadsetschedparam.c (limited to 'cpukit/posix') diff --git a/cpukit/posix/src/pthread.c b/cpukit/posix/src/pthread.c index f8c6116dd0..dc6cd59947 100644 --- a/cpukit/posix/src/pthread.c +++ b/cpukit/posix/src/pthread.c @@ -354,960 +354,3 @@ void _POSIX_Threads_Manager_initialization( */ } - -/*PAGE - * - * 3.1.3 Register Fork Handlers, P1003.1c/Draft 10, P1003.1c/Draft 10, p. 27 - * - * RTEMS does not support processes, so we fall under this and do not - * provide this routine: - * - * "Either the implementation shall support the pthread_atfork() function - * as described above or the pthread_atfork() funciton shall not be - * provided." - */ - -/*PAGE - * - * 13.5.1 Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120 - */ - -int pthread_attr_setscope( - pthread_attr_t *attr, - int contentionscope -) -{ - if ( !attr || !attr->is_initialized ) - return EINVAL; - - switch ( contentionscope ) { - case PTHREAD_SCOPE_PROCESS: - attr->contentionscope = contentionscope; - return 0; - - case PTHREAD_SCOPE_SYSTEM: - return ENOTSUP; - - default: - return EINVAL; - } -} - -/*PAGE - * - * 13.5.1 Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120 - */ - -int pthread_attr_getscope( - const pthread_attr_t *attr, - int *contentionscope -) -{ - if ( !attr || !attr->is_initialized || !contentionscope ) - return EINVAL; - - *contentionscope = attr->contentionscope; - return 0; -} - -/*PAGE - * - * 13.5.1 Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120 - */ - -int pthread_attr_setinheritsched( - pthread_attr_t *attr, - int inheritsched -) -{ - if ( !attr || !attr->is_initialized ) - return EINVAL; - - switch ( inheritsched ) { - case PTHREAD_INHERIT_SCHED: - case PTHREAD_EXPLICIT_SCHED: - attr->inheritsched = inheritsched; - return 0; - - default: - return ENOTSUP; - } -} - -/*PAGE - * - * 13.5.1 Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120 - */ - -int pthread_attr_getinheritsched( - const pthread_attr_t *attr, - int *inheritsched -) -{ - if ( !attr || !attr->is_initialized || !inheritsched ) - return EINVAL; - - *inheritsched = attr->inheritsched; - return 0; -} - -/*PAGE - * - * 13.5.1 Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120 - */ - -int pthread_attr_setschedpolicy( - pthread_attr_t *attr, - int policy -) -{ - if ( !attr || !attr->is_initialized ) - return EINVAL; - - switch ( policy ) { - case SCHED_OTHER: - case SCHED_FIFO: - case SCHED_RR: - case SCHED_SPORADIC: - attr->schedpolicy = policy; - return 0; - - default: - return ENOTSUP; - } -} - -/*PAGE - * - * 13.5.1 Thread Creation Scheduling Parameters, P1003.1c/Draft 10, p. 120 - */ - -int pthread_attr_getschedpolicy( - const pthread_attr_t *attr, - int *policy -) -{ - if ( !attr || !attr->is_initialized || !policy ) - return EINVAL; - - *policy = attr->schedpolicy; - return 0; -} - -/*PAGE - * - * 13.5.1 Thread Creation Scheduling Parameters, P1003.1c/Draft 10, p. 120 - */ - -int pthread_attr_setschedparam( - pthread_attr_t *attr, - const struct sched_param *param -) -{ - if ( !attr || !attr->is_initialized || !param ) - return EINVAL; - - attr->schedparam = *param; - return 0; -} - -/*PAGE - * - * 13.5.1 Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120 - */ - -int pthread_attr_getschedparam( - const pthread_attr_t *attr, - struct sched_param *param -) -{ - if ( !attr || !attr->is_initialized || !param ) - return EINVAL; - - *param = attr->schedparam; - return 0; -} - -/*PAGE - * - * 13.5.2 Dynamic Thread Scheduling Parameters Access, - * P1003.1c/Draft 10, p. 124 - */ - -int pthread_getschedparam( - pthread_t thread, - int *policy, - struct sched_param *param -) -{ - Objects_Locations location; - POSIX_API_Control *api; - register Thread_Control *the_thread; - - if ( !policy || !param ) - return EINVAL; - - the_thread = _POSIX_Threads_Get( thread, &location ); - switch ( location ) { - case OBJECTS_ERROR: - case OBJECTS_REMOTE: - return ESRCH; - case OBJECTS_LOCAL: - api = the_thread->API_Extensions[ THREAD_API_POSIX ]; - *policy = api->schedpolicy; - *param = api->schedparam; - param->sched_priority = - _POSIX_Priority_From_core( the_thread->current_priority ); - _Thread_Enable_dispatch(); - return 0; - } - - return POSIX_BOTTOM_REACHED(); - -} - -/*PAGE - * - * 13.5.2 Dynamic Thread Scheduling Parameters Access, - * P1003.1c/Draft 10, p. 124 - */ - -int pthread_setschedparam( - pthread_t thread, - int policy, - struct sched_param *param -) -{ - register Thread_Control *the_thread; - POSIX_API_Control *api; - Thread_CPU_budget_algorithms budget_algorithm; - Thread_CPU_budget_algorithm_callout budget_callout; - Objects_Locations location; - - /* - * Check all the parameters - */ - - if ( !param ) - return EINVAL; - - if ( !_POSIX_Priority_Is_valid( param->sched_priority ) ) - return EINVAL; - - budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; - budget_callout = NULL; - - switch ( policy ) { - case SCHED_OTHER: - budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE; - break; - - case SCHED_FIFO: - budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; - break; - - case SCHED_RR: - budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE; - break; - - case SCHED_SPORADIC: - budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT; - budget_callout = _POSIX_Threads_Sporadic_budget_callout; - - if ( _POSIX_Timespec_to_interval( ¶m->ss_replenish_period ) < - _POSIX_Timespec_to_interval( ¶m->ss_initial_budget ) ) - return EINVAL; - - if ( !_POSIX_Priority_Is_valid( param->ss_low_priority ) ) - return EINVAL; - - break; - - default: - return EINVAL; - } - - /* - * Actually change the scheduling policy and parameters - */ - - the_thread = _POSIX_Threads_Get( thread, &location ); - switch ( location ) { - case OBJECTS_ERROR: - case OBJECTS_REMOTE: - return ESRCH; - case OBJECTS_LOCAL: - api = the_thread->API_Extensions[ THREAD_API_POSIX ]; - - if ( api->schedpolicy == SCHED_SPORADIC ) - (void) _Watchdog_Remove( &api->Sporadic_timer ); - - api->schedpolicy = policy; - api->schedparam = *param; - the_thread->budget_algorithm = budget_algorithm; - the_thread->budget_callout = budget_callout; - - switch ( api->schedpolicy ) { - case SCHED_OTHER: - case SCHED_FIFO: - case SCHED_RR: - the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice; - - the_thread->real_priority = - _POSIX_Priority_To_core( api->schedparam.sched_priority ); - - _Thread_Change_priority( - the_thread, - the_thread->real_priority, - TRUE - ); - break; - - case SCHED_SPORADIC: - api->ss_high_priority = api->schedparam.sched_priority; - _POSIX_Threads_Sporadic_budget_TSR( 0, the_thread ); - break; - } - - _Thread_Enable_dispatch(); - return 0; - } - return POSIX_BOTTOM_REACHED(); -} - -/*PAGE - * - * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140 - */ - -int pthread_attr_init( - pthread_attr_t *attr -) -{ - if ( !attr ) - return EINVAL; - - *attr = _POSIX_Threads_Default_attributes; - return 0; -} - -/*PAGE - * - * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140 - */ - -int pthread_attr_destroy( - pthread_attr_t *attr -) -{ - if ( !attr || !attr->is_initialized ) - return EINVAL; - - attr->is_initialized = FALSE; - return 0; -} - -/*PAGE - * - * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140 - */ - -int pthread_attr_getstacksize( - const pthread_attr_t *attr, - size_t *stacksize -) -{ - if ( !attr || !attr->is_initialized || !stacksize ) - return EINVAL; - - *stacksize = attr->stacksize; - return 0; -} - -/*PAGE - * - * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140 - */ - -int pthread_attr_setstacksize( - pthread_attr_t *attr, - size_t stacksize -) -{ - if ( !attr || !attr->is_initialized ) - return EINVAL; - - if (stacksize < PTHREAD_MINIMUM_STACK_SIZE) - attr->stacksize = PTHREAD_MINIMUM_STACK_SIZE; - else - attr->stacksize = stacksize; - return 0; -} - -/*PAGE - * - * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140 - */ - -int pthread_attr_getstackaddr( - const pthread_attr_t *attr, - void **stackaddr -) -{ - if ( !attr || !attr->is_initialized || !stackaddr ) - return EINVAL; - - *stackaddr = attr->stackaddr; - return 0; -} - -/*PAGE - * - * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140 - */ - -int pthread_attr_setstackaddr( - pthread_attr_t *attr, - void *stackaddr -) -{ - if ( !attr || !attr->is_initialized ) - return EINVAL; - - attr->stackaddr = stackaddr; - return 0; -} - -/*PAGE - * - * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140 - */ - -int pthread_attr_getdetachstate( - const pthread_attr_t *attr, - int *detachstate -) -{ - if ( !attr || !attr->is_initialized || !detachstate ) - return EINVAL; - - *detachstate = attr->detachstate; - return 0; -} - -/*PAGE - * - * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140 - */ - -int pthread_attr_setdetachstate( - pthread_attr_t *attr, - int detachstate -) -{ - if ( !attr || !attr->is_initialized ) - return EINVAL; - - switch ( detachstate ) { - case PTHREAD_CREATE_DETACHED: - case PTHREAD_CREATE_JOINABLE: - attr->detachstate = detachstate; - return 0; - - default: - return EINVAL; - } -} - -/*PAGE - * - * 16.1.2 Thread Creation, P1003.1c/Draft 10, p. 144 - */ - -int pthread_create( - pthread_t *thread, - const pthread_attr_t *attr, - void *(*start_routine)( void * ), - void *arg -) -{ - const pthread_attr_t *the_attr; - Priority_Control core_priority; - Thread_CPU_budget_algorithms budget_algorithm; - Thread_CPU_budget_algorithm_callout budget_callout; - boolean is_fp; - boolean status; - Thread_Control *the_thread; - char *default_name = "psx"; - POSIX_API_Control *api; - int schedpolicy = SCHED_RR; - struct sched_param schedparam; - - the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes; - - if ( !the_attr->is_initialized ) - return EINVAL; - - /* - * Core Thread Initialize insures we get the minimum amount of - * stack space if it is allowed to allocate it itself. - */ - - if ( the_attr->stackaddr && !_Stack_Is_enough( the_attr->stacksize ) ) - return EINVAL; - -#if 0 - int cputime_clock_allowed; /* see time.h */ - POSIX_NOT_IMPLEMENTED(); -#endif - - /* - * P1003.1c/Draft 10, p. 121. - * - * If inheritsched is set to PTHREAD_INHERIT_SCHED, then this thread - * inherits scheduling attributes from the creating thread. If it is - * PTHREAD_EXPLICIT_SCHED, then scheduling parameters come from the - * attributes structure. - */ - - switch ( the_attr->inheritsched ) { - case PTHREAD_INHERIT_SCHED: - api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; - schedpolicy = api->schedpolicy; - schedparam = api->schedparam; - break; - - case PTHREAD_EXPLICIT_SCHED: - schedpolicy = the_attr->schedpolicy; - schedparam = the_attr->schedparam; - break; - - default: - return EINVAL; - } - - /* - * Check the contentionscope since rtems only supports PROCESS wide - * contention (i.e. no system wide contention). - */ - - if ( the_attr->contentionscope != PTHREAD_SCOPE_PROCESS ) - return ENOTSUP; - - /* - * Interpret the scheduling parameters. - */ - - if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) ) - return EINVAL; - - core_priority = _POSIX_Priority_To_core( schedparam.sched_priority ); - - /* - * Set the core scheduling policy information. - */ - - budget_callout = NULL; - budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; - - switch ( schedpolicy ) { - case SCHED_OTHER: - budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE; - break; - - case SCHED_FIFO: - budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; - break; - - case SCHED_RR: - budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE; - break; - - case SCHED_SPORADIC: - budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT; - budget_callout = _POSIX_Threads_Sporadic_budget_callout; - - if ( _POSIX_Timespec_to_interval( &schedparam.ss_replenish_period ) < - _POSIX_Timespec_to_interval( &schedparam.ss_initial_budget ) ) - return EINVAL; - - if ( !_POSIX_Priority_Is_valid( schedparam.ss_low_priority ) ) - return EINVAL; - - break; - - default: - return EINVAL; - } - - /* - * Currently all POSIX threads are floating point if the hardware - * supports it. - */ - - is_fp = CPU_HARDWARE_FP; - - /* - * Disable dispatch for protection - */ - - _Thread_Disable_dispatch(); - - /* - * Allocate the thread control block. - * - * NOTE: Global threads are not currently supported. - */ - - the_thread = _POSIX_Threads_Allocate(); - - if ( !the_thread ) { - _Thread_Enable_dispatch(); - return EAGAIN; - } - - /* - * Initialize the core thread for this task. - */ - - status = _Thread_Initialize( - &_POSIX_Threads_Information, - the_thread, - the_attr->stackaddr, - the_attr->stacksize, - is_fp, - core_priority, - TRUE, /* preemptible */ - budget_algorithm, - budget_callout, - 0, /* isr level */ - &default_name /* posix threads don't have a name */ - ); - - if ( !status ) { - _POSIX_Threads_Free( the_thread ); - _Thread_Enable_dispatch(); - return EAGAIN; - } - - /* - * finish initializing the per API structure - */ - - - api = the_thread->API_Extensions[ THREAD_API_POSIX ]; - - api->Attributes = *the_attr; - api->detachstate = the_attr->detachstate; - api->schedpolicy = schedpolicy; - api->schedparam = schedparam; - - /* - * This insures we evaluate the process-wide signals pending when we - * first run. - * - * NOTE: Since the thread starts with all unblocked, this is necessary. - */ - - the_thread->do_post_task_switch_extension = TRUE; - - /* - * POSIX threads are allocated and started in one operation. - */ - - status = _Thread_Start( - the_thread, - THREAD_START_POINTER, - start_routine, - arg, - 0 /* unused */ - ); - - if ( schedpolicy == SCHED_SPORADIC ) { - _Watchdog_Insert_ticks( - &api->Sporadic_timer, - _POSIX_Timespec_to_interval( &api->schedparam.ss_replenish_period ) - ); - } - - /* - * _Thread_Start only fails if the thread was in the incorrect state - */ - - if ( !status ) { - _POSIX_Threads_Free( the_thread ); - _Thread_Enable_dispatch(); - return EINVAL; - } - - /* - * Return the id and indicate we successfully created the thread - */ - - *thread = the_thread->Object.id; - - _Thread_Enable_dispatch(); - - return 0; -} - -/*PAGE - * - * 16.1.3 Wait for Thread Termination, P1003.1c/Draft 10, p. 147 - */ - -int pthread_join( - pthread_t thread, - void **value_ptr -) -{ - register Thread_Control *the_thread; - POSIX_API_Control *api; - Objects_Locations location; - void *return_pointer; - - the_thread = _POSIX_Threads_Get( thread, &location ); - switch ( location ) { - case OBJECTS_ERROR: - case OBJECTS_REMOTE: - return ESRCH; - case OBJECTS_LOCAL: - api = the_thread->API_Extensions[ THREAD_API_POSIX ]; - - if ( api->detachstate == PTHREAD_CREATE_DETACHED ) { - _Thread_Enable_dispatch(); - return EINVAL; - } - - if ( _Thread_Is_executing( the_thread ) ) { - _Thread_Enable_dispatch(); - return EDEADLK; - } - - /* - * Put ourself on the threads join list - */ - - _Thread_Executing->Wait.return_argument = (unsigned32 *) &return_pointer; - - _Thread_queue_Enter_critical_section( &api->Join_List ); - - _Thread_queue_Enqueue( &api->Join_List, WATCHDOG_NO_TIMEOUT ); - - _Thread_Enable_dispatch(); - - if ( value_ptr ) - *value_ptr = return_pointer; - return 0; - } - - return POSIX_BOTTOM_REACHED(); -} - -/*PAGE - * - * 16.1.4 Detaching a Thread, P1003.1c/Draft 10, p. 149 - */ - -int pthread_detach( - pthread_t thread -) -{ - register Thread_Control *the_thread; - POSIX_API_Control *api; - Objects_Locations location; - - the_thread = _POSIX_Threads_Get( thread, &location ); - switch ( location ) { - case OBJECTS_ERROR: - case OBJECTS_REMOTE: - return ESRCH; - case OBJECTS_LOCAL: - - api = the_thread->API_Extensions[ THREAD_API_POSIX ]; - api->detachstate = PTHREAD_CREATE_DETACHED; - _Thread_Enable_dispatch(); - return 0; - } - - return POSIX_BOTTOM_REACHED(); -} - -/*PAGE - * - * 16.1.5.1 Thread Termination, p1003.1c/Draft 10, p. 150 - * - * NOTE: Key destructors are executed in the POSIX api delete extension. - */ - -void pthread_exit( - void *value_ptr -) -{ - Objects_Information *the_information; - - the_information = _Objects_Get_information( _Thread_Executing->Object.id ); - - _Thread_Disable_dispatch(); - - _Thread_Executing->Wait.return_argument = (unsigned32 *)value_ptr; - - _Thread_Close( the_information, _Thread_Executing ); - - _POSIX_Threads_Free( _Thread_Executing ); - - _Thread_Enable_dispatch(); -} - -/*PAGE - * - * 16.1.6 Get Calling Thread's ID, p1003.1c/Draft 10, p. 152 - */ - -pthread_t pthread_self( void ) -{ - return _Thread_Executing->Object.id; -} - -/*PAGE - * - * 16.1.7 Compare Thread IDs, p1003.1c/Draft 10, p. 153 - * - * NOTE: POSIX does not define the behavior when either thread id is invalid. - */ - -int pthread_equal( - pthread_t t1, - pthread_t t2 -) -{ - /* - * If the system is configured for debug, then we will do everything we - * can to insure that both ids are valid. Otherwise, we will do the - * cheapest possible thing to determine if they are equal. - */ - -#ifndef RTEMS_DEBUG - return _Objects_Are_ids_equal( t1, t2 ); -#else - int status; - Objects_Locations location; - - /* - * By default this is not a match. - */ - - status = 0; - - /* - * Validate the first id and return 0 if it is not valid - */ - - (void) _POSIX_Threads_Get( t1, &location ); - switch ( location ) { - case OBJECTS_ERROR: - case OBJECTS_REMOTE: - break; - - case OBJECTS_LOCAL: - - /* - * Validate the second id and return 0 if it is not valid - */ - - (void) _POSIX_Threads_Get( t2, &location ); - switch ( location ) { - case OBJECTS_ERROR: - case OBJECTS_REMOTE: - break; - case OBJECTS_LOCAL: - status = _Objects_Are_ids_equal( t1, t2 ); - break; - } - _Thread_Unnest_dispatch(); - break; - } - - _Thread_Enable_dispatch(); - return status; -#endif -} - -/*PAGE - * - * 16.1.8 Dynamic Package Initialization, P1003.1c/Draft 10, p. 154 - */ - -int pthread_once( - pthread_once_t *once_control, - void (*init_routine)(void) -) -{ - if ( !once_control || !init_routine ) - return EINVAL; - - _Thread_Disable_dispatch(); - - if ( !once_control->init_executed ) { - once_control->is_initialized = TRUE; - once_control->init_executed = TRUE; - (*init_routine)(); - } - - _Thread_Enable_dispatch(); - return 0; -} - -/*PAGE - * - * 20.1.6 Accessing a Thread CPU-time Clock, P1003.4b/Draft 8, p. 58 - */ - -int pthread_getcpuclockid( - pthread_t pid, - clockid_t *clock_id -) -{ - return POSIX_NOT_IMPLEMENTED(); -} - -/*PAGE - * - * 20.1.7 CPU-time Clock Thread Creation Attribute, P1003.4b/Draft 8, p. 59 - */ - -int pthread_attr_setcputime( - pthread_attr_t *attr, - int clock_allowed -) -{ - if ( !attr || !attr->is_initialized ) - return EINVAL; - - switch ( clock_allowed ) { - case CLOCK_ENABLED: - case CLOCK_DISABLED: - attr->cputime_clock_allowed = clock_allowed; - return 0; - - default: - return EINVAL; - } -} - -/*PAGE - * - * 20.1.7 CPU-time Clock Thread Creation Attribute, P1003.4b/Draft 8, p. 59 - */ - -int pthread_attr_getcputime( - pthread_attr_t *attr, - int *clock_allowed -) -{ - if ( !attr || !attr->is_initialized || !clock_allowed ) - return EINVAL; - - *clock_allowed = attr->cputime_clock_allowed; - return 0; -} diff --git a/cpukit/posix/src/pthreadatfork.c b/cpukit/posix/src/pthreadatfork.c index f70f8d7dc1..07364b2195 100644 --- a/cpukit/posix/src/pthreadatfork.c +++ b/cpukit/posix/src/pthreadatfork.c @@ -1,6 +1,15 @@ /* * pthread_atfork() - POSIX 1003.1b 3.1.3 * + * 3.1.3 Register Fork Handlers, P1003.1c/Draft 10, P1003.1c/Draft 10, p. 27 + * + * RTEMS does not support processes, so we fall under this and do not + * provide this routine: + * + * "Either the implementation shall support the pthread_atfork() function + * as described above or the pthread_atfork() funciton shall not be + * provided." + * * $Id$ */ diff --git a/cpukit/posix/src/pthreadattrdestroy.c b/cpukit/posix/src/pthreadattrdestroy.c new file mode 100644 index 0000000000..c518236ad3 --- /dev/null +++ b/cpukit/posix/src/pthreadattrdestroy.c @@ -0,0 +1,30 @@ +/* + * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140 + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + + +#include +#include + +#include + +int pthread_attr_destroy( + pthread_attr_t *attr +) +{ + if ( !attr || !attr->is_initialized ) + return EINVAL; + + attr->is_initialized = FALSE; + return 0; +} diff --git a/cpukit/posix/src/pthreadattrgetdetachstate.c b/cpukit/posix/src/pthreadattrgetdetachstate.c new file mode 100644 index 0000000000..eefcfba362 --- /dev/null +++ b/cpukit/posix/src/pthreadattrgetdetachstate.c @@ -0,0 +1,30 @@ +/* + * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140 + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + + +#include +#include + +int pthread_attr_getdetachstate( + const pthread_attr_t *attr, + int *detachstate +) +{ + if ( !attr || !attr->is_initialized || !detachstate ) + return EINVAL; + + *detachstate = attr->detachstate; + return 0; +} + diff --git a/cpukit/posix/src/pthreadattrgetinheritsched.c b/cpukit/posix/src/pthreadattrgetinheritsched.c new file mode 100644 index 0000000000..7cdd8b4d53 --- /dev/null +++ b/cpukit/posix/src/pthreadattrgetinheritsched.c @@ -0,0 +1,30 @@ +/* + * 13.5.1 Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120 + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + + +#include +#include + +int pthread_attr_getinheritsched( + const pthread_attr_t *attr, + int *inheritsched +) +{ + if ( !attr || !attr->is_initialized || !inheritsched ) + return EINVAL; + + *inheritsched = attr->inheritsched; + return 0; +} + diff --git a/cpukit/posix/src/pthreadattrgetschedparam.c b/cpukit/posix/src/pthreadattrgetschedparam.c new file mode 100644 index 0000000000..d139a76f0c --- /dev/null +++ b/cpukit/posix/src/pthreadattrgetschedparam.c @@ -0,0 +1,29 @@ +/* + * 13.5.1 Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120 + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + + +#include +#include + +int pthread_attr_getschedparam( + const pthread_attr_t *attr, + struct sched_param *param +) +{ + if ( !attr || !attr->is_initialized || !param ) + return EINVAL; + + *param = attr->schedparam; + return 0; +} diff --git a/cpukit/posix/src/pthreadattrgetschedpolicy.c b/cpukit/posix/src/pthreadattrgetschedpolicy.c new file mode 100644 index 0000000000..0c22244b70 --- /dev/null +++ b/cpukit/posix/src/pthreadattrgetschedpolicy.c @@ -0,0 +1,30 @@ +/* + * 13.5.1 Thread Creation Scheduling Parameters, P1003.1c/Draft 10, p. 120 + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + + +#include +#include + +int pthread_attr_getschedpolicy( + const pthread_attr_t *attr, + int *policy +) +{ + if ( !attr || !attr->is_initialized || !policy ) + return EINVAL; + + *policy = attr->schedpolicy; + return 0; +} + diff --git a/cpukit/posix/src/pthreadattrgetscope.c b/cpukit/posix/src/pthreadattrgetscope.c new file mode 100644 index 0000000000..2c31fef2fb --- /dev/null +++ b/cpukit/posix/src/pthreadattrgetscope.c @@ -0,0 +1,29 @@ +/* + * 13.5.1 Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120 + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + + +#include +#include + +int pthread_attr_getscope( + const pthread_attr_t *attr, + int *contentionscope +) +{ + if ( !attr || !attr->is_initialized || !contentionscope ) + return EINVAL; + + *contentionscope = attr->contentionscope; + return 0; +} diff --git a/cpukit/posix/src/pthreadattrgetstackaddr.c b/cpukit/posix/src/pthreadattrgetstackaddr.c new file mode 100644 index 0000000000..18e662fb1e --- /dev/null +++ b/cpukit/posix/src/pthreadattrgetstackaddr.c @@ -0,0 +1,29 @@ +/* + * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140 + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + + +#include +#include + +int pthread_attr_getstackaddr( + const pthread_attr_t *attr, + void **stackaddr +) +{ + if ( !attr || !attr->is_initialized || !stackaddr ) + return EINVAL; + + *stackaddr = attr->stackaddr; + return 0; +} diff --git a/cpukit/posix/src/pthreadattrgetstacksize.c b/cpukit/posix/src/pthreadattrgetstacksize.c new file mode 100644 index 0000000000..589e87ed3c --- /dev/null +++ b/cpukit/posix/src/pthreadattrgetstacksize.c @@ -0,0 +1,29 @@ +/* + * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140 + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + + +#include +#include + +int pthread_attr_getstacksize( + const pthread_attr_t *attr, + size_t *stacksize +) +{ + if ( !attr || !attr->is_initialized || !stacksize ) + return EINVAL; + + *stacksize = attr->stacksize; + return 0; +} diff --git a/cpukit/posix/src/pthreadattrinit.c b/cpukit/posix/src/pthreadattrinit.c new file mode 100644 index 0000000000..7a9db5e042 --- /dev/null +++ b/cpukit/posix/src/pthreadattrinit.c @@ -0,0 +1,31 @@ +/* + * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140 + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + + +#include +#include + +#include +#include + +int pthread_attr_init( + pthread_attr_t *attr +) +{ + if ( !attr ) + return EINVAL; + + *attr = _POSIX_Threads_Default_attributes; + return 0; +} diff --git a/cpukit/posix/src/pthreadattrsetdetachstate.c b/cpukit/posix/src/pthreadattrsetdetachstate.c new file mode 100644 index 0000000000..f0af517ae6 --- /dev/null +++ b/cpukit/posix/src/pthreadattrsetdetachstate.c @@ -0,0 +1,36 @@ +/* + * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140 + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + + +#include +#include + +int pthread_attr_setdetachstate( + pthread_attr_t *attr, + int detachstate +) +{ + if ( !attr || !attr->is_initialized ) + return EINVAL; + + switch ( detachstate ) { + case PTHREAD_CREATE_DETACHED: + case PTHREAD_CREATE_JOINABLE: + attr->detachstate = detachstate; + return 0; + + default: + return EINVAL; + } +} diff --git a/cpukit/posix/src/pthreadattrsetinheritsched.c b/cpukit/posix/src/pthreadattrsetinheritsched.c new file mode 100644 index 0000000000..fb6148ee24 --- /dev/null +++ b/cpukit/posix/src/pthreadattrsetinheritsched.c @@ -0,0 +1,39 @@ +/* + * 13.5.1 Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120 + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + + +#include +#include + +#include +#include + +int pthread_attr_setinheritsched( + pthread_attr_t *attr, + int inheritsched +) +{ + if ( !attr || !attr->is_initialized ) + return EINVAL; + + switch ( inheritsched ) { + case PTHREAD_INHERIT_SCHED: + case PTHREAD_EXPLICIT_SCHED: + attr->inheritsched = inheritsched; + return 0; + + default: + return ENOTSUP; + } +} diff --git a/cpukit/posix/src/pthreadattrsetschedparam.c b/cpukit/posix/src/pthreadattrsetschedparam.c new file mode 100644 index 0000000000..7fbb45a057 --- /dev/null +++ b/cpukit/posix/src/pthreadattrsetschedparam.c @@ -0,0 +1,29 @@ +/* + * 13.5.1 Thread Creation Scheduling Parameters, P1003.1c/Draft 10, p. 120 + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + + +#include +#include + +int pthread_attr_setschedparam( + pthread_attr_t *attr, + const struct sched_param *param +) +{ + if ( !attr || !attr->is_initialized || !param ) + return EINVAL; + + attr->schedparam = *param; + return 0; +} diff --git a/cpukit/posix/src/pthreadattrsetschedpolicy.c b/cpukit/posix/src/pthreadattrsetschedpolicy.c new file mode 100644 index 0000000000..0a60709139 --- /dev/null +++ b/cpukit/posix/src/pthreadattrsetschedpolicy.c @@ -0,0 +1,41 @@ +/* + * 13.5.1 Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120 + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + + +#include +#include + +#include +#include + +int pthread_attr_setschedpolicy( + pthread_attr_t *attr, + int policy +) +{ + if ( !attr || !attr->is_initialized ) + return EINVAL; + + switch ( policy ) { + case SCHED_OTHER: + case SCHED_FIFO: + case SCHED_RR: + case SCHED_SPORADIC: + attr->schedpolicy = policy; + return 0; + + default: + return ENOTSUP; + } +} diff --git a/cpukit/posix/src/pthreadattrsetscope.c b/cpukit/posix/src/pthreadattrsetscope.c new file mode 100644 index 0000000000..205de52565 --- /dev/null +++ b/cpukit/posix/src/pthreadattrsetscope.c @@ -0,0 +1,41 @@ +/* + * 13.5.1 Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120 + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + + +#include +#include + +#include +#include + +int pthread_attr_setscope( + pthread_attr_t *attr, + int contentionscope +) +{ + if ( !attr || !attr->is_initialized ) + return EINVAL; + + switch ( contentionscope ) { + case PTHREAD_SCOPE_PROCESS: + attr->contentionscope = contentionscope; + return 0; + + case PTHREAD_SCOPE_SYSTEM: + return ENOTSUP; + + default: + return EINVAL; + } +} diff --git a/cpukit/posix/src/pthreadattrsetstackaddr.c b/cpukit/posix/src/pthreadattrsetstackaddr.c new file mode 100644 index 0000000000..15547d4e27 --- /dev/null +++ b/cpukit/posix/src/pthreadattrsetstackaddr.c @@ -0,0 +1,29 @@ +/* + * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140 + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + + +#include +#include + +int pthread_attr_setstackaddr( + pthread_attr_t *attr, + void *stackaddr +) +{ + if ( !attr || !attr->is_initialized ) + return EINVAL; + + attr->stackaddr = stackaddr; + return 0; +} diff --git a/cpukit/posix/src/pthreadattrsetstacksize.c b/cpukit/posix/src/pthreadattrsetstacksize.c new file mode 100644 index 0000000000..ccaf03fd47 --- /dev/null +++ b/cpukit/posix/src/pthreadattrsetstacksize.c @@ -0,0 +1,34 @@ +/* + * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140 + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include + +#include +#include + +int pthread_attr_setstacksize( + pthread_attr_t *attr, + size_t stacksize +) +{ + if ( !attr || !attr->is_initialized ) + return EINVAL; + + if (stacksize < PTHREAD_MINIMUM_STACK_SIZE) + attr->stacksize = PTHREAD_MINIMUM_STACK_SIZE; + else + attr->stacksize = stacksize; + return 0; +} diff --git a/cpukit/posix/src/pthreadcreate.c b/cpukit/posix/src/pthreadcreate.c new file mode 100644 index 0000000000..acbcbfc6cc --- /dev/null +++ b/cpukit/posix/src/pthreadcreate.c @@ -0,0 +1,250 @@ +/* + * 16.1.2 Thread Creation, P1003.1c/Draft 10, p. 144 + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include + +#include +#include +#include +#include +#include + +int pthread_create( + pthread_t *thread, + const pthread_attr_t *attr, + void *(*start_routine)( void * ), + void *arg +) +{ + const pthread_attr_t *the_attr; + Priority_Control core_priority; + Thread_CPU_budget_algorithms budget_algorithm; + Thread_CPU_budget_algorithm_callout budget_callout; + boolean is_fp; + boolean status; + Thread_Control *the_thread; + char *default_name = "psx"; + POSIX_API_Control *api; + int schedpolicy = SCHED_RR; + struct sched_param schedparam; + + the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes; + + if ( !the_attr->is_initialized ) + return EINVAL; + + /* + * Core Thread Initialize insures we get the minimum amount of + * stack space if it is allowed to allocate it itself. + */ + + if ( the_attr->stackaddr && !_Stack_Is_enough( the_attr->stacksize ) ) + return EINVAL; + +#if 0 + int cputime_clock_allowed; /* see time.h */ + POSIX_NOT_IMPLEMENTED(); +#endif + + /* + * P1003.1c/Draft 10, p. 121. + * + * If inheritsched is set to PTHREAD_INHERIT_SCHED, then this thread + * inherits scheduling attributes from the creating thread. If it is + * PTHREAD_EXPLICIT_SCHED, then scheduling parameters come from the + * attributes structure. + */ + + switch ( the_attr->inheritsched ) { + case PTHREAD_INHERIT_SCHED: + api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; + schedpolicy = api->schedpolicy; + schedparam = api->schedparam; + break; + + case PTHREAD_EXPLICIT_SCHED: + schedpolicy = the_attr->schedpolicy; + schedparam = the_attr->schedparam; + break; + + default: + return EINVAL; + } + + /* + * Check the contentionscope since rtems only supports PROCESS wide + * contention (i.e. no system wide contention). + */ + + if ( the_attr->contentionscope != PTHREAD_SCOPE_PROCESS ) + return ENOTSUP; + + /* + * Interpret the scheduling parameters. + */ + + if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) ) + return EINVAL; + + core_priority = _POSIX_Priority_To_core( schedparam.sched_priority ); + + /* + * Set the core scheduling policy information. + */ + + budget_callout = NULL; + budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; + + switch ( schedpolicy ) { + case SCHED_OTHER: + budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE; + break; + + case SCHED_FIFO: + budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; + break; + + case SCHED_RR: + budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE; + break; + + case SCHED_SPORADIC: + budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT; + budget_callout = _POSIX_Threads_Sporadic_budget_callout; + + if ( _POSIX_Timespec_to_interval( &schedparam.ss_replenish_period ) < + _POSIX_Timespec_to_interval( &schedparam.ss_initial_budget ) ) + return EINVAL; + + if ( !_POSIX_Priority_Is_valid( schedparam.ss_low_priority ) ) + return EINVAL; + + break; + + default: + return EINVAL; + } + + /* + * Currently all POSIX threads are floating point if the hardware + * supports it. + */ + + is_fp = CPU_HARDWARE_FP; + + /* + * Disable dispatch for protection + */ + + _Thread_Disable_dispatch(); + + /* + * Allocate the thread control block. + * + * NOTE: Global threads are not currently supported. + */ + + the_thread = _POSIX_Threads_Allocate(); + + if ( !the_thread ) { + _Thread_Enable_dispatch(); + return EAGAIN; + } + + /* + * Initialize the core thread for this task. + */ + + status = _Thread_Initialize( + &_POSIX_Threads_Information, + the_thread, + the_attr->stackaddr, + the_attr->stacksize, + is_fp, + core_priority, + TRUE, /* preemptible */ + budget_algorithm, + budget_callout, + 0, /* isr level */ + &default_name /* posix threads don't have a name */ + ); + + if ( !status ) { + _POSIX_Threads_Free( the_thread ); + _Thread_Enable_dispatch(); + return EAGAIN; + } + + /* + * finish initializing the per API structure + */ + + + api = the_thread->API_Extensions[ THREAD_API_POSIX ]; + + api->Attributes = *the_attr; + api->detachstate = the_attr->detachstate; + api->schedpolicy = schedpolicy; + api->schedparam = schedparam; + + /* + * This insures we evaluate the process-wide signals pending when we + * first run. + * + * NOTE: Since the thread starts with all unblocked, this is necessary. + */ + + the_thread->do_post_task_switch_extension = TRUE; + + /* + * POSIX threads are allocated and started in one operation. + */ + + status = _Thread_Start( + the_thread, + THREAD_START_POINTER, + start_routine, + arg, + 0 /* unused */ + ); + + if ( schedpolicy == SCHED_SPORADIC ) { + _Watchdog_Insert_ticks( + &api->Sporadic_timer, + _POSIX_Timespec_to_interval( &api->schedparam.ss_replenish_period ) + ); + } + + /* + * _Thread_Start only fails if the thread was in the incorrect state + */ + + if ( !status ) { + _POSIX_Threads_Free( the_thread ); + _Thread_Enable_dispatch(); + return EINVAL; + } + + /* + * Return the id and indicate we successfully created the thread + */ + + *thread = the_thread->Object.id; + + _Thread_Enable_dispatch(); + + return 0; +} + diff --git a/cpukit/posix/src/pthreaddetach.c b/cpukit/posix/src/pthreaddetach.c new file mode 100644 index 0000000000..6beb88ef23 --- /dev/null +++ b/cpukit/posix/src/pthreaddetach.c @@ -0,0 +1,46 @@ +/* + * 16.1.4 Detaching a Thread, P1003.1c/Draft 10, p. 149 + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + + +#include +#include + +#include +#include +#include + +int pthread_detach( + pthread_t thread +) +{ + register Thread_Control *the_thread; + POSIX_API_Control *api; + Objects_Locations location; + + the_thread = _POSIX_Threads_Get( thread, &location ); + switch ( location ) { + case OBJECTS_ERROR: + case OBJECTS_REMOTE: + return ESRCH; + case OBJECTS_LOCAL: + + api = the_thread->API_Extensions[ THREAD_API_POSIX ]; + api->detachstate = PTHREAD_CREATE_DETACHED; + _Thread_Enable_dispatch(); + return 0; + } + + return POSIX_BOTTOM_REACHED(); +} + diff --git a/cpukit/posix/src/pthreadequal.c b/cpukit/posix/src/pthreadequal.c new file mode 100644 index 0000000000..083eda0c9f --- /dev/null +++ b/cpukit/posix/src/pthreadequal.c @@ -0,0 +1,79 @@ +/* + * 16.1.7 Compare Thread IDs, p1003.1c/Draft 10, p. 153 + * + * NOTE: POSIX does not define the behavior when either thread id is invalid. + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include + +#include +#include + +int pthread_equal( + pthread_t t1, + pthread_t t2 +) +{ + /* + * If the system is configured for debug, then we will do everything we + * can to insure that both ids are valid. Otherwise, we will do the + * cheapest possible thing to determine if they are equal. + */ + +#ifndef RTEMS_DEBUG + return _Objects_Are_ids_equal( t1, t2 ); +#else + int status; + Objects_Locations location; + + /* + * By default this is not a match. + */ + + status = 0; + + /* + * Validate the first id and return 0 if it is not valid + */ + + (void) _POSIX_Threads_Get( t1, &location ); + switch ( location ) { + case OBJECTS_ERROR: + case OBJECTS_REMOTE: + break; + + case OBJECTS_LOCAL: + + /* + * Validate the second id and return 0 if it is not valid + */ + + (void) _POSIX_Threads_Get( t2, &location ); + switch ( location ) { + case OBJECTS_ERROR: + case OBJECTS_REMOTE: + break; + case OBJECTS_LOCAL: + status = _Objects_Are_ids_equal( t1, t2 ); + break; + } + _Thread_Unnest_dispatch(); + break; + } + + _Thread_Enable_dispatch(); + return status; +#endif +} + diff --git a/cpukit/posix/src/pthreadexit.c b/cpukit/posix/src/pthreadexit.c new file mode 100644 index 0000000000..35c3c99b33 --- /dev/null +++ b/cpukit/posix/src/pthreadexit.c @@ -0,0 +1,43 @@ +/* + * 16.1.5.1 Thread Termination, p1003.1c/Draft 10, p. 150 + * + * NOTE: Key destructors are executed in the POSIX api delete extension. + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + + +#include +#include + +#include +#include +#include + +void pthread_exit( + void *value_ptr +) +{ + Objects_Information *the_information; + + the_information = _Objects_Get_information( _Thread_Executing->Object.id ); + + _Thread_Disable_dispatch(); + + _Thread_Executing->Wait.return_argument = (unsigned32 *)value_ptr; + + _Thread_Close( the_information, _Thread_Executing ); + + _POSIX_Threads_Free( _Thread_Executing ); + + _Thread_Enable_dispatch(); +} + diff --git a/cpukit/posix/src/pthreadgetcpuclockid.c b/cpukit/posix/src/pthreadgetcpuclockid.c new file mode 100644 index 0000000000..05cf938559 --- /dev/null +++ b/cpukit/posix/src/pthreadgetcpuclockid.c @@ -0,0 +1,25 @@ +/* + * 20.1.6 Accessing a Thread CPU-time Clock, P1003.4b/Draft 8, p. 58 + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include + +int pthread_getcpuclockid( + pthread_t pid, + clockid_t *clock_id +) +{ + return POSIX_NOT_IMPLEMENTED(); +} + diff --git a/cpukit/posix/src/pthreadgetcputime.c b/cpukit/posix/src/pthreadgetcputime.c new file mode 100644 index 0000000000..00abac790e --- /dev/null +++ b/cpukit/posix/src/pthreadgetcputime.c @@ -0,0 +1,29 @@ +/* + * 20.1.7 CPU-time Clock Thread Creation Attribute, P1003.4b/Draft 8, p. 59 + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include + +int pthread_attr_getcputime( + pthread_attr_t *attr, + int *clock_allowed +) +{ + if ( !attr || !attr->is_initialized || !clock_allowed ) + return EINVAL; + + *clock_allowed = attr->cputime_clock_allowed; + return 0; +} + diff --git a/cpukit/posix/src/pthreadgetschedparam.c b/cpukit/posix/src/pthreadgetschedparam.c new file mode 100644 index 0000000000..00a6f65641 --- /dev/null +++ b/cpukit/posix/src/pthreadgetschedparam.c @@ -0,0 +1,53 @@ +/* + * 13.5.2 Dynamic Thread Scheduling Parameters Access, + * P1003.1c/Draft 10, p. 124 + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + + +#include +#include + +#include +#include + +int pthread_getschedparam( + pthread_t thread, + int *policy, + struct sched_param *param +) +{ + Objects_Locations location; + POSIX_API_Control *api; + register Thread_Control *the_thread; + + if ( !policy || !param ) + return EINVAL; + + the_thread = _POSIX_Threads_Get( thread, &location ); + switch ( location ) { + case OBJECTS_ERROR: + case OBJECTS_REMOTE: + return ESRCH; + case OBJECTS_LOCAL: + api = the_thread->API_Extensions[ THREAD_API_POSIX ]; + *policy = api->schedpolicy; + *param = api->schedparam; + param->sched_priority = + _POSIX_Priority_From_core( the_thread->current_priority ); + _Thread_Enable_dispatch(); + return 0; + } + + return POSIX_BOTTOM_REACHED(); + +} diff --git a/cpukit/posix/src/pthreadjoin.c b/cpukit/posix/src/pthreadjoin.c new file mode 100644 index 0000000000..004e591eb5 --- /dev/null +++ b/cpukit/posix/src/pthreadjoin.c @@ -0,0 +1,70 @@ +/* + * 16.1.3 Wait for Thread Termination, P1003.1c/Draft 10, p. 147 + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + + +#include +#include + +#include +#include +#include + +int pthread_join( + pthread_t thread, + void **value_ptr +) +{ + register Thread_Control *the_thread; + POSIX_API_Control *api; + Objects_Locations location; + void *return_pointer; + + the_thread = _POSIX_Threads_Get( thread, &location ); + switch ( location ) { + case OBJECTS_ERROR: + case OBJECTS_REMOTE: + return ESRCH; + case OBJECTS_LOCAL: + api = the_thread->API_Extensions[ THREAD_API_POSIX ]; + + if ( api->detachstate == PTHREAD_CREATE_DETACHED ) { + _Thread_Enable_dispatch(); + return EINVAL; + } + + if ( _Thread_Is_executing( the_thread ) ) { + _Thread_Enable_dispatch(); + return EDEADLK; + } + + /* + * Put ourself on the threads join list + */ + + _Thread_Executing->Wait.return_argument = (unsigned32 *) &return_pointer; + + _Thread_queue_Enter_critical_section( &api->Join_List ); + + _Thread_queue_Enqueue( &api->Join_List, WATCHDOG_NO_TIMEOUT ); + + _Thread_Enable_dispatch(); + + if ( value_ptr ) + *value_ptr = return_pointer; + return 0; + } + + return POSIX_BOTTOM_REACHED(); +} + diff --git a/cpukit/posix/src/pthreadonce.c b/cpukit/posix/src/pthreadonce.c new file mode 100644 index 0000000000..886b6ea866 --- /dev/null +++ b/cpukit/posix/src/pthreadonce.c @@ -0,0 +1,40 @@ +/* + * 16.1.8 Dynamic Package Initialization, P1003.1c/Draft 10, p. 154 + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include + +#include +#include + +int pthread_once( + pthread_once_t *once_control, + void (*init_routine)(void) +) +{ + if ( !once_control || !init_routine ) + return EINVAL; + + _Thread_Disable_dispatch(); + + if ( !once_control->init_executed ) { + once_control->is_initialized = TRUE; + once_control->init_executed = TRUE; + (*init_routine)(); + } + + _Thread_Enable_dispatch(); + return 0; +} + diff --git a/cpukit/posix/src/pthreadself.c b/cpukit/posix/src/pthreadself.c new file mode 100644 index 0000000000..986dd39175 --- /dev/null +++ b/cpukit/posix/src/pthreadself.c @@ -0,0 +1,25 @@ +/* + * 16.1.6 Get Calling Thread's ID, p1003.1c/Draft 10, p. 152 + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + + +#include +#include + +#include +#include + +pthread_t pthread_self( void ) +{ + return _Thread_Executing->Object.id; +} diff --git a/cpukit/posix/src/pthreadsetcputime.c b/cpukit/posix/src/pthreadsetcputime.c new file mode 100644 index 0000000000..3482a2593e --- /dev/null +++ b/cpukit/posix/src/pthreadsetcputime.c @@ -0,0 +1,36 @@ +/* + * 20.1.7 CPU-time Clock Thread Creation Attribute, P1003.4b/Draft 8, p. 59 + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include + +int pthread_attr_setcputime( + pthread_attr_t *attr, + int clock_allowed +) +{ + if ( !attr || !attr->is_initialized ) + return EINVAL; + + switch ( clock_allowed ) { + case CLOCK_ENABLED: + case CLOCK_DISABLED: + attr->cputime_clock_allowed = clock_allowed; + return 0; + + default: + return EINVAL; + } +} + diff --git a/cpukit/posix/src/pthreadsetschedparam.c b/cpukit/posix/src/pthreadsetschedparam.c new file mode 100644 index 0000000000..50d3bbcea3 --- /dev/null +++ b/cpukit/posix/src/pthreadsetschedparam.c @@ -0,0 +1,126 @@ +/* + * 13.5.2 Dynamic Thread Scheduling Parameters Access, + * P1003.1c/Draft 10, p. 124 + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + + +#include +#include + +#include +#include +#include +#include + +int pthread_setschedparam( + pthread_t thread, + int policy, + struct sched_param *param +) +{ + register Thread_Control *the_thread; + POSIX_API_Control *api; + Thread_CPU_budget_algorithms budget_algorithm; + Thread_CPU_budget_algorithm_callout budget_callout; + Objects_Locations location; + + /* + * Check all the parameters + */ + + if ( !param ) + return EINVAL; + + if ( !_POSIX_Priority_Is_valid( param->sched_priority ) ) + return EINVAL; + + budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; + budget_callout = NULL; + + switch ( policy ) { + case SCHED_OTHER: + budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE; + break; + + case SCHED_FIFO: + budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; + break; + + case SCHED_RR: + budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE; + break; + + case SCHED_SPORADIC: + budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT; + budget_callout = _POSIX_Threads_Sporadic_budget_callout; + + if ( _POSIX_Timespec_to_interval( ¶m->ss_replenish_period ) < + _POSIX_Timespec_to_interval( ¶m->ss_initial_budget ) ) + return EINVAL; + + if ( !_POSIX_Priority_Is_valid( param->ss_low_priority ) ) + return EINVAL; + + break; + + default: + return EINVAL; + } + + /* + * Actually change the scheduling policy and parameters + */ + + the_thread = _POSIX_Threads_Get( thread, &location ); + switch ( location ) { + case OBJECTS_ERROR: + case OBJECTS_REMOTE: + return ESRCH; + case OBJECTS_LOCAL: + api = the_thread->API_Extensions[ THREAD_API_POSIX ]; + + if ( api->schedpolicy == SCHED_SPORADIC ) + (void) _Watchdog_Remove( &api->Sporadic_timer ); + + api->schedpolicy = policy; + api->schedparam = *param; + the_thread->budget_algorithm = budget_algorithm; + the_thread->budget_callout = budget_callout; + + switch ( api->schedpolicy ) { + case SCHED_OTHER: + case SCHED_FIFO: + case SCHED_RR: + the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice; + + the_thread->real_priority = + _POSIX_Priority_To_core( api->schedparam.sched_priority ); + + _Thread_Change_priority( + the_thread, + the_thread->real_priority, + TRUE + ); + break; + + case SCHED_SPORADIC: + api->ss_high_priority = api->schedparam.sched_priority; + _POSIX_Threads_Sporadic_budget_TSR( 0, the_thread ); + break; + } + + _Thread_Enable_dispatch(); + return 0; + } + return POSIX_BOTTOM_REACHED(); +} -- cgit v1.2.3