Changeset 5600661 in rtems


Ignore:
Timestamp:
May 30, 1996, 8:48:10 PM (24 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, master
Children:
7c55e06
Parents:
b169590
Message:

First cut at implementing time, clock_gettime, clock_settime, clock_getres,
sleep, and nanosleep. Does not yet support per process clock, per thread
clock, interruptible sleep (sleep/nanosleep), or time remaining on nanosleep.

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • c/src/exec/posix/src/psignal.c

    rb169590 r5600661  
    245245)
    246246{
    247   _Thread_Disable_dispatch();
    248     _Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_TIME );
    249     _Watchdog_Initialize(
    250       &_Thread_Executing->Timer,
    251       _Thread_Delay_ended,          /* XXX may need to be POSIX specific */
    252       _Thread_Executing->Object.id,
    253       NULL
    254     );
    255     _Watchdog_Insert_seconds( &_Thread_Executing->Timer, seconds );
    256   _Thread_Enable_dispatch();
    257   return 0;                       /* XXX should account for signal */
    258 }
     247  /* XXX can we get away with this implementation? */
     248  struct timespec tp;
     249
     250  tp.tv_sec = seconds;
     251  tp.tv_nsec = 0;
     252
     253  return nanosleep( &tp, NULL );
     254}
  • c/src/exec/posix/src/time.c

    rb169590 r5600661  
    33 */
    44
     5#include <assert.h>
    56#include <time.h>
     7#include <errno.h>
    68
    79#include <rtems/system.h>
     10#include <rtems/score/isr.h>
     11#include <rtems/score/thread.h>
    812#include <rtems/score/tod.h>
    913
     
    2529)
    2630{
    27   return POSIX_NOT_IMPLEMENTED();
     31  Watchdog_Interval  ticks;
     32
     33  ticks  = (time->tv_sec * TOD_MICROSECONDS_PER_SECOND) /
     34             _TOD_Microseconds_per_tick;
     35
     36  ticks += (time->tv_nsec / TOD_NANOSECONDS_PER_MICROSECOND) /
     37             _TOD_Microseconds_per_tick;
     38
     39  return ticks;
    2840}
    2941
     
    3951
    4052  if ( !_TOD_Is_set() ) {
    41     /* XXX set errno */
     53    errno = EINVAL;
    4254    return -1;
    4355  }
     
    6678)
    6779{
    68   return POSIX_NOT_IMPLEMENTED();
     80  struct tm         split_time;
     81  TOD_Control       tod;
     82  Watchdog_Interval seconds;
     83
     84  assert( tp );
     85
     86  switch ( clock_id ) {
     87 
     88    case CLOCK_REALTIME:
     89      (void) gmtime_r( &tp->tv_sec, &split_time );
     90 
     91      /*
     92       *  Convert the tm structure format to that used by the TOD Handler
     93       *
     94       *  NOTE: TOD Handler does not honor leap seconds.
     95       */
     96
     97      tod.year   = split_time.tm_year + 1900;  /* RHS is years since 1900 */
     98      tod.month  = split_time.tm_mon + 1;      /* RHS uses 0-11 */
     99      tod.day    = split_time.tm_mday;
     100      tod.hour   = split_time.tm_hour;
     101      tod.minute = split_time.tm_min;
     102      tod.second = split_time.tm_sec;  /* RHS allows 0-61 for leap seconds */
     103
     104      tod.ticks  = (tp->tv_nsec / TOD_NANOSECONDS_PER_MICROSECOND) /
     105                      _TOD_Microseconds_per_tick;
     106
     107      if ( !_TOD_Validate( &tod ) ) {
     108        errno = EINVAL;
     109        return -1;
     110      }
     111 
     112      /*
     113       *  We can't use the tp->tv_sec field because it is based on
     114       *  a different EPOCH.
     115       */
     116
     117      seconds = _TOD_To_seconds( &tod );
     118      _Thread_Disable_dispatch();
     119        _TOD_Set( &tod, seconds );
     120      _Thread_Enable_dispatch();
     121      break;
     122 
     123#ifdef _POSIX_CPUTIME
     124    case CLOCK_PROCESS_CPUTIME:
     125      return POSIX_NOT_IMPLEMENTED();
     126      break;
     127#endif
     128 
     129#ifdef _POSIX_THREAD_CPUTIME
     130    case CLOCK_THREAD_CPUTIME:
     131      return POSIX_NOT_IMPLEMENTED();
     132      break;
     133#endif
     134    default:
     135      errno = EINVAL;
     136      return -1;
     137 
     138  }
     139  return 0;
    69140}
    70141
     
    78149)
    79150{
    80   return POSIX_NOT_IMPLEMENTED();
     151  ISR_Level      level;
     152  time_t         seconds;
     153  long           ticks;
     154
     155  assert( tp );
     156
     157  switch ( clock_id ) {
     158
     159    case CLOCK_REALTIME:
     160      if ( !_TOD_Is_set() ) {  /* XXX does posix allow it to not be set? */
     161        errno = EINVAL;
     162        return -1;
     163      }
     164 
     165      _ISR_Disable( level );
     166        seconds = _TOD_Seconds_since_epoch;
     167        ticks   = _TOD_Current.ticks;
     168      _ISR_Enable( level );
     169 
     170      tp->tv_sec  = seconds + POSIX_TIME_SECONDS_1970_THROUGH_1988;
     171      tp->tv_nsec = ticks * _TOD_Microseconds_per_tick *
     172                      TOD_NANOSECONDS_PER_MICROSECOND;
     173      break;
     174
     175#ifdef _POSIX_CPUTIME
     176    case CLOCK_PROCESS_CPUTIME:
     177      /* could base this on _TOD_Ticks_since_boot -- must make set work though*/
     178      return POSIX_NOT_IMPLEMENTED();
     179      break;
     180#endif
     181
     182#ifdef _POSIX_THREAD_CPUTIME
     183    case CLOCK_THREAD_CPUTIME:
     184      return POSIX_NOT_IMPLEMENTED();
     185      break;
     186#endif
     187    default:
     188      errno = EINVAL;
     189      return -1;
     190
     191  }
     192  return 0;
    81193}
    82194
     
    90202)
    91203{
    92   return POSIX_NOT_IMPLEMENTED();
     204  switch ( clock_id ) {
     205 
     206    /*
     207     *  All time in rtems is based on the same clock tick.
     208     */
     209
     210    case CLOCK_REALTIME:
     211    case CLOCK_PROCESS_CPUTIME:
     212    case CLOCK_THREAD_CPUTIME:
     213      if ( res ) {
     214        res->tv_sec  = _TOD_Microseconds_per_tick / TOD_MICROSECONDS_PER_SECOND;
     215        res->tv_nsec =
     216          (_TOD_Microseconds_per_tick % TOD_MICROSECONDS_PER_SECOND) *
     217            TOD_NANOSECONDS_PER_MICROSECOND;
     218      }
     219      break;
     220 
     221    default:
     222      errno = EINVAL;
     223      return -1;
     224 
     225  }
     226  return 0;
    93227}
    94228
     
    163297)
    164298{
    165   return POSIX_NOT_IMPLEMENTED();
     299  Watchdog_Interval ticks;
     300
     301/* XXX this is interruptible by a posix signal */
     302
     303/* XXX rmtp is the time remaining on the timer -- we do not support this */
     304
     305/* XXX rmtp may be NULL */
     306
     307  ticks = _POSIX_Time_Spec_to_interval( rqtp );
     308 
     309  _Thread_Disable_dispatch();
     310    _Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_TIME );
     311    _Watchdog_Initialize(
     312      &_Thread_Executing->Timer,
     313      _Thread_Delay_ended,          /* XXX may need to be POSIX specific */
     314      _Thread_Executing->Object.id,
     315      NULL
     316    );
     317    _Watchdog_Insert_ticks( &_Thread_Executing->Timer, ticks );
     318  _Thread_Enable_dispatch();
     319  return 0;                    /* XXX should account for signal/remaining */
     320
    166321}
    167322
  • cpukit/posix/src/psignal.c

    rb169590 r5600661  
    245245)
    246246{
    247   _Thread_Disable_dispatch();
    248     _Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_TIME );
    249     _Watchdog_Initialize(
    250       &_Thread_Executing->Timer,
    251       _Thread_Delay_ended,          /* XXX may need to be POSIX specific */
    252       _Thread_Executing->Object.id,
    253       NULL
    254     );
    255     _Watchdog_Insert_seconds( &_Thread_Executing->Timer, seconds );
    256   _Thread_Enable_dispatch();
    257   return 0;                       /* XXX should account for signal */
    258 }
     247  /* XXX can we get away with this implementation? */
     248  struct timespec tp;
     249
     250  tp.tv_sec = seconds;
     251  tp.tv_nsec = 0;
     252
     253  return nanosleep( &tp, NULL );
     254}
  • cpukit/posix/src/time.c

    rb169590 r5600661  
    33 */
    44
     5#include <assert.h>
    56#include <time.h>
     7#include <errno.h>
    68
    79#include <rtems/system.h>
     10#include <rtems/score/isr.h>
     11#include <rtems/score/thread.h>
    812#include <rtems/score/tod.h>
    913
     
    2529)
    2630{
    27   return POSIX_NOT_IMPLEMENTED();
     31  Watchdog_Interval  ticks;
     32
     33  ticks  = (time->tv_sec * TOD_MICROSECONDS_PER_SECOND) /
     34             _TOD_Microseconds_per_tick;
     35
     36  ticks += (time->tv_nsec / TOD_NANOSECONDS_PER_MICROSECOND) /
     37             _TOD_Microseconds_per_tick;
     38
     39  return ticks;
    2840}
    2941
     
    3951
    4052  if ( !_TOD_Is_set() ) {
    41     /* XXX set errno */
     53    errno = EINVAL;
    4254    return -1;
    4355  }
     
    6678)
    6779{
    68   return POSIX_NOT_IMPLEMENTED();
     80  struct tm         split_time;
     81  TOD_Control       tod;
     82  Watchdog_Interval seconds;
     83
     84  assert( tp );
     85
     86  switch ( clock_id ) {
     87 
     88    case CLOCK_REALTIME:
     89      (void) gmtime_r( &tp->tv_sec, &split_time );
     90 
     91      /*
     92       *  Convert the tm structure format to that used by the TOD Handler
     93       *
     94       *  NOTE: TOD Handler does not honor leap seconds.
     95       */
     96
     97      tod.year   = split_time.tm_year + 1900;  /* RHS is years since 1900 */
     98      tod.month  = split_time.tm_mon + 1;      /* RHS uses 0-11 */
     99      tod.day    = split_time.tm_mday;
     100      tod.hour   = split_time.tm_hour;
     101      tod.minute = split_time.tm_min;
     102      tod.second = split_time.tm_sec;  /* RHS allows 0-61 for leap seconds */
     103
     104      tod.ticks  = (tp->tv_nsec / TOD_NANOSECONDS_PER_MICROSECOND) /
     105                      _TOD_Microseconds_per_tick;
     106
     107      if ( !_TOD_Validate( &tod ) ) {
     108        errno = EINVAL;
     109        return -1;
     110      }
     111 
     112      /*
     113       *  We can't use the tp->tv_sec field because it is based on
     114       *  a different EPOCH.
     115       */
     116
     117      seconds = _TOD_To_seconds( &tod );
     118      _Thread_Disable_dispatch();
     119        _TOD_Set( &tod, seconds );
     120      _Thread_Enable_dispatch();
     121      break;
     122 
     123#ifdef _POSIX_CPUTIME
     124    case CLOCK_PROCESS_CPUTIME:
     125      return POSIX_NOT_IMPLEMENTED();
     126      break;
     127#endif
     128 
     129#ifdef _POSIX_THREAD_CPUTIME
     130    case CLOCK_THREAD_CPUTIME:
     131      return POSIX_NOT_IMPLEMENTED();
     132      break;
     133#endif
     134    default:
     135      errno = EINVAL;
     136      return -1;
     137 
     138  }
     139  return 0;
    69140}
    70141
     
    78149)
    79150{
    80   return POSIX_NOT_IMPLEMENTED();
     151  ISR_Level      level;
     152  time_t         seconds;
     153  long           ticks;
     154
     155  assert( tp );
     156
     157  switch ( clock_id ) {
     158
     159    case CLOCK_REALTIME:
     160      if ( !_TOD_Is_set() ) {  /* XXX does posix allow it to not be set? */
     161        errno = EINVAL;
     162        return -1;
     163      }
     164 
     165      _ISR_Disable( level );
     166        seconds = _TOD_Seconds_since_epoch;
     167        ticks   = _TOD_Current.ticks;
     168      _ISR_Enable( level );
     169 
     170      tp->tv_sec  = seconds + POSIX_TIME_SECONDS_1970_THROUGH_1988;
     171      tp->tv_nsec = ticks * _TOD_Microseconds_per_tick *
     172                      TOD_NANOSECONDS_PER_MICROSECOND;
     173      break;
     174
     175#ifdef _POSIX_CPUTIME
     176    case CLOCK_PROCESS_CPUTIME:
     177      /* could base this on _TOD_Ticks_since_boot -- must make set work though*/
     178      return POSIX_NOT_IMPLEMENTED();
     179      break;
     180#endif
     181
     182#ifdef _POSIX_THREAD_CPUTIME
     183    case CLOCK_THREAD_CPUTIME:
     184      return POSIX_NOT_IMPLEMENTED();
     185      break;
     186#endif
     187    default:
     188      errno = EINVAL;
     189      return -1;
     190
     191  }
     192  return 0;
    81193}
    82194
     
    90202)
    91203{
    92   return POSIX_NOT_IMPLEMENTED();
     204  switch ( clock_id ) {
     205 
     206    /*
     207     *  All time in rtems is based on the same clock tick.
     208     */
     209
     210    case CLOCK_REALTIME:
     211    case CLOCK_PROCESS_CPUTIME:
     212    case CLOCK_THREAD_CPUTIME:
     213      if ( res ) {
     214        res->tv_sec  = _TOD_Microseconds_per_tick / TOD_MICROSECONDS_PER_SECOND;
     215        res->tv_nsec =
     216          (_TOD_Microseconds_per_tick % TOD_MICROSECONDS_PER_SECOND) *
     217            TOD_NANOSECONDS_PER_MICROSECOND;
     218      }
     219      break;
     220 
     221    default:
     222      errno = EINVAL;
     223      return -1;
     224 
     225  }
     226  return 0;
    93227}
    94228
     
    163297)
    164298{
    165   return POSIX_NOT_IMPLEMENTED();
     299  Watchdog_Interval ticks;
     300
     301/* XXX this is interruptible by a posix signal */
     302
     303/* XXX rmtp is the time remaining on the timer -- we do not support this */
     304
     305/* XXX rmtp may be NULL */
     306
     307  ticks = _POSIX_Time_Spec_to_interval( rqtp );
     308 
     309  _Thread_Disable_dispatch();
     310    _Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_TIME );
     311    _Watchdog_Initialize(
     312      &_Thread_Executing->Timer,
     313      _Thread_Delay_ended,          /* XXX may need to be POSIX specific */
     314      _Thread_Executing->Object.id,
     315      NULL
     316    );
     317    _Watchdog_Insert_ticks( &_Thread_Executing->Timer, ticks );
     318  _Thread_Enable_dispatch();
     319  return 0;                    /* XXX should account for signal/remaining */
     320
    166321}
    167322
Note: See TracChangeset for help on using the changeset viewer.