Changeset 5865 for pjproject/trunk/pjlib/src/pj/os_timestamp_posix.c
- Timestamp:
- Aug 23, 2018 4:42:29 AM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjlib/src/pj/os_timestamp_posix.c
r5574 r5865 122 122 123 123 #elif defined(PJ_DARWINOS) && PJ_DARWINOS != 0 124 #include <mach/mach.h> 125 #include <mach/clock.h> 126 #include <errno.h> 124 125 /* SYSTEM_CLOCK will stop when the device is in deep sleep, so we use 126 * KERN_BOOTTIME instead. 127 * See ticket #2140 for more details. 128 */ 129 #define USE_KERN_BOOTTIME 1 130 131 #if USE_KERN_BOOTTIME 132 # include <sys/sysctl.h> 133 #else 134 # include <mach/mach.h> 135 # include <mach/clock.h> 136 # include <errno.h> 137 #endif 127 138 128 139 #ifndef NSEC_PER_SEC … … 130 141 #endif 131 142 132 PJ_DEF(pj_status_t) pj_get_timestamp(pj_timestamp *ts) 133 { 143 #if USE_KERN_BOOTTIME 144 static int64_t get_boottime() 145 { 146 struct timeval boottime; 147 int mib[2] = {CTL_KERN, KERN_BOOTTIME}; 148 size_t size = sizeof(boottime); 149 int rc; 150 151 rc = sysctl(mib, 2, &boottime, &size, NULL, 0); 152 if (rc != 0) 153 return 0; 154 155 return (int64_t)boottime.tv_sec * 1000000 + (int64_t)boottime.tv_usec; 156 } 157 #endif 158 159 PJ_DEF(pj_status_t) pj_get_timestamp(pj_timestamp *ts) 160 { 161 #if USE_KERN_BOOTTIME 162 int64_t before_now, after_now; 163 struct timeval now; 164 165 after_now = get_boottime(); 166 do { 167 before_now = after_now; 168 gettimeofday(&now, NULL); 169 after_now = get_boottime(); 170 } while (after_now != before_now); 171 172 ts->u64 = (int64_t)now.tv_sec * 1000000 + (int64_t)now.tv_usec; 173 ts->u64 -= before_now; 174 ts->u64 *= 1000; 175 #else 134 176 mach_timespec_t tp; 135 177 int ret; … … 149 191 ts->u64 *= NSEC_PER_SEC; 150 192 ts->u64 += tp.tv_nsec; 193 #endif 151 194 152 195 return PJ_SUCCESS;
Note: See TracChangeset
for help on using the changeset viewer.