Go to the documentation of this file.00001
00010
00011
00012
00013
00014 #include "../../include/ecl/time_lite/functions_pos.hpp"
00015 #include <errno.h>
00016
00017
00018
00019
00020
00021 #if defined(ECL_HAS_POSIX_TIMERS)
00022
00023
00024
00025
00026
00027 namespace ecl {
00028
00029 TimeError epoch_time(TimeStructure &time) {
00030 struct timeval tv;
00031 int result = gettimeofday(&tv, NULL);
00032 if ( result == 0 ) {
00033 time.tv_sec = tv.tv_sec;
00034 time.tv_nsec = tv.tv_usec*1000;
00035 return TimeError(NoError);
00036 } else {
00037 switch (errno) {
00038 case(EFAULT) : { return TimeError(MemoryError); }
00039 case(EINVAL) : { return TimeError(ArgNotSupportedError); }
00040 default : { return TimeError(UnknownError); }
00041 }
00042 }
00043 }
00044 TimeError sleep_until(const TimeStructure &time) {
00045 TimeStructure current_time, sleep_time;
00046
00047 TimeError error = epoch_time(current_time);
00048 if ( error.flag() != NoError ) { return error; }
00049
00050
00051
00052
00053 if ( current_time.tv_sec > time.tv_sec ) {
00054 return TimeError(NoError);
00055 } else if ( current_time.tv_sec == time.tv_sec ) {
00056 if ( current_time.tv_nsec > time.tv_nsec ) {
00057 return TimeError(NoError);
00058 }
00059 }
00060 sleep_time.tv_sec = time.tv_sec - current_time.tv_sec;
00061 if ( current_time.tv_nsec <= time.tv_nsec ) {
00062 sleep_time.tv_nsec = time.tv_nsec - current_time.tv_nsec;
00063 } else {
00064 sleep_time.tv_sec -= 1;
00065 sleep_time.tv_nsec = 1000000000L - current_time.tv_nsec + time.tv_nsec;
00066 }
00067 int result = nanosleep(&sleep_time, NULL);
00068 switch (result) {
00069 case(0) : { return TimeError(NoError); }
00070 case(EFAULT) : { return TimeError(MemoryError); }
00071 case(EINTR) : { return TimeError(InterruptedError); }
00072 case(EINVAL) : { return TimeError(OutOfRangeError); }
00073 default : { return TimeError(UnknownError); }
00074 }
00075 }
00076 TimeError sleep(const TimeStructure &time) {
00077 int result = nanosleep(&time, NULL);
00078 switch (result) {
00079 case(0) : { return TimeError(NoError); }
00080 case(EFAULT) : { return TimeError(MemoryError); }
00081 case(EINTR) : { return TimeError(InterruptedError); }
00082 case(EINVAL) : { return TimeError(OutOfRangeError); }
00083 default : { return TimeError(UnknownError); }
00084 }
00085 }
00086
00087 }
00088
00089 #endif