const void *FakeSMCKey::getValue() { if (handler) { mach_timespec_t now, end; end.tv_sec = lastUpdated.tv_sec; end.tv_nsec = lastUpdated.tv_nsec; now.tv_sec = 1; now.tv_nsec = 0; ADD_MACH_TIMESPEC(&end, &now); clock_get_system_nanotime((clock_sec_t*)&now.tv_sec, (clock_nsec_t*)&now.tv_nsec); if (CMP_MACH_TIMESPEC(&end, &now) < 0) { IOReturn result = handler->callPlatformFunction(kFakeSMCGetValueCallback, false, (void *)key, (void *)value, (void *)size, 0); if (kIOReturnSuccess == result) clock_get_system_nanotime((clock_sec_t*)&lastUpdated.tv_sec, (clock_nsec_t*)&lastUpdated.tv_nsec); else HWSensorsWarningLog("value update request callback error for key %s, return 0x%x", key, result); } } return value; };
float PTIDSensors::readTachometer(UInt32 index) { mach_timespec_t now; clock_get_system_nanotime((clock_sec_t*)&now.tv_sec, (clock_nsec_t*)&now.tv_nsec); if (CMP_MACH_TIMESPEC(&tachometerNextUpdate, &now) <= 0) { mach_timespec_t next; tachometerNextUpdate.tv_sec = now.tv_sec; tachometerNextUpdate.tv_nsec = now.tv_nsec; next.tv_sec = 1; next.tv_nsec = 0; ADD_MACH_TIMESPEC(&tachometerNextUpdate, &next); updateTachometers(); } if (tachometers) { if (OSNumber *number = OSDynamicCast(OSNumber, tachometers->getObject(index))) { UInt64 value = number->unsigned32BitValue(); return (value == 0x80000000) ? 0 : (float)value; } } return 0; }
/** * __i2c_transfer - unlocked flavor of i2c_transfer * @adap: Handle to I2C bus * @msgs: One or more messages to execute before STOP is issued to * terminate the operation; each message begins with a START. * @num: Number of messages to be executed. * * Returns negative errno, else the number of messages executed. * * Adapter lock must be held when calling this function. No debug logging * takes place. adap->algo->master_xfer existence isn't checked. */ int __i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) { int ret, try1; /* Retry automatically on arbitration loss */ mach_timespec_t end, now; clock_get_system_nanotime((clock_sec_t*)&end.tv_sec, (clock_usec_t*)&end.tv_nsec); now.tv_sec = 0; now.tv_nsec = adap->timeout * NSEC_PER_USEC; ADD_MACH_TIMESPEC(&end, &now); for (ret = 0, try1 = 0; try1 <= adap->retries; try1++) { ret = adap->algo->master_xfer(adap, msgs, num); IOLog("GeforceSensors: _i2c_transfer=%d\n", ret); if (ret != -EAGAIN) break; clock_get_system_nanotime((clock_sec_t*)&now.tv_sec, (clock_nsec_t*)&now.tv_nsec); if (CMP_MACH_TIMESPEC(&end, &now) <= 0) break; } return ret; }
float INT340EMonitor::readTemperature(UInt32 index) { mach_timespec_t now; clock_get_system_nanotime((clock_sec_t*)&now.tv_sec, (clock_nsec_t*)&now.tv_nsec); if (CMP_MACH_TIMESPEC(&temperatureNextUpdate, &now) <= 0) { mach_timespec_t next; temperatureNextUpdate.tv_sec = now.tv_sec; temperatureNextUpdate.tv_nsec = now.tv_nsec; next.tv_sec = 1; next.tv_nsec = 0; ADD_MACH_TIMESPEC(&temperatureNextUpdate, &next); updateTemperatures(); } if (temperatures) { if (OSNumber *number = OSDynamicCast(OSNumber, temperatures->getObject(index))) { UInt64 value = number->unsigned32BitValue(); return (value == 0x80000000) ? 0 : (float)((value - 0xAAC) / 0xA); } } return 0; }
int nanosleep(const struct timespec *requested_time, struct timespec *remaining_time) { kern_return_t kret; int ret; mach_timespec_t current; mach_timespec_t completion; if (__unix_conforming == 0) __unix_conforming = 1; #ifdef VARIANT_CANCELABLE pthread_testcancel(); #endif /* VARIANT_CANCELABLE */ if ((requested_time == NULL) || (requested_time->tv_sec < 0) || (requested_time->tv_nsec >= NSEC_PER_SEC)) { errno = EINVAL; return -1; } if (remaining_time != NULL) { /* once we add requested_time, this will be the completion time */ kret = clock_get_time(clock_port, &completion); if (kret != KERN_SUCCESS) { fprintf(stderr, "clock_get_time() failed: %s\n", mach_error_string(kret)); errno = EINVAL; return -1; } } ret = SEMWAIT_SIGNAL(clock_sem, MACH_PORT_NULL, 1, 1, (int64_t)requested_time->tv_sec, (int32_t)requested_time->tv_nsec); if (ret < 0) { if (errno == ETIMEDOUT) { return 0; } else if (errno == EINTR) { if (remaining_time != NULL) { ret = clock_get_time(clock_port, ¤t); if (ret != KERN_SUCCESS) { fprintf(stderr, "clock_get_time() failed: %s\n", mach_error_string(ret)); return -1; } /* This depends on the layout of a mach_timespec_t and timespec_t being equivalent */ ADD_MACH_TIMESPEC(&completion, requested_time); /* We have to compare first, since mach_timespect_t contains unsigned integers */ if(CMP_MACH_TIMESPEC(&completion, ¤t) > 0) { SUB_MACH_TIMESPEC(&completion, ¤t); remaining_time->tv_sec = completion.tv_sec; remaining_time->tv_nsec = completion.tv_nsec; } else { bzero(remaining_time, sizeof(*remaining_time)); } } } else { errno = EINVAL; } } return -1; }