APR_DECLARE(apr_status_t) apr_os_imp_time_put(apr_time_t *aprtime, apr_os_imp_time_t **ostime, apr_pool_t *cont) { /* XXX: sanity failure, what is file time, gmt or local ? */ FileTimeToAprTime(aprtime, *ostime); return APR_SUCCESS; }
/* Return micro-seconds since the Unix epoch (jan. 1, 1970) UTC */ APR_DECLARE(apr_time_t) apr_time_now(void) { LONGLONG aprtime = 0; FILETIME time; #ifndef _WIN32_WCE GetSystemTimeAsFileTime(&time); #else SYSTEMTIME st; GetSystemTime(&st); SystemTimeToFileTime(&st, &time); #endif FileTimeToAprTime(&aprtime, &time); return aprtime; }
APR_DECLARE(apr_status_t) apr_time_exp_lt(apr_time_exp_t *result, apr_time_t input) { SYSTEMTIME st; FILETIME ft, localft; AprTimeToFileTime(&ft, input); #if APR_HAS_UNICODE_FS && !defined(_WIN32_WCE) IF_WIN_OS_IS_UNICODE { TIME_ZONE_INFORMATION *tz; SYSTEMTIME localst; apr_time_t localtime; get_local_timezone(&tz); FileTimeToSystemTime(&ft, &st); /* The Platform SDK documents that SYSTEMTIME/FILETIME are * generally UTC. We use SystemTimeToTzSpecificLocalTime * because FileTimeToLocalFileFime is documented that the * resulting time local file time would have DST relative * to the *present* date, not the date converted. */ SystemTimeToTzSpecificLocalTime(tz, &st, &localst); SystemTimeToAprExpTime(result, &localst); result->tm_usec = (apr_int32_t) (input % APR_USEC_PER_SEC); /* Recover the resulting time as an apr time and use the * delta for gmtoff in seconds (and ignore msec rounding) */ SystemTimeToFileTime(&localst, &localft); FileTimeToAprTime(&localtime, &localft); result->tm_gmtoff = (int)apr_time_sec(localtime) - (int)apr_time_sec(input); /* To compute the dst flag, we compare the expected * local (standard) timezone bias to the delta. * [Note, in war time or double daylight time the * resulting tm_isdst is, desireably, 2 hours] */ result->tm_isdst = (result->tm_gmtoff / 3600) - (-(tz->Bias + tz->StandardBias) / 60); } #endif #if APR_HAS_ANSI_FS || defined(_WIN32_WCE) ELSE_WIN_OS_IS_ANSI { TIME_ZONE_INFORMATION tz; /* XXX: This code is simply *wrong*. The time converted will always * map to the *now current* status of daylight savings time. */ FileTimeToLocalFileTime(&ft, &localft); FileTimeToSystemTime(&localft, &st); SystemTimeToAprExpTime(result, &st); result->tm_usec = (apr_int32_t) (input % APR_USEC_PER_SEC); switch (GetTimeZoneInformation(&tz)) { case TIME_ZONE_ID_UNKNOWN: result->tm_isdst = 0; /* Bias = UTC - local time in minutes * tm_gmtoff is seconds east of UTC */ result->tm_gmtoff = tz.Bias * -60; break; case TIME_ZONE_ID_STANDARD: result->tm_isdst = 0; result->tm_gmtoff = (tz.Bias + tz.StandardBias) * -60; break; case TIME_ZONE_ID_DAYLIGHT: result->tm_isdst = 1; result->tm_gmtoff = (tz.Bias + tz.DaylightBias) * -60; break; default: /* noop */; } } #endif return APR_SUCCESS; }
TCN_IMPLEMENT_CALL(jint, OS, info)(TCN_STDARGS, jlongArray inf) { MEMORYSTATUSEX ms; ULONGLONG st[4]; FILETIME ft[4]; PROCESS_MEMORY_COUNTERS pmc; jint rv; int i; jsize ilen = (*e)->GetArrayLength(e, inf); jlong *pvals = (*e)->GetLongArrayElements(e, inf, NULL); if (ilen < 16) { return APR_EINVAL; } for (i = 0; i < 16; i++) pvals[i] = 0; ms.dwLength = sizeof(MEMORYSTATUSEX); UNREFERENCED(o); if (GlobalMemoryStatusEx(&ms)) { pvals[0] = (jlong)ms.ullTotalPhys; pvals[1] = (jlong)ms.ullAvailPhys; pvals[2] = (jlong)ms.ullTotalPageFile; pvals[3] = (jlong)ms.ullAvailPageFile; /* Slots 4 and 5 are for shared memory */ pvals[6] = (jlong)ms.dwMemoryLoad; } else goto cleanup; memset(st, 0, sizeof(st)); if (fnGetSystemTimes) { if ((*fnGetSystemTimes)(&ft[0], &ft[1], &ft[2])) { st[0] = (((ULONGLONG)ft[0].dwHighDateTime << 32) | ft[0].dwLowDateTime) / 10; st[1] = (((ULONGLONG)ft[1].dwHighDateTime << 32) | ft[1].dwLowDateTime) / 10; st[2] = (((ULONGLONG)ft[2].dwHighDateTime << 32) | ft[2].dwLowDateTime) / 10; } else goto cleanup; } #if (_WIN32_WINNT < 0x0501) else if (fnNtQuerySystemInformation) { BYTE buf[2048]; /* This should ne enough for 32 processors */ NTSTATUS rs = (*fnNtQuerySystemInformation)(SystemProcessorPerformanceInformation, (LPVOID)buf, 2048, NULL); if (rs == 0) { PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION pspi = (PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)&buf[0]; DWORD i; /* Calculate all processors */ for (i = 0; i < dll_system_info.dwNumberOfProcessors; i++) { st[0] += pspi[i].IdleTime.QuadPart / 10; st[1] += pspi[i].KernelTime.QuadPart / 10; st[2] += pspi[i].UserTime.QuadPart / 10; } } else goto cleanup; } #endif pvals[7] = st[0]; pvals[8] = st[1]; pvals[9] = st[2]; memset(st, 0, sizeof(st)); if (GetProcessTimes(GetCurrentProcess(), &ft[0], &ft[1], &ft[2], &ft[3])) { FileTimeToAprTime((apr_time_t *)&st[0], &ft[0]); st[1] = (((ULONGLONG)ft[2].dwHighDateTime << 32) | ft[2].dwLowDateTime) / 10; st[2] = (((ULONGLONG)ft[3].dwHighDateTime << 32) | ft[3].dwLowDateTime) / 10; } pvals[10] = st[0]; pvals[11] = st[1]; pvals[12] = st[2]; if (GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc))) { pvals[13] = pmc.WorkingSetSize; pvals[14] = pmc.PeakWorkingSetSize; pvals[15] = pmc.PageFaultCount; } (*e)->ReleaseLongArrayElements(e, inf, pvals, 0); return APR_SUCCESS; cleanup: rv = apr_get_os_error(); (*e)->ReleaseLongArrayElements(e, inf, pvals, 0); return rv; }