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