Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:36

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /*
0004  *  COPYRIGHT (c) 1989-2009.
0005  *  On-Line Applications Research Corporation (OAR).
0006  *
0007  * Redistribution and use in source and binary forms, with or without
0008  * modification, are permitted provided that the following conditions
0009  * are met:
0010  * 1. Redistributions of source code must retain the above copyright
0011  *    notice, this list of conditions and the following disclaimer.
0012  * 2. Redistributions in binary form must reproduce the above copyright
0013  *    notice, this list of conditions and the following disclaimer in the
0014  *    documentation and/or other materials provided with the distribution.
0015  *
0016  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0017  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0018  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0019  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0020  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0021  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0022  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0023  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0024  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0025  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0026  * POSSIBILITY OF SUCH DAMAGE.
0027  */
0028 
0029 #ifdef HAVE_CONFIG_H
0030 #include "config.h"
0031 #endif
0032 
0033 #include <pthread.h>
0034 #include <sched.h>
0035 
0036 #define CONFIGURE_INIT
0037 #include "system.h"
0038 #include <errno.h>
0039 #include "tmacros.h"
0040 #include "pritime.h"
0041 
0042 const char rtems_test_name[] = "PSX 7";
0043 
0044 void print_schedparam(
0045   char               *prefix,
0046   struct sched_param *schedparam
0047 );
0048 
0049 void print_schedparam(
0050   char               *prefix,
0051   struct sched_param *schedparam
0052 )
0053 {
0054   printf( "%ssched priority      = %d\n", prefix, schedparam->sched_priority );
0055 #if defined(_POSIX_SPORADIC_SERVER)
0056   printf( "%ssched_ss_low_priority     = %d\n",
0057      prefix, schedparam->sched_ss_low_priority );
0058   printf( "%ssched_ss_replenish_period = (%" PRIdtime_t ", %ld)\n", prefix,
0059      schedparam->sched_ss_repl_period.tv_sec,
0060      schedparam->sched_ss_repl_period.tv_nsec );
0061   printf( "%ssched_sched_ss_initial_budget = (%" PRIdtime_t ", %ld)\n", prefix,
0062      schedparam->sched_ss_init_budget.tv_sec,
0063      schedparam->sched_ss_init_budget.tv_nsec );
0064 #else
0065   printf( "%s_POSIX_SPORADIC_SERVER is not defined\n", prefix );
0066 #endif
0067 }
0068 
0069 void *POSIX_Init(
0070   void *argument
0071 )
0072 {
0073   int                 status;
0074   int                 scope;
0075   int                 inheritsched;
0076   int                 schedpolicy;
0077   size_t              stacksize;
0078   size_t              guardsize;
0079   void               *stackaddr;
0080   int                 detachstate;
0081   struct sched_param  schedparam;
0082   pthread_attr_t      attr;
0083   pthread_attr_t      destroyed_attr;
0084 
0085   TEST_BEGIN();
0086 
0087   /* set the time of day, and print our buffer in multiple ways */
0088 
0089   set_time( TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 );
0090 
0091   /* get id of this thread */
0092 
0093   Init_id = pthread_self();
0094   printf( "Init's ID is 0x%08" PRIxpthread_t "\n", Init_id );
0095 
0096   /* exercise init and destroy */
0097 
0098   puts( "Init - pthread_attr_init - EINVAL (NULL attr)" );
0099   status = pthread_attr_init( NULL );
0100   fatal_directive_check_status_only( status, EINVAL, "null attribute" );
0101 
0102   puts( "Init - pthread_attr_init - SUCCESSFUL" );
0103   status = pthread_attr_init( &attr );
0104   posix_service_failed( status, "pthread_attr_init" );
0105 
0106   puts( "Init - initialize and destroy an attribute - SUCCESSFUL" );
0107   status = pthread_attr_init( &destroyed_attr );
0108   posix_service_failed( status, "pthread_attr_init");
0109 
0110   status = pthread_attr_destroy( &destroyed_attr );
0111   posix_service_failed( status, "pthread_attr_destroy");
0112 
0113   puts( "Init - pthread_attr_destroy - EINVAL (NULL attr)" );
0114   status = pthread_attr_destroy( NULL );
0115   fatal_directive_check_status_only( status, EINVAL, "NULL attribute" );
0116 
0117   puts( "Init - pthread_attr_destroy - EINVAL (not initialized)" );
0118   status = pthread_attr_destroy( &destroyed_attr );
0119   fatal_directive_check_status_only( status, EINVAL, "not initialized" );
0120 
0121   /* check some errors in pthread_create */
0122 
0123   puts( "Init - pthread_create - EINVAL (attr not initialized)" );
0124   status = pthread_create( &Task_id, &destroyed_attr, Task_1, NULL );
0125   fatal_directive_check_status_only( status, EINVAL, "attribute not initialized" );
0126 
0127   /* junk stack address */
0128   status = pthread_attr_setstackaddr( &attr, (void *)&schedparam );
0129   posix_service_failed( status, "setstackaddr");
0130 
0131   /* must go around pthread_attr_setstacksize to set a bad stack size */
0132   attr.stacksize = 0;
0133 
0134   puts( "Init - pthread_create - EINVAL (stacksize too small)" );
0135   status = pthread_create( &Task_id, &attr, Task_1, NULL );
0136   fatal_directive_check_status_only( status, EINVAL, "stacksize too small" );
0137 
0138   /* reset all the fields */
0139   status = pthread_attr_init( &attr );
0140   posix_service_failed( status, "pthread_attr_init");
0141 
0142   attr.stacksize = rtems_configuration_get_work_space_size() * 10;
0143   puts( "Init - pthread_create - EAGAIN (stacksize too large)" );
0144   status = pthread_create( &Task_id, &attr, Task_1, NULL );
0145   fatal_directive_check_status_only( status, EAGAIN, "stacksize too large" );
0146 
0147   status = pthread_attr_init( &attr );
0148   posix_service_failed( status, "pthread_attr_init");
0149 
0150   /* must go around pthread_attr_set routines to set a bad value */
0151   attr.inheritsched = -1;
0152 
0153   puts( "Init - pthread_create - EINVAL (invalid inherit scheduler)" );
0154   status = pthread_create( &Task_id, &attr, Task_1, NULL );
0155   fatal_directive_check_status_only( status, EINVAL, "invalid inherit scheduler" );
0156 
0157   /* check out the error case for system scope not supported */
0158 
0159   status = pthread_attr_init( &attr );
0160   posix_service_failed( status, " pthread_attr_init");
0161 
0162   /* must go around pthread_attr_set routines to set a bad value */
0163   attr.contentionscope = PTHREAD_SCOPE_SYSTEM;
0164 
0165   puts( "Init - pthread_create - ENOTSUP (unsupported system contention scope)" );
0166   status = pthread_create( &Task_id, &attr, Task_1, NULL );
0167   fatal_directive_check_status_only( status, ENOTSUP,
0168     "unsupported system contention scope" );
0169 
0170   status = pthread_attr_init( &attr );
0171   posix_service_failed( status, "pthread_attr_init");
0172 
0173   /* now check out pthread_create for inherit scheduler */
0174 
0175   status = pthread_attr_setinheritsched( &attr, PTHREAD_INHERIT_SCHED );
0176   posix_service_failed( status, "pthread_attr_setinheritsched");
0177 
0178   puts( "Init - pthread_create - SUCCESSFUL (inherit scheduler)" );
0179   status = pthread_create( &Task_id, &attr, Task_1, NULL );
0180   posix_service_failed( status, "pthread_create");
0181 
0182   status = pthread_join( Task_id, NULL );
0183   posix_service_failed( status, " pthread_join");
0184 
0185     /* switch to Task_1 */
0186 
0187   /* exercise get and set scope */
0188 
0189   empty_line();
0190 
0191   status = pthread_attr_init( &attr );
0192   posix_service_failed( status, "pthread_attr_init");
0193 
0194   puts( "Init - pthread_attr_setscope - EINVAL (NULL attr)" );
0195   status = pthread_attr_setscope( NULL, PTHREAD_SCOPE_PROCESS );
0196   fatal_directive_check_status_only( status, EINVAL , "NULL attr" );
0197 
0198   puts( "Init - pthread_attr_setscope - ENOTSUP" );
0199   status = pthread_attr_setscope( &attr, PTHREAD_SCOPE_SYSTEM );
0200   fatal_directive_check_status_only( status, ENOTSUP, "PTHREAD_SCOPE_SYSTEM" );
0201 
0202   puts( "Init - pthread_attr_setscope - EINVAL (not initialized attr)" );
0203   status = pthread_attr_setscope( &destroyed_attr, PTHREAD_SCOPE_PROCESS );
0204   fatal_directive_check_status_only( status, EINVAL, "not initialized attr" );
0205 
0206   puts( "Init - pthread_attr_setscope - EINVAL (invalid scope)" );
0207   status = pthread_attr_setscope( &attr, -1 );
0208   fatal_directive_check_status_only( status, EINVAL, "invalid scope" );
0209 
0210   puts( "Init - pthread_attr_setscope - SUCCESSFUL" );
0211   status = pthread_attr_setscope( &attr, PTHREAD_SCOPE_PROCESS );
0212   posix_service_failed( status, "pthread_attr_setscope");
0213 
0214   puts( "Init - pthread_attr_getscope - EINVAL (NULL attr)" );
0215   status = pthread_attr_getscope( NULL, &scope );
0216   fatal_directive_check_status_only( status, EINVAL, "NULL attr" );
0217 
0218   puts( "Init - pthread_attr_getscope - EINVAL (NULL scope)" );
0219   status = pthread_attr_getscope( &attr, NULL );
0220   fatal_directive_check_status_only( status, EINVAL, "NULL scope" );
0221 
0222   puts( "Init - pthread_attr_getscope - EINVAL (not initialized attr)" );
0223   status = pthread_attr_getscope( &destroyed_attr, &scope );
0224   fatal_directive_check_status_only( status, EINVAL, "not initialized attr" );
0225 
0226   puts( "Init - pthread_attr_getscope - SUCCESSFUL" );
0227   status = pthread_attr_getscope( &attr, &scope );
0228   posix_service_failed( status, "pthread_attr_getscope");
0229   printf( "Init - current scope attribute = %d\n", scope );
0230 
0231   /* exercise get and set inherit scheduler */
0232 
0233   empty_line();
0234 
0235   puts( "Init - pthread_attr_setinheritsched - EINVAL (NULL attr)" );
0236   status = pthread_attr_setinheritsched( NULL, PTHREAD_INHERIT_SCHED );
0237   fatal_directive_check_status_only( status, EINVAL, "NULL attr" );
0238 
0239   puts( "Init - pthread_attr_setinheritsched - EINVAL (not initialized attr)" );
0240   status =
0241      pthread_attr_setinheritsched( &destroyed_attr, PTHREAD_INHERIT_SCHED );
0242   fatal_directive_check_status_only( status, EINVAL, "not initialized attr" );
0243 
0244   puts( "Init - pthread_attr_setinheritsched - ENOTSUP (invalid inheritsched)" );
0245   status = pthread_attr_setinheritsched( &attr, -1 );
0246   fatal_directive_check_status_only( status, ENOTSUP, "invalid inheritsched" );
0247 
0248   puts( "Init - pthread_attr_setinheritsched - SUCCESSFUL" );
0249   status = pthread_attr_setinheritsched( &attr, PTHREAD_INHERIT_SCHED );
0250   posix_service_failed( status, "pthread_attr_setinheritsched");
0251 
0252   puts( "Init - pthread_attr_getinheritsched - EINVAL (NULL attr)" );
0253   status = pthread_attr_getinheritsched( NULL, &inheritsched );
0254   fatal_directive_check_status_only( status, EINVAL, "NULL attr" );
0255 
0256   puts( "Init - pthread_attr_getinheritsched - EINVAL (NULL inheritsched)" );
0257   status = pthread_attr_getinheritsched( &attr, NULL );
0258   fatal_directive_check_status_only( status, EINVAL, "NULL inheritsched" );
0259 
0260   puts( "Init - pthread_attr_getinheritsched - EINVAL (not initialized attr)" );
0261   status = pthread_attr_getinheritsched( &destroyed_attr, &inheritsched );
0262   fatal_directive_check_status_only( status, EINVAL, "not initialized attr" );
0263 
0264   puts( "Init - pthread_attr_getinheritsched - SUCCESSFUL" );
0265   status = pthread_attr_getinheritsched( &attr, &inheritsched );
0266   posix_service_failed( status, "pthread_attr_getinheritsched");
0267   printf( "Init - current inherit scheduler attribute = %d\n", inheritsched );
0268 
0269   /* exercise get and set inherit scheduler */
0270 
0271   empty_line();
0272 
0273   puts( "Init - pthread_attr_setschedpolicy - EINVAL (NULL attr)" );
0274   status = pthread_attr_setschedpolicy( NULL, SCHED_FIFO );
0275   fatal_directive_check_status_only( status, EINVAL, "NULL attr" );
0276 
0277   puts( "Init - pthread_attr_setschedpolicy - EINVAL (not initialized attr)" );
0278   status =
0279      pthread_attr_setschedpolicy( &destroyed_attr, SCHED_OTHER );
0280   fatal_directive_check_status_only( status, EINVAL, "not initialized attr" );
0281 
0282   puts( "Init - pthread_attr_setschedpolicy - ENOTSUP (invalid schedpolicy)" );
0283   status = pthread_attr_setschedpolicy( &attr, -1 );
0284   fatal_directive_check_status_only( status, ENOTSUP, "invalid schedpolicy" );
0285 
0286   puts( "Init - pthread_attr_setschedpolicy - SUCCESSFUL" );
0287   status = pthread_attr_setschedpolicy( &attr, SCHED_RR );
0288   posix_service_failed( status, "pthread_attr_setschedpolicy");
0289 
0290   puts( "Init - pthread_attr_getschedpolicy - EINVAL (NULL attr)" );
0291   status = pthread_attr_getschedpolicy( NULL, &schedpolicy );
0292   fatal_directive_check_status_only( status, EINVAL, "NULL attr" );
0293 
0294   puts( "Init - pthread_attr_getschedpolicy - EINVAL (NULL schedpolicy)" );
0295   status = pthread_attr_getschedpolicy( &attr, NULL );
0296   fatal_directive_check_status_only( status, EINVAL, "NULL schedpolicy" );
0297 
0298   puts( "Init - pthread_attr_getschedpolicy - EINVAL (not initialized attr)" );
0299   status = pthread_attr_getschedpolicy( &destroyed_attr, &schedpolicy );
0300   fatal_directive_check_status_only( status, EINVAL, "not initialized attr" );
0301 
0302   puts( "Init - pthread_attr_getschedpolicy - SUCCESSFUL" );
0303   status = pthread_attr_getschedpolicy( &attr, &schedpolicy );
0304   posix_service_failed( status, "pthread_attr_getschedpolicy");
0305   printf( "Init - current scheduler policy attribute = %d\n", schedpolicy );
0306 
0307   /* exercise get and set stack size */
0308 
0309   empty_line();
0310 
0311   puts( "Init - pthread_attr_setstacksize - EINVAL (NULL attr)" );
0312   status = pthread_attr_setstacksize( NULL, 0 );
0313   fatal_directive_check_status_only( status, EINVAL, "NULL attr" );
0314 
0315   puts( "Init - pthread_attr_setstacksize - EINVAL (not initialized attr)" );
0316   status =
0317      pthread_attr_setstacksize( &destroyed_attr, 0 );
0318   fatal_directive_check_status_only( status, EINVAL, "not initialized attr" );
0319 
0320   puts( "Init - pthread_attr_setstacksize - SUCCESSFUL (low stacksize)" );
0321   status = pthread_attr_setstacksize( &attr, 0 );
0322   posix_service_failed( status, "pthread_attr_setstacksize");
0323 
0324   puts( "Init - pthread_attr_setstacksize - SUCCESSFUL (high stacksize)" );
0325   status = pthread_attr_setstacksize( &attr, STACK_MINIMUM_SIZE * 2 );
0326   posix_service_failed( status, "");
0327 
0328   puts( "Init - pthread_attr_getstacksize - EINVAL (NULL attr)" );
0329   status = pthread_attr_getstacksize( NULL, &stacksize );
0330   fatal_directive_check_status_only( status, EINVAL, "NULL attr" );
0331 
0332   puts( "Init - pthread_attr_getstacksize - EINVAL (NULL stacksize)" );
0333   status = pthread_attr_getstacksize( &attr, NULL );
0334   fatal_directive_check_status_only( status, EINVAL, "NULL stacksize" );
0335 
0336   puts( "Init - pthread_attr_getstacksize - EINVAL (not initialized attr)" );
0337   status = pthread_attr_getstacksize( &destroyed_attr, &stacksize );
0338   fatal_directive_check_status_only( status, EINVAL, "not initialized attr" );
0339 
0340   puts( "Init - pthread_attr_getstacksize - SUCCESSFUL" );
0341   status = pthread_attr_getstacksize( &attr, &stacksize );
0342   posix_service_failed( status, "pthread_attr_getstacksize");
0343   if ( stacksize == (STACK_MINIMUM_SIZE * 2) )
0344     printf( "Init - current stack size attribute is OK\n" );
0345 
0346   /* exercise get and set stack address */
0347   empty_line();
0348 
0349   puts( "Init - pthread_attr_setstackaddr - EINVAL (NULL attr)" );
0350   status = pthread_attr_setstackaddr( NULL, NULL );
0351   fatal_directive_check_status_only( status, EINVAL, "NULL attr" );
0352 
0353   puts( "Init - pthread_attr_setstackaddr - EINVAL (not initialized attr)" );
0354   status = pthread_attr_setstackaddr( &destroyed_attr, NULL );
0355   fatal_directive_check_status_only( status, EINVAL, "not initialized attr" );
0356 
0357   puts( "Init - pthread_attr_setstackaddr - SUCCESSFUL" );
0358   status = pthread_attr_setstackaddr( &attr, 0 );
0359   posix_service_failed( status, "");
0360 
0361   /* get stack addr */
0362   puts( "Init - pthread_attr_getstackaddr - EINVAL (NULL attr)" );
0363   status = pthread_attr_getstackaddr( NULL, &stackaddr );
0364   fatal_directive_check_status_only( status, EINVAL, "NULL attr" );
0365 
0366   puts( "Init - pthread_attr_getstackaddr - EINVAL (NULL stackaddr)" );
0367   status = pthread_attr_getstackaddr( &attr, NULL );
0368   fatal_directive_check_status_only( status, EINVAL, "NULL stackaddr" );
0369 
0370   puts( "Init - pthread_attr_getstackaddr - EINVAL (not initialized attr)" );
0371   status = pthread_attr_getstackaddr( &destroyed_attr, &stackaddr );
0372   fatal_directive_check_status_only( status, EINVAL, "not initialized attr" );
0373 
0374   puts( "Init - pthread_attr_getstackaddr - SUCCESSFUL" );
0375   status = pthread_attr_getstackaddr( &attr, &stackaddr );
0376   posix_service_failed( status, "pthread_attr_getstackaddr");
0377   printf( "Init - current stack address attribute = %p\n", stackaddr );
0378 
0379   /* exercise get and set stack (as pair) */
0380   empty_line();
0381 
0382   puts( "Init - pthread_attr_setstack- EINVAL (NULL attr)" );
0383   status = pthread_attr_setstack( NULL, &stackaddr, 1024 );
0384   fatal_directive_check_status_only( status, EINVAL, "NULL attr" );
0385 
0386   puts( "Init - pthread_attr_setstack- EINVAL (destroyed attr)" );
0387   status = pthread_attr_setstack( &destroyed_attr, &stackaddr, 1024 );
0388   fatal_directive_check_status_only( status, EINVAL, "NULL attr" );
0389 
0390   puts( "Init - pthread_attr_setstack- SUCCESSFUL (< min stack)" );
0391   status = pthread_attr_setstack( &attr, stackaddr, 0 );
0392   posix_service_failed( status, "OK");
0393 
0394   puts( "Init - pthread_attr_setstack- SUCCESSFUL (big stack)" );
0395   status = pthread_attr_setstack( &attr, stackaddr, STACK_MINIMUM_SIZE * 2 );
0396   posix_service_failed( status, "OK");
0397 
0398   puts( "Init - pthread_attr_getstack- EINVAL (NULL attr)" );
0399   status = pthread_attr_getstack( NULL, &stackaddr, &stacksize );
0400   fatal_directive_check_status_only( status, EINVAL, "NULL attr" );
0401 
0402   puts( "Init - pthread_attr_getstack- EINVAL (destroyed attr)" );
0403   status = pthread_attr_getstack( &destroyed_attr, &stackaddr, &stacksize );
0404   fatal_directive_check_status_only( status, EINVAL, "&destroyed attr" );
0405 
0406   puts( "Init - pthread_attr_getstack- EINVAL (NULL stack)" );
0407   status = pthread_attr_getstack( &attr, NULL, &stacksize );
0408   fatal_directive_check_status_only( status, EINVAL, "&NULL stack" );
0409 
0410   puts( "Init - pthread_attr_getstack- EINVAL (NULL stacksize)" );
0411   status = pthread_attr_getstack( &attr, &stackaddr, NULL );
0412   fatal_directive_check_status_only( status, EINVAL, "&NULL size" );
0413 
0414   puts( "Init - pthread_attr_getstack- SUCCESSFUL" );
0415   status = pthread_attr_getstack( &attr, &stackaddr, &stacksize );
0416   posix_service_failed( status, "pthread_attr_getstack");
0417 
0418   /* exercise get and set detach state */
0419   empty_line();
0420 
0421   puts( "Init - pthread_attr_setguardsize - EINVAL (NULL attr)" );
0422   status = pthread_attr_setguardsize( NULL, 0 );
0423   fatal_directive_check_status_only( status, EINVAL, "NULL attr" );
0424 
0425   puts( "Init - pthread_attr_setguardsize - EINVAL (not initialized attr)" );
0426   status = pthread_attr_setguardsize( &destroyed_attr, 0 );
0427   fatal_directive_check_status_only( status, EINVAL, "not initialized attr" );
0428 
0429   puts( "Init - pthread_attr_setguardsize - SUCCESSFUL (low guardsize)" );
0430   status = pthread_attr_setguardsize( &attr, 0 );
0431   posix_service_failed( status, "pthread_attr_setguardsize");
0432 
0433   puts( "Init - pthread_attr_setguardsize - SUCCESSFUL (high guardsize)" );
0434   status = pthread_attr_setguardsize( &attr, STACK_MINIMUM_SIZE * 2 );
0435   posix_service_failed( status, "");
0436 
0437   puts( "Init - pthread_attr_getguardsize - EINVAL (NULL attr)" );
0438   status = pthread_attr_getguardsize( NULL, &guardsize );
0439   fatal_directive_check_status_only( status, EINVAL, "NULL attr" );
0440 
0441   puts( "Init - pthread_attr_getguardsize - EINVAL (NULL guardsize)" );
0442   status = pthread_attr_getguardsize( &attr, NULL );
0443   fatal_directive_check_status_only( status, EINVAL, "NULL guardsize" );
0444 
0445   puts( "Init - pthread_attr_getguardsize - EINVAL (not initialized attr)" );
0446   status = pthread_attr_getguardsize( &destroyed_attr, &guardsize );
0447   fatal_directive_check_status_only( status, EINVAL, "not initialized attr" );
0448 
0449   puts( "Init - pthread_attr_getguardsize - SUCCESSFUL" );
0450   status = pthread_attr_getguardsize( &attr, &guardsize );
0451   posix_service_failed( status, "pthread_attr_getguardsize");
0452 
0453   /* exercise get and set detach state */
0454   empty_line();
0455 
0456   puts( "Init - pthread_attr_setdetachstate - EINVAL (NULL attr)" );
0457   status = pthread_attr_setdetachstate( NULL, PTHREAD_CREATE_DETACHED );
0458   fatal_directive_check_status_only( status, EINVAL, "NULL attr" );
0459 
0460   puts( "Init - pthread_attr_setdetachstate - EINVAL (not initialized attr)" );
0461   status =
0462      pthread_attr_setdetachstate( &destroyed_attr, PTHREAD_CREATE_JOINABLE );
0463   fatal_directive_check_status_only( status, EINVAL, "not initialized att" );
0464 
0465   puts( "Init - pthread_attr_setdetachstate - EINVAL (invalid detachstate)" );
0466   status = pthread_attr_setdetachstate( &attr, -1 );
0467   fatal_directive_check_status_only( status, EINVAL, "invalid detachstate" );
0468 
0469   puts( "Init - pthread_attr_setdetachstate - SUCCESSFUL" );
0470   status = pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_JOINABLE );
0471   posix_service_failed( status, "pthread_attr_setdetachstate");
0472 
0473   puts( "Init - pthread_attr_getdetachstate - EINVAL (NULL attr)" );
0474   status = pthread_attr_getdetachstate( NULL, &detachstate );
0475   fatal_directive_check_status_only( status, EINVAL, "NULL attr" );
0476 
0477   puts( "Init - pthread_attr_getdetachstate - EINVAL (NULL detatchstate)" );
0478   status = pthread_attr_getdetachstate( &attr, NULL );
0479   fatal_directive_check_status_only( status, EINVAL, "NULL detatchstate" );
0480 
0481   puts( "Init - pthread_attr_getdetachstate - EINVAL (not initialized attr)" );
0482   status = pthread_attr_getdetachstate( &destroyed_attr, &detachstate );
0483   fatal_directive_check_status_only( status, EINVAL, "not initialized attr" );
0484 
0485   puts( "Init - pthread_attr_getdetachstate - SUCCESSFUL" );
0486   status = pthread_attr_getdetachstate( &attr, &detachstate );
0487   posix_service_failed( status, "pthread_attr_getdetachstate");
0488   printf( "Init - current detach state attribute = %d\n", detachstate );
0489 
0490   /* exercise get and set scheduling parameters */
0491 
0492   empty_line();
0493 
0494   puts( "Init - pthread_attr_getschedparam - SUCCESSFUL" );
0495   status = pthread_attr_getschedparam( &attr, &schedparam );
0496   posix_service_failed( status, "pthread_attr_getschedparam");
0497 
0498   print_schedparam( "Init - ", &schedparam );
0499 
0500   puts( "Init - pthread_attr_setschedparam - EINVAL (NULL attr)" );
0501   status = pthread_attr_setschedparam( NULL, &schedparam );
0502   fatal_directive_check_status_only( status, EINVAL, "NULL attr" );
0503 
0504   puts( "Init - pthread_attr_setschedparam - EINVAL (not initialized attr)" );
0505   status = pthread_attr_setschedparam( &destroyed_attr, &schedparam );
0506   fatal_directive_check_status_only( status, EINVAL, "not initialized attr" );
0507 
0508   puts( "Init - pthread_attr_setschedparam - EINVAL (NULL schedparam)" );
0509   status = pthread_attr_setschedparam( &attr, NULL );
0510   fatal_directive_check_status_only( status, EINVAL, "NULL schedparam" );
0511 
0512   puts( "Init - pthread_attr_setschedparam - SUCCESSFUL" );
0513   status = pthread_attr_setschedparam( &attr, &schedparam );
0514   posix_service_failed( status, "pthread_attr_setschedparam");
0515 
0516   puts( "Init - pthread_attr_getschedparam - EINVAL (NULL attr)" );
0517   status = pthread_attr_getschedparam( NULL, &schedparam );
0518   fatal_directive_check_status_only( status, EINVAL, "pthread_attr_getschedparam" );
0519 
0520   puts( "Init - pthread_attr_getschedparam - EINVAL (not initialized attr)" );
0521   status = pthread_attr_getschedparam( &destroyed_attr, &schedparam );
0522   fatal_directive_check_status_only( status, EINVAL, "not initialized attr" );
0523 
0524   puts( "Init - pthread_attr_getschedparam - EINVAL (NULL schedparam)" );
0525   status = pthread_attr_getschedparam( &attr, NULL );
0526   fatal_directive_check_status_only( status, EINVAL, "NULL schedparam" );
0527 
0528   /* exercise pthread_getschedparam */
0529 
0530   empty_line();
0531 
0532   puts( "Init - pthread_getschedparam - EINVAL (NULL policy)" );
0533   status = pthread_getschedparam( pthread_self(), NULL, &schedparam );
0534   fatal_directive_check_status_only( status, EINVAL, "NULL policy" );
0535 
0536   puts( "Init - pthread_getschedparam - EINVAL (NULL schedparam)" );
0537   status = pthread_getschedparam( pthread_self(), &schedpolicy, NULL );
0538   fatal_directive_check_status_only( status, EINVAL, "NULL schedparam" );
0539 
0540   puts( "Init - pthread_getschedparam - ESRCH (bad thread)" );
0541   status = pthread_getschedparam( (pthread_t) -1, &schedpolicy, &schedparam );
0542   fatal_directive_check_status_only( status, ESRCH, "bad thread" );
0543 
0544   puts( "Init - pthread_getschedparam - SUCCESSFUL" );
0545   status = pthread_getschedparam( pthread_self(), &schedpolicy, &schedparam );
0546   posix_service_failed( status, "pthread_getschedparam");
0547 
0548   printf( "Init - policy = %d\n", schedpolicy );
0549 
0550   print_schedparam( "Init - ", &schedparam );
0551 
0552   /* exercise pthread_setschedparam */
0553 
0554   empty_line();
0555 
0556   puts( "Init - pthread_setschedparam - EINVAL (NULL schedparam)" );
0557   status = pthread_setschedparam( pthread_self(), SCHED_OTHER, NULL );
0558   fatal_directive_check_status_only( status, EINVAL, "NULL schedparam" );
0559 
0560   schedparam.sched_priority = -1;
0561 
0562   puts( "Init - pthread_setschedparam - EINVAL (invalid priority)" );
0563   status = pthread_setschedparam( pthread_self(), SCHED_OTHER, NULL );
0564   fatal_directive_check_status_only( status, EINVAL, "invalid priority" );
0565 
0566   /* reset sched_param */
0567   status = pthread_getschedparam( pthread_self(), &schedpolicy, &schedparam );
0568   posix_service_failed( status, "pthread_getschedparam");
0569 
0570   puts( "Init - pthread_setschedparam - EINVAL (invalid policy)" );
0571   status = pthread_setschedparam( pthread_self(), -1, &schedparam );
0572   fatal_directive_check_status_only( status, EINVAL, "invalid policy" );
0573 
0574   puts( "Init - pthread_setschedparam - ESRCH (invalid thread)" );
0575   status = pthread_setschedparam( (pthread_t) -1, SCHED_OTHER, &schedparam );
0576   fatal_directive_check_status_only( status, ESRCH, "invalid thread" );
0577 
0578 #if defined(RTEMS_POSIX_API)
0579   /* now get sporadic server errors */
0580 
0581   schedparam.sched_ss_repl_period.tv_sec = 0;
0582   schedparam.sched_ss_repl_period.tv_nsec = 0;
0583   schedparam.sched_ss_init_budget.tv_sec = 1;
0584   schedparam.sched_ss_init_budget.tv_nsec = 1;
0585 
0586   puts( "Init - pthread_setschedparam - EINVAL (replenish == 0)" );
0587   status = pthread_setschedparam( pthread_self(), SCHED_SPORADIC, &schedparam );
0588   fatal_directive_check_status_only( status, EINVAL, "replenish == 0" );
0589 
0590   schedparam.sched_ss_repl_period.tv_sec = 1;
0591   schedparam.sched_ss_repl_period.tv_nsec = 1;
0592   schedparam.sched_ss_init_budget.tv_sec = 0;
0593   schedparam.sched_ss_init_budget.tv_nsec = 0;
0594 
0595   puts( "Init - pthread_setschedparam - EINVAL (budget == 0)" );
0596   status = pthread_setschedparam( pthread_self(), SCHED_SPORADIC, &schedparam );
0597   fatal_directive_check_status_only( status, EINVAL, "budget == 0" );
0598 
0599   schedparam.sched_ss_repl_period.tv_sec = 1;
0600   schedparam.sched_ss_repl_period.tv_nsec = 0;
0601   schedparam.sched_ss_init_budget.tv_sec = 1;
0602   schedparam.sched_ss_init_budget.tv_nsec = 1;
0603 
0604   puts( "Init - pthread_setschedparam - EINVAL (replenish < budget)" );
0605   status = pthread_setschedparam( pthread_self(), SCHED_SPORADIC, &schedparam );
0606   fatal_directive_check_status_only( status, EINVAL, "replenish < budget" );
0607 
0608   schedparam.sched_ss_repl_period.tv_sec = 2;
0609   schedparam.sched_ss_repl_period.tv_nsec = 0;
0610   schedparam.sched_ss_init_budget.tv_sec = 1;
0611   schedparam.sched_ss_init_budget.tv_nsec = 0;
0612   schedparam.sched_ss_low_priority = -1;
0613 
0614   puts( "Init - pthread_setschedparam - EINVAL (invalid priority)" );
0615   status = pthread_setschedparam( pthread_self(), SCHED_SPORADIC, &schedparam );
0616   fatal_directive_check_status_only( status, EINVAL, "invalid priority" );
0617 
0618   /*
0619    *  Create a sporadic thread that doesn't need it's priority
0620    *  boosted
0621    */
0622   empty_line();
0623 
0624   puts( "Init - pthread_attr_init - SUCCESSFUL" );
0625   status = pthread_attr_init( &attr );
0626   posix_service_failed( status, "pthread_attr_init" );
0627 
0628   puts( "Init - pthread_attr_setinheritsched - EXPLICIT - SUCCESSFUL" );
0629   status = pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );
0630   rtems_test_assert( !status );
0631 
0632   schedparam.sched_ss_repl_period.tv_sec = 3;
0633   schedparam.sched_ss_repl_period.tv_nsec = 3;
0634   schedparam.sched_ss_init_budget.tv_sec = 1;
0635   schedparam.sched_ss_init_budget.tv_nsec = 1;
0636   schedparam.sched_priority = sched_get_priority_max( SCHED_FIFO );
0637   schedparam.sched_ss_low_priority = sched_get_priority_max( SCHED_FIFO ) - 6;
0638 
0639   puts( "Init - pthread_attr_setschedpolicy - SUCCESSFUL" );
0640   status = pthread_attr_setschedpolicy( &attr, SCHED_SPORADIC );
0641   posix_service_failed( status, "pthread_attr_setschedparam");
0642   puts( "Init - pthread_attr_setschedparam - SUCCESSFUL" );
0643   status = pthread_attr_setschedparam( &attr, &schedparam );
0644   posix_service_failed( status, "pthread_attr_setschedparam");
0645 
0646   status = pthread_create( &Task2_id, &attr, Task_2, NULL );
0647   rtems_test_assert( !status );
0648 
0649   status = pthread_join( Task2_id, NULL );
0650   posix_service_failed( status, " pthread_join");
0651 #endif
0652 
0653   TEST_END();
0654   rtems_test_exit( 0 );
0655 
0656   return NULL; /* just so the compiler thinks we returned something */
0657 }