aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJason Rumney <[email protected]>2007-06-14 15:58:13 +0000
committerJason Rumney <[email protected]>2007-06-14 15:58:13 +0000
commit74258518069d18525237fc0f3dcf33ffa3fd65e9 (patch)
tree2da4ed4af277a95924ab50263dc5184aa31b6866 /src
parent553d31640139f393e80dd411fe2b07509d47bd5b (diff)
(get_process_times_fn): New function pointer.
(globals_of_w32): Intialize it if present in kernel32.dll. (w32_get_internal_run_time): New function.
Diffstat (limited to 'src')
-rw-r--r--src/w32.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/w32.c b/src/w32.c
index 6d4e968b3c..2d52b84af4 100644
--- a/src/w32.c
+++ b/src/w32.c
@@ -137,6 +137,15 @@ typedef BOOL (WINAPI * GetTokenInformation_Proc) (
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 @@ is_windows_9x ()
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 @@ BOOL WINAPI shutdown_handler(DWORD type)
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;