# HG changeset patch # User Jason Rumney # Date 1181836693 0 # Node ID 5e608f6f217b025a7300bc773a63c8ba39d8a4a4 # Parent 5c330f38b4c557f324cdad2ec2817ef8f1260236 (get_process_times_fn): New function pointer. (globals_of_w32): Intialize it if present in kernel32.dll. (w32_get_internal_run_time): New function. diff -r 5c330f38b4c5 -r 5e608f6f217b src/w32.c --- a/src/w32.c Thu Jun 14 12:33:56 2007 +0000 +++ b/src/w32.c Thu Jun 14 15:58:13 2007 +0000 @@ -137,6 +137,15 @@ LPVOID TokenInformation, DWORD TokenInformationLength, PDWORD ReturnLength); +typedef BOOL (WINAPI * GetProcessTimes_Proc) ( + HANDLE process_handle, + LPFILETIME creation_time, + LPFILETIME exit_time, + LPFILETIME kernel_time, + LPFILETIME user_time); + +GetProcessTimes_Proc get_process_times_fn = NULL; + #ifdef _UNICODE const char * const LookupAccountSid_Name = "LookupAccountSidW"; #else @@ -172,6 +181,46 @@ return s_b_ret; } +/* Get total user and system times for get-internal-run-time. + Returns a list of three integers if the times are provided by the OS + (NT derivatives), otherwise it returns the result of current-time. */ +Lisp_Object +w32_get_internal_run_time () +{ + if (get_process_times_fn) + { + FILETIME create, exit, kernel, user; + HANDLE proc = GetCurrentProcess(); + if ((*get_process_times_fn) (proc, &create, &exit, &kernel, &user)) + { + LARGE_INTEGER user_int, kernel_int, total; + int microseconds; + user_int.LowPart = user.dwLowDateTime; + user_int.HighPart = user.dwHighDateTime; + kernel_int.LowPart = kernel.dwLowDateTime; + kernel_int.HighPart = kernel.dwHighDateTime; + total.QuadPart = user_int.QuadPart + kernel_int.QuadPart; + /* FILETIME is 100 nanosecond increments, Emacs only wants + microsecond resolution. */ + total.QuadPart /= 10; + microseconds = total.QuadPart % 1000000; + total.QuadPart /= 1000000; + + /* Sanity check to make sure we can represent the result. */ + if (total.HighPart == 0) + { + int secs = total.LowPart; + + return list3 (make_number ((secs >> 16) & 0xffff), + make_number (secs & 0xffff), + make_number (microseconds)); + } + } + } + + return Fcurrent_time (); +} + /* ** The wrapper functions ** */ BOOL WINAPI open_process_token ( @@ -4144,6 +4193,11 @@ void globals_of_w32 () { + HMODULE kernel32 = GetModuleHandle ("kernel32.dll"); + + get_process_times_fn = (GetProcessTimes_Proc) + GetProcAddress (kernel32, "GetProcessTimes"); + g_b_init_is_windows_9x = 0; g_b_init_open_process_token = 0; g_b_init_get_token_information = 0;