diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c index fea63e38c9f..8bc3ff8ad03 100644 --- a/dlls/ntdll/nt.c +++ b/dlls/ntdll/nt.c @@ -683,7 +683,7 @@ NTSTATUS WINAPI NtQuerySystemInformation( memset(&sti, 0 , sizeof(sti)); /* liKeSystemTime, liExpTimeZoneBias, uCurrentTimeZoneId */ - RtlSecondsSince1970ToTime( server_start_time, &sti.liKeBootTime ); + NTDLL_from_server_abstime( &sti.liKeBootTime, &server_start_time ); if (Length <= sizeof(sti)) { diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index 02320868334..03110a43d61 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -54,7 +54,7 @@ extern void virtual_init(void); extern void virtual_init_threading(void); /* server support */ -extern time_t server_start_time; +extern abs_time_t server_start_time; extern void server_init_process(void); extern size_t server_init_thread( int unix_pid, int unix_tid, void *entry_point ); extern void DECLSPEC_NORETURN server_protocol_error( const char *err, ... ); diff --git a/dlls/ntdll/server.c b/dlls/ntdll/server.c index d6d18e003a6..841604a231e 100644 --- a/dlls/ntdll/server.c +++ b/dlls/ntdll/server.c @@ -85,7 +85,7 @@ struct cmsg_fd }; #endif /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */ -time_t server_start_time = 0; /* time of server startup */ +abs_time_t server_start_time = { 0, 0 }; /* time of server startup */ extern struct wine_pthread_functions pthread_functions; diff --git a/dlls/ntdll/time.c b/dlls/ntdll/time.c index e83da7684ca..54d4adcf6e4 100644 --- a/dlls/ntdll/time.c +++ b/dlls/ntdll/time.c @@ -874,7 +874,8 @@ NTSTATUS WINAPI NtQueryPerformanceCounter( PLARGE_INTEGER Counter, PLARGE_INTEGE * to one of 1.193182 MHz, with some care for arithmetic * overflow ( will not overflow for 5000 years ) and * good accuracy ( 105/88 = 1.19318182) */ - Counter->QuadPart = (((now.tv_sec - server_start_time) * (ULONGLONG)1000000 + now.tv_usec) * 105) / 88; + Counter->QuadPart = (((now.tv_sec - server_start_time.sec) * (ULONGLONG)1000000 + + (now.tv_usec - server_start_time.usec)) * 105) / 88; if (Frequency) Frequency->QuadPart = 1193182; return STATUS_SUCCESS; } @@ -889,7 +890,8 @@ ULONG WINAPI NtGetTickCount(void) struct timeval current_time; gettimeofday(¤t_time, NULL); - return (current_time.tv_sec - server_start_time)*1000 + current_time.tv_usec/1000; + return (current_time.tv_sec - server_start_time.sec) * 1000 + + (current_time.tv_usec - server_start_time.usec) / 1000; } diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index 1c128e23678..15b18cdc6e6 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -299,7 +299,7 @@ struct init_thread_reply process_id_t pid; thread_id_t tid; data_size_t info_size; - time_t server_start; + abs_time_t server_start; int version; }; @@ -4385,6 +4385,6 @@ union generic_reply struct query_symlink_reply query_symlink_reply; }; -#define SERVER_PROTOCOL_VERSION 242 +#define SERVER_PROTOCOL_VERSION 243 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */ diff --git a/server/object.h b/server/object.h index 46b34e13651..1a75e4c7301 100644 --- a/server/object.h +++ b/server/object.h @@ -213,6 +213,6 @@ extern int foreground; extern const char *server_argv0; /* server start time used for GetTickCount() */ -extern time_t server_start_time; +extern struct timeval server_start_time; #endif /* __WINE_SERVER_OBJECT_H */ diff --git a/server/protocol.def b/server/protocol.def index 6910ed47886..e64cf437f01 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -284,7 +284,7 @@ struct token_groups process_id_t pid; /* process id of the new thread's process */ thread_id_t tid; /* thread id of the new thread */ data_size_t info_size; /* total size of startup info */ - time_t server_start; /* server start time */ + abs_time_t server_start; /* server start time */ int version; /* protocol version */ @END diff --git a/server/request.c b/server/request.c index 6fc7fcb94cd..d0e1a88278c 100644 --- a/server/request.c +++ b/server/request.c @@ -114,7 +114,7 @@ static const struct fd_ops master_socket_fd_ops = struct thread *current = NULL; /* thread handling the current request */ unsigned int global_error = 0; /* global error code for when no thread is current */ -time_t server_start_time = 0; /* server startup time */ +struct timeval server_start_time = { 0, 0 }; /* server startup time */ static struct master_socket *master_socket; /* the master socket object */ @@ -465,7 +465,8 @@ unsigned int get_tick_count(void) { struct timeval t; gettimeofday( &t, NULL ); - return ((t.tv_sec - server_start_time) * 1000) + (t.tv_usec / 1000); + return ((t.tv_sec - server_start_time.tv_sec) * 1000) + + ((t.tv_usec - server_start_time.tv_usec) / 1000); } static void master_socket_dump( struct object *obj, int verbose ) @@ -798,7 +799,7 @@ void open_master_socket(void) msghdr.msg_iovlen = 1; /* init startup time */ - server_start_time = time(NULL); + gettimeofday( &server_start_time, NULL ); } /* master socket timer expiration handler */ diff --git a/server/thread.c b/server/thread.c index 23508d3e416..feb3259d0a1 100644 --- a/server/thread.c +++ b/server/thread.c @@ -889,7 +889,8 @@ DECL_HANDLER(init_thread) reply->pid = get_process_id( process ); reply->tid = get_thread_id( current ); reply->version = SERVER_PROTOCOL_VERSION; - reply->server_start = server_start_time; + reply->server_start.sec = server_start_time.tv_sec; + reply->server_start.usec = server_start_time.tv_usec; return; error: diff --git a/server/trace.c b/server/trace.c index ee3db8b84b1..574943a9b89 100644 --- a/server/trace.c +++ b/server/trace.c @@ -697,7 +697,9 @@ static void dump_init_thread_reply( const struct init_thread_reply *req ) fprintf( stderr, " pid=%04x,", req->pid ); fprintf( stderr, " tid=%04x,", req->tid ); fprintf( stderr, " info_size=%u,", req->info_size ); - fprintf( stderr, " server_start=%ld,", (long)req->server_start ); + fprintf( stderr, " server_start=" ); + dump_abs_time( &req->server_start ); + fprintf( stderr, "," ); fprintf( stderr, " version=%d", req->version ); }