Changeset 5600661 in rtems
- Timestamp:
- 05/30/96 20:48:10 (27 years ago)
- Branches:
- 4.10, 4.11, 4.8, 4.9, 5, master
- Children:
- 7c55e06
- Parents:
- b169590e
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
c/src/exec/posix/src/psignal.c
rb169590e r5600661 245 245 ) 246 246 { 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
rb169590e r5600661 3 3 */ 4 4 5 #include <assert.h> 5 6 #include <time.h> 7 #include <errno.h> 6 8 7 9 #include <rtems/system.h> 10 #include <rtems/score/isr.h> 11 #include <rtems/score/thread.h> 8 12 #include <rtems/score/tod.h> 9 13 … … 25 29 ) 26 30 { 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; 28 40 } 29 41 … … 39 51 40 52 if ( !_TOD_Is_set() ) { 41 /* XXX set errno */53 errno = EINVAL; 42 54 return -1; 43 55 } … … 66 78 ) 67 79 { 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; 69 140 } 70 141 … … 78 149 ) 79 150 { 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; 81 193 } 82 194 … … 90 202 ) 91 203 { 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; 93 227 } 94 228 … … 163 297 ) 164 298 { 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 166 321 } 167 322 -
cpukit/posix/src/psignal.c
rb169590e r5600661 245 245 ) 246 246 { 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
rb169590e r5600661 3 3 */ 4 4 5 #include <assert.h> 5 6 #include <time.h> 7 #include <errno.h> 6 8 7 9 #include <rtems/system.h> 10 #include <rtems/score/isr.h> 11 #include <rtems/score/thread.h> 8 12 #include <rtems/score/tod.h> 9 13 … … 25 29 ) 26 30 { 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; 28 40 } 29 41 … … 39 51 40 52 if ( !_TOD_Is_set() ) { 41 /* XXX set errno */53 errno = EINVAL; 42 54 return -1; 43 55 } … … 66 78 ) 67 79 { 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; 69 140 } 70 141 … … 78 149 ) 79 150 { 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; 81 193 } 82 194 … … 90 202 ) 91 203 { 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; 93 227 } 94 228 … … 163 297 ) 164 298 { 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 166 321 } 167 322
Note: See TracChangeset
for help on using the changeset viewer.