summaryrefslogblamecommitdiffstats
path: root/testsuites/psxtests/psxsem01/init.c
blob: 26e66076619926a4421ee84403e05bd64979795c (plain) (tree)










































































































































                                                                            
#define CONFIGURE_INIT
#include "system.h"
#include <sched.h>
#include <fcntl.h>
#include <time.h>

void *POSIX_Init(
  void *argument
)
{
  int             status;
  int             value;
  int             i;
  sem_t           sems[CONFIGURE_MAXIMUM_POSIX_SEMAPHORES];
  sem_t           sem2;
  sem_t           *n_sem1;
  sem_t           *n_sem2;
  sem_t           testsem;
  struct timespec waittime;

  puts( "\n\n*** POSIX SEMAPHORE MANAGER TEST 1 ***" );

  puts( "Init: sem_init - SUCCESSFUL" );
  for (i = 0; i < CONFIGURE_MAXIMUM_POSIX_SEMAPHORES; i++) {
    status = sem_init(&sems[i], 0, i);
    assert( status == 0 );
  }
  puts( "Init: sem_init - UNSUCCESSFUL (ENOSPC)" );
  status = sem_init(&sem2, 0, 1);
  assert( (status == -1) && (errno == ENOSPC) );
 
  puts( "Init: sem_init - UNSUCCESSFUL (ENOSYS -- pshared not supported)" );
  status = sem_init(&sem2, 1, 1);
  assert( (status == -1) && (errno == ENOSYS) );
  
  puts( "Init: sem_getvalue - SUCCESSFUL ");
  for (i = 0; i < CONFIGURE_MAXIMUM_POSIX_SEMAPHORES; i++) {
    status = sem_getvalue(&sems[i], &value);
    assert( (status == 0) && (value == i) );
  }
  puts( "Init: sem_getvalue - UNSUCCESSFUL ");
  status = sem_getvalue(&sem2, &value);
  assert( (status == -1) && (errno == EINVAL) );

  puts( "Init: sem_destroy - SUCCESSFUL" );
  status = sem_destroy(&sems[0]);
  assert( status == 0 );

  puts( "Init: sem_destroy - UNSUCCESSFUL (EINVAL)" );
  status = sem_destroy(&sem2);
  assert( (status == -1) && (errno == EINVAL) );

  puts( "Init: sem_wait - SUCCESSFUL" );
  status = sem_wait(&sems[1]);
  assert( status == 0);

  puts( "Init: sem_wait - UNSUCCESSFUL (EINVAL)" );
  status = sem_wait(&sem2);
  assert( (status == -1) && (errno == EINVAL) );

  puts( "Init: sem_post - SUCCESSFUL" );
  status = sem_post(&sems[1]);
  assert( status == 0 );

  puts( "Init: sem_wait - SUCCESSFUL (after a sem_post)" );
  status = sem_wait(&sems[1]);
  assert( status == 0 );

  puts( "Init: sem_trywait - SUCCESSFUL" );
  status = sem_trywait(&sems[2]);
  assert( status == 0 );

  puts( "Init: sem_trywait - UNSUCCESSFUL (EAGAIN)" );
  status = sem_trywait(&sems[1]);
  assert( (status == -1) && (errno == EAGAIN) );

  puts( "Init: sem_trywait - UNSUCCESSFUL (EINVAL)" );
  status = sem_trywait(&sem2);
  assert( (status == -1) && (errno == EINVAL) );

  puts( "Init: sem_timedwait - SUCCESSFUL" );
  waittime.tv_sec = 0;
  waittime.tv_nsec = 100;
  status = sem_timedwait(&sems[2], &waittime);
  assert( status == 0 );

  puts( "Init: sem_timedwait - UNSUCCESSFUL (ETIMEDOUT)" );
  status = sem_timedwait(&sems[1], &waittime);
  assert( (status == -1) && (errno == ETIMEDOUT) );

  puts( "Init: sem_timedwait - UNSUCCESSFUL (EINVAL)" );
  status = sem_timedwait(&sem2, &waittime);
  assert( (status == -1) && (errno == EINVAL) );

  puts( "Init: sem_post - UNSUCCESSFUL (EINVAL)" );
  status = sem_post(&sem2);
  assert( (status == -1) && (errno == EINVAL) );

  puts( "Init: sem_destroy - SUCCESSFUL" );
  for (i = 1; i < CONFIGURE_MAXIMUM_POSIX_SEMAPHORES; i++) {
    status = sem_destroy(&sems[i]);
    assert( status == 0);
  }

  /* Modes are currently unsupported */

  puts( "Init: sem_open - SUCCESSFUL" );
  n_sem1 = sem_open("sem1", O_CREAT, 00777, 1);
  assert( n_sem1 != SEM_FAILED );

  puts( "Init: sem_open - UNSUCCESSFUL (EEXIST)" );
  n_sem2 = sem_open("sem1", O_CREAT | O_EXCL, 00777, 1);
  assert( (n_sem2 == SEM_FAILED) && (errno == EEXIST) );

  puts( "Init: sem_close - SUCCESSFUL" );
  status = sem_close(n_sem1);
  assert( status == 0);

  /*
  puts( "Init: sem_close - UNSUCCESSFUL (EINVAL)" );
  status = sem_close(n_sem2);
  assert( (status == -1) && (errno == EINVAL) );

  puts( "Init: sem_unlink - SUCCESSFUL" );
  status = sem_unlink("sem1");
  assert( status == 0 );

  puts( "Init: sem_unlink - UNSUCCESSFUL (ENOENT)" );
  status = sem_unlink("sem2");
  assert( (status == -1) && (errno == ENOENT) );
  */

  /* Try adding in unlinking before closing... (can we still open?) */

  puts( "*** POSIX SEMAPHORE MANAGER TEST 1 COMPLETED ***" );
  exit(0);

  return NULL; /* just so the compiler thinks we returned something */
}