Alexandre Julliard : kernel32: Move GetProcessTimes() implementation to kernelbase and ntdll.
Alexandre Julliard
julliard at winehq.org
Fri May 22 13:51:09 CDT 2020
Module: wine
Branch: master
Commit: 7cc9ccbd22511d71d23ee298cd9718da1e448dbc
URL: https://source.winehq.org/git/wine.git/?a=commit;h=7cc9ccbd22511d71d23ee298cd9718da1e448dbc
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri May 22 09:15:39 2020 +0200
kernel32: Move GetProcessTimes() implementation to kernelbase and ntdll.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/kernel32/kernel32.spec | 2 +-
dlls/kernel32/time.c | 64 -----------------------------------------
dlls/kernelbase/kernelbase.spec | 2 +-
dlls/kernelbase/process.c | 23 +++++++++++++++
dlls/ntdll/process.c | 19 ++++++++++--
5 files changed, 41 insertions(+), 69 deletions(-)
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index 659f72cf78..efb892bf1b 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -791,7 +791,7 @@
@ stdcall -import GetProcessPriorityBoost(long ptr)
@ stdcall -import GetProcessShutdownParameters(ptr ptr)
# @ stub GetProcessorSystemCycleTime
-@ stdcall GetProcessTimes(long ptr ptr ptr ptr)
+@ stdcall -import GetProcessTimes(long ptr ptr ptr ptr)
# @ stub GetProcessUserModeExceptionPolicy
@ stdcall GetProcessVersion(long)
@ stdcall GetProcessWorkingSetSize(long ptr ptr)
diff --git a/dlls/kernel32/time.c b/dlls/kernel32/time.c
index 5d27fc7ac3..5aef53da63 100644
--- a/dlls/kernel32/time.c
+++ b/dlls/kernel32/time.c
@@ -55,12 +55,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(time);
static const struct _KUSER_SHARED_DATA *user_shared_data = (struct _KUSER_SHARED_DATA *)0x7ffe0000;
-static inline void longlong_to_filetime( LONGLONG t, FILETIME *ft )
-{
- ft->dwLowDateTime = (DWORD)t;
- ft->dwHighDateTime = (DWORD)(t >> 32);
-}
-
/***********************************************************************
* GetSystemTimeAdjustment (KERNEL32.@)
@@ -109,64 +103,6 @@ BOOL WINAPI SetSystemTimeAdjustment( DWORD dwTimeAdjustment, BOOL bTimeAdjustmen
return TRUE;
}
-/*********************************************************************
- * TIME_ClockTimeToFileTime (olorin at fandra.org, 20-Sep-1998)
- *
- * Used by GetProcessTimes to convert clock_t into FILETIME.
- *
- * Differences to UnixTimeToFileTime:
- * 1) Divided by CLK_TCK
- * 2) Time is relative. There is no 'starting date', so there is
- * no need for offset correction, like in UnixTimeToFileTime
- */
-static void TIME_ClockTimeToFileTime(clock_t unix_time, LPFILETIME filetime)
-{
- long clocksPerSec = sysconf(_SC_CLK_TCK);
- ULONGLONG secs = (ULONGLONG)unix_time * 10000000 / clocksPerSec;
- filetime->dwLowDateTime = (DWORD)secs;
- filetime->dwHighDateTime = (DWORD)(secs >> 32);
-}
-
-/*********************************************************************
- * GetProcessTimes (KERNEL32.@)
- *
- * Get the user and kernel execution times of a process,
- * along with the creation and exit times if known.
- *
- * PARAMS
- * hprocess [in] The process to be queried.
- * lpCreationTime [out] The creation time of the process.
- * lpExitTime [out] The exit time of the process if exited.
- * lpKernelTime [out] The time spent in kernel routines in 100's of nanoseconds.
- * lpUserTime [out] The time spent in user routines in 100's of nanoseconds.
- *
- * RETURNS
- * TRUE.
- *
- * NOTES
- * olorin at fandra.org:
- * Would be nice to subtract the cpu time used by Wine at startup.
- * Also, there is a need to separate times used by different applications.
- *
- * BUGS
- * KernelTime and UserTime are always for the current process
- */
-BOOL WINAPI GetProcessTimes( HANDLE hprocess, LPFILETIME lpCreationTime,
- LPFILETIME lpExitTime, LPFILETIME lpKernelTime, LPFILETIME lpUserTime )
-{
- struct tms tms;
- KERNEL_USER_TIMES pti;
-
- times(&tms);
- TIME_ClockTimeToFileTime(tms.tms_utime,lpUserTime);
- TIME_ClockTimeToFileTime(tms.tms_stime,lpKernelTime);
- if (NtQueryInformationProcess( hprocess, ProcessTimes, &pti, sizeof(pti), NULL))
- return FALSE;
- longlong_to_filetime( pti.CreateTime.QuadPart, lpCreationTime );
- longlong_to_filetime( pti.ExitTime.QuadPart, lpExitTime );
- return TRUE;
-}
-
/*********************************************************************
* GetCalendarInfoA (KERNEL32.@)
*
diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec
index 1f1a65fc85..4a6bc5eea4 100644
--- a/dlls/kernelbase/kernelbase.spec
+++ b/dlls/kernelbase/kernelbase.spec
@@ -635,7 +635,7 @@
@ stdcall GetProcessPreferredUILanguages(long ptr ptr ptr) kernel32.GetProcessPreferredUILanguages
@ stdcall GetProcessPriorityBoost(long ptr)
@ stdcall GetProcessShutdownParameters(ptr ptr)
-@ stdcall GetProcessTimes(long ptr ptr ptr ptr) kernel32.GetProcessTimes
+@ stdcall GetProcessTimes(long ptr ptr ptr ptr)
@ stdcall GetProcessVersion(long) kernel32.GetProcessVersion
@ stdcall GetProcessWorkingSetSizeEx(long ptr ptr ptr)
# @ stub GetProcessorSystemCycleTime
diff --git a/dlls/kernelbase/process.c b/dlls/kernelbase/process.c
index 67fcb5f04e..66e115ce69 100644
--- a/dlls/kernelbase/process.c
+++ b/dlls/kernelbase/process.c
@@ -791,6 +791,29 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetProcessShutdownParameters( LPDWORD level, LPDWO
}
+/*********************************************************************
+ * GetProcessTimes (kernelbase.@)
+ */
+BOOL WINAPI DECLSPEC_HOTPATCH GetProcessTimes( HANDLE process, FILETIME *create, FILETIME *exit,
+ FILETIME *kernel, FILETIME *user )
+{
+ KERNEL_USER_TIMES time;
+
+ if (!set_ntstatus( NtQueryInformationProcess( process, ProcessTimes, &time, sizeof(time), NULL )))
+ return FALSE;
+
+ create->dwLowDateTime = time.CreateTime.u.LowPart;
+ create->dwHighDateTime = time.CreateTime.u.HighPart;
+ exit->dwLowDateTime = time.ExitTime.u.LowPart;
+ exit->dwHighDateTime = time.ExitTime.u.HighPart;
+ kernel->dwLowDateTime = time.KernelTime.u.LowPart;
+ kernel->dwHighDateTime = time.KernelTime.u.HighPart;
+ user->dwLowDateTime = time.UserTime.u.LowPart;
+ user->dwHighDateTime = time.UserTime.u.HighPart;
+ return TRUE;
+}
+
+
/***********************************************************************
* GetProcessWorkingSetSizeEx (kernelbase.@)
*/
diff --git a/dlls/ntdll/process.c b/dlls/ntdll/process.c
index cd867e6028..637bef0b65 100644
--- a/dlls/ntdll/process.c
+++ b/dlls/ntdll/process.c
@@ -32,6 +32,12 @@
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_TIMES_H
+# include <sys/times.h>
+#endif
#include <sys/types.h>
#ifdef HAVE_SYS_WAIT_H
# include <sys/wait.h>
@@ -359,7 +365,7 @@ NTSTATUS WINAPI NtQueryInformationProcess(
break;
case ProcessTimes:
{
- KERNEL_USER_TIMES pti;
+ KERNEL_USER_TIMES pti = {{{0}}};
if (ProcessInformationLength >= sizeof(KERNEL_USER_TIMES))
{
@@ -369,8 +375,15 @@ NTSTATUS WINAPI NtQueryInformationProcess(
ret = STATUS_INVALID_HANDLE;
else
{
- /* FIXME : User- and KernelTime have to be implemented */
- memset(&pti, 0, sizeof(KERNEL_USER_TIMES));
+ long ticks = sysconf(_SC_CLK_TCK);
+ struct tms tms;
+
+ /* FIXME: user/kernel times only work for current process */
+ if (ticks && times( &tms ) != -1)
+ {
+ pti.UserTime.QuadPart = (ULONGLONG)tms.tms_utime * 10000000 / ticks;
+ pti.KernelTime.QuadPart = (ULONGLONG)tms.tms_stime * 10000000 / ticks;
+ }
SERVER_START_REQ(get_process_info)
{
More information about the wine-cvs
mailing list