Commit 9ad56286 authored by Alexandre Julliard's avatar Alexandre Julliard

Moved the server start time to the init_thread request and got rid of

the init_process request (based on a patch by Felix Nawothnig).
parent ec167634
...@@ -28,6 +28,10 @@ ...@@ -28,6 +28,10 @@
#ifdef HAVE_SYS_STAT_H #ifdef HAVE_SYS_STAT_H
# include <sys/stat.h> # include <sys/stat.h>
#endif #endif
#include <time.h>
#ifdef HAVE_SYS_TIME_H
# include <sys/time.h>
#endif
#include <signal.h> #include <signal.h>
#include "windef.h" #include "windef.h"
...@@ -56,6 +60,8 @@ static CRITICAL_SECTION_DEBUG critsect_debug = ...@@ -56,6 +60,8 @@ static CRITICAL_SECTION_DEBUG critsect_debug =
}; };
static CRITICAL_SECTION ldt_section = { &critsect_debug, -1, 0, 0, 0, 0 }; static CRITICAL_SECTION ldt_section = { &critsect_debug, -1, 0, 0, 0, 0 };
static DWORD server_start_time;
/*********************************************************************** /***********************************************************************
* locking for LDT routines * locking for LDT routines
*/ */
...@@ -102,6 +108,10 @@ static BOOL process_attach(void) ...@@ -102,6 +108,10 @@ static BOOL process_attach(void)
{ {
HMODULE16 hModule; HMODULE16 hModule;
SYSTEM_INFO si; SYSTEM_INFO si;
SYSTEM_TIMEOFDAY_INFORMATION sti;
NtQuerySystemInformation( SystemTimeOfDayInformation, &sti, sizeof(sti), NULL );
RtlTimeToSecondsSince1970( &sti.liKeBootTime, &server_start_time );
/* FIXME: should probably be done in ntdll */ /* FIXME: should probably be done in ntdll */
GetSystemInfo( &si ); GetSystemInfo( &si );
...@@ -263,3 +273,28 @@ INT WINAPI MulDiv( INT nMultiplicand, INT nMultiplier, INT nDivisor) ...@@ -263,3 +273,28 @@ INT WINAPI MulDiv( INT nMultiplicand, INT nMultiplier, INT nDivisor)
if ((ret > 2147483647) || (ret < -2147483647)) return -1; if ((ret > 2147483647) || (ret < -2147483647)) return -1;
return ret; return ret;
} }
/***********************************************************************
* GetSystemMSecCount (SYSTEM.6)
* GetTickCount (KERNEL32.@)
*
* Get the number of milliseconds the system has been running.
*
* PARAMS
* None.
*
* RETURNS
* The current tick count.
*
* NOTES
* -The value returned will wrap arounf every 2^32 milliseconds.
* -Under Windows, tick 0 is the moment at which the system is rebooted.
* Under Wine, tick 0 begins at the moment the wineserver process is started,
*/
DWORD WINAPI GetTickCount(void)
{
struct timeval t;
gettimeofday( &t, NULL );
return ((t.tv_sec - server_start_time) * 1000) + (t.tv_usec / 1000);
}
...@@ -64,7 +64,6 @@ static DWORD shutdown_flags = 0; ...@@ -64,7 +64,6 @@ static DWORD shutdown_flags = 0;
static DWORD shutdown_priority = 0x280; static DWORD shutdown_priority = 0x280;
static DWORD process_dword; static DWORD process_dword;
static unsigned int server_startticks;
int main_create_flags = 0; int main_create_flags = 0;
HMODULE kernel32_handle = 0; HMODULE kernel32_handle = 0;
...@@ -933,7 +932,6 @@ static void init_windows_dirs(void) ...@@ -933,7 +932,6 @@ static void init_windows_dirs(void)
static BOOL process_init(void) static BOOL process_init(void)
{ {
static const WCHAR kernel32W[] = {'k','e','r','n','e','l','3','2',0}; static const WCHAR kernel32W[] = {'k','e','r','n','e','l','3','2',0};
BOOL ret;
PEB *peb = NtCurrentTeb()->Peb; PEB *peb = NtCurrentTeb()->Peb;
RTL_USER_PROCESS_PARAMETERS *params = peb->ProcessParameters; RTL_USER_PROCESS_PARAMETERS *params = peb->ProcessParameters;
extern void __wine_dbg_kernel32_init(void); extern void __wine_dbg_kernel32_init(void);
...@@ -946,17 +944,6 @@ static BOOL process_init(void) ...@@ -946,17 +944,6 @@ static BOOL process_init(void)
setbuf(stderr,NULL); setbuf(stderr,NULL);
setlocale(LC_CTYPE,""); setlocale(LC_CTYPE,"");
/* Retrieve startup info from the server */
SERVER_START_REQ( init_process )
{
if ((ret = !wine_server_call_err( req )))
{
server_startticks = reply->server_start;
}
}
SERVER_END_REQ;
if (!ret) return FALSE;
if (!params->AllocationSize) if (!params->AllocationSize)
{ {
/* This is wine specific: we have no parent (we're started from unix) /* This is wine specific: we have no parent (we're started from unix)
...@@ -2888,31 +2875,6 @@ DWORD WINAPI RegisterServiceProcess(DWORD dwProcessId, DWORD dwType) ...@@ -2888,31 +2875,6 @@ DWORD WINAPI RegisterServiceProcess(DWORD dwProcessId, DWORD dwType)
/*********************************************************************** /***********************************************************************
* GetSystemMSecCount (SYSTEM.6)
* GetTickCount (KERNEL32.@)
*
* Get the number of milliseconds the system has been running.
*
* PARANS
* None.
*
* RETURNS
* The current tick count.
*
* NOTES
* -The value returned will wrap arounf every 2^32 milliseconds.
* -Under Windows, tick 0 is the moment at which the system is rebooted.
* Under Wine, tick 0 begins at the moment the wineserver process is started,
*/
DWORD WINAPI GetTickCount(void)
{
struct timeval t;
gettimeofday( &t, NULL );
return ((t.tv_sec * 1000) + (t.tv_usec / 1000)) - server_startticks;
}
/***********************************************************************
* GetCurrentProcess (KERNEL32.@) * GetCurrentProcess (KERNEL32.@)
* *
* Get a handle to the current process. * Get a handle to the current process.
......
...@@ -36,9 +36,6 @@ ...@@ -36,9 +36,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(ntdll); WINE_DEFAULT_DEBUG_CHANNEL(ntdll);
/* FIXME: fixed at 2005/2/22 */
static LONGLONG boottime = (LONGLONG)1275356510 * 100000000;
/* /*
* Token * Token
*/ */
...@@ -531,33 +528,6 @@ NTSTATUS WINAPI NtSetIntervalProfile( ...@@ -531,33 +528,6 @@ NTSTATUS WINAPI NtSetIntervalProfile(
} }
/****************************************************************************** /******************************************************************************
* NtQueryPerformanceCounter [NTDLL.@]
*
* Note: Windows uses a timer clocked at a multiple of 1193182 Hz. There is a
* good number of applications that crash when the returned frequency is either
* lower or higher then what Windows gives. Also too high counter values are
* reported to give problems.
*/
NTSTATUS WINAPI NtQueryPerformanceCounter(
OUT PLARGE_INTEGER Counter,
OUT PLARGE_INTEGER Frequency)
{
LARGE_INTEGER time;
if (!Counter) return STATUS_ACCESS_VIOLATION;
NtQuerySystemTime( &time );
time.QuadPart -= boottime;
/* convert a counter that increments at a rate of 10 MHz
* to one of 1193182 Hz, with some care for arithmetic
* overflow ( will not overflow until 3396 or so ) and
* good accuracy ( 21/176 = 0.119318182) */
Counter->QuadPart = (time.QuadPart * 21) / 176;
if (Frequency)
Frequency->QuadPart = 1193182;
return 0;
}
/******************************************************************************
* NtQuerySystemInformation [NTDLL.@] * NtQuerySystemInformation [NTDLL.@]
* ZwQuerySystemInformation [NTDLL.@] * ZwQuerySystemInformation [NTDLL.@]
* *
...@@ -657,7 +627,7 @@ NTSTATUS WINAPI NtQuerySystemInformation( ...@@ -657,7 +627,7 @@ NTSTATUS WINAPI NtQuerySystemInformation(
memset(&sti, 0 , sizeof(sti)); memset(&sti, 0 , sizeof(sti));
/* liKeSystemTime, liExpTimeZoneBias, uCurrentTimeZoneId */ /* liKeSystemTime, liExpTimeZoneBias, uCurrentTimeZoneId */
sti.liKeBootTime.QuadPart = boottime; RtlSecondsSince1970ToTime( server_start_time, &sti.liKeBootTime );
if (Length <= sizeof(sti)) if (Length <= sizeof(sti))
{ {
......
...@@ -52,6 +52,7 @@ extern ULONG thread_init(void); ...@@ -52,6 +52,7 @@ extern ULONG thread_init(void);
extern void virtual_init(void); extern void virtual_init(void);
/* server support */ /* server support */
extern time_t server_start_time;
extern void server_init_process(void); extern void server_init_process(void);
extern size_t server_init_thread( int unix_pid, int unix_tid, void *entry_point ); 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, ... ); extern void DECLSPEC_NORETURN server_protocol_error( const char *err, ... );
......
...@@ -81,6 +81,8 @@ struct cmsg_fd ...@@ -81,6 +81,8 @@ struct cmsg_fd
}; };
#endif /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */ #endif /* HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */
time_t server_start_time = 0; /* time of server startup */
static sigset_t block_set; /* signals to block during server calls */ static sigset_t block_set; /* signals to block during server calls */
static int fd_socket = -1; /* socket to exchange file descriptors with the server */ static int fd_socket = -1; /* socket to exchange file descriptors with the server */
...@@ -919,8 +921,9 @@ size_t server_init_thread( int unix_pid, int unix_tid, void *entry_point ) ...@@ -919,8 +921,9 @@ size_t server_init_thread( int unix_pid, int unix_tid, void *entry_point )
ret = wine_server_call( req ); ret = wine_server_call( req );
NtCurrentTeb()->ClientId.UniqueProcess = (HANDLE)reply->pid; NtCurrentTeb()->ClientId.UniqueProcess = (HANDLE)reply->pid;
NtCurrentTeb()->ClientId.UniqueThread = (HANDLE)reply->tid; NtCurrentTeb()->ClientId.UniqueThread = (HANDLE)reply->tid;
info_size = reply->info_size; info_size = reply->info_size;
version = reply->version; version = reply->version;
server_start_time = reply->server_start;
} }
SERVER_END_REQ; SERVER_END_REQ;
......
...@@ -797,6 +797,29 @@ NTSTATUS WINAPI NtQuerySystemTime( PLARGE_INTEGER Time ) ...@@ -797,6 +797,29 @@ NTSTATUS WINAPI NtQuerySystemTime( PLARGE_INTEGER Time )
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
/******************************************************************************
* NtQueryPerformanceCounter [NTDLL.@]
*
* Note: Windows uses a timer clocked at a multiple of 1193182 Hz. There is a
* good number of applications that crash when the returned frequency is either
* lower or higher then what Windows gives. Also too high counter values are
* reported to give problems.
*/
NTSTATUS WINAPI NtQueryPerformanceCounter( PLARGE_INTEGER Counter, PLARGE_INTEGER Frequency )
{
struct timeval now;
if (!Counter) return STATUS_ACCESS_VIOLATION;
gettimeofday( &now, 0 );
/* convert a counter that increments at a rate of 1 MHz
* 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;
if (Frequency) Frequency->QuadPart = 1193182;
return STATUS_SUCCESS;
}
/*********************************************************************** /***********************************************************************
* TIME_GetTZAsStr [internal] * TIME_GetTZAsStr [internal]
* *
......
...@@ -237,18 +237,6 @@ struct new_thread_reply ...@@ -237,18 +237,6 @@ struct new_thread_reply
struct init_process_request
{
struct request_header __header;
};
struct init_process_reply
{
struct reply_header __header;
unsigned int server_start;
};
struct get_startup_info_request struct get_startup_info_request
{ {
struct request_header __header; struct request_header __header;
...@@ -304,6 +292,7 @@ struct init_thread_reply ...@@ -304,6 +292,7 @@ struct init_thread_reply
process_id_t pid; process_id_t pid;
thread_id_t tid; thread_id_t tid;
size_t info_size; size_t info_size;
time_t server_start;
int version; int version;
}; };
...@@ -3554,7 +3543,6 @@ enum request ...@@ -3554,7 +3543,6 @@ enum request
REQ_new_process, REQ_new_process,
REQ_get_new_process_info, REQ_get_new_process_info,
REQ_new_thread, REQ_new_thread,
REQ_init_process,
REQ_get_startup_info, REQ_get_startup_info,
REQ_init_process_done, REQ_init_process_done,
REQ_init_thread, REQ_init_thread,
...@@ -3764,7 +3752,6 @@ union generic_request ...@@ -3764,7 +3752,6 @@ union generic_request
struct new_process_request new_process_request; struct new_process_request new_process_request;
struct get_new_process_info_request get_new_process_info_request; struct get_new_process_info_request get_new_process_info_request;
struct new_thread_request new_thread_request; struct new_thread_request new_thread_request;
struct init_process_request init_process_request;
struct get_startup_info_request get_startup_info_request; struct get_startup_info_request get_startup_info_request;
struct init_process_done_request init_process_done_request; struct init_process_done_request init_process_done_request;
struct init_thread_request init_thread_request; struct init_thread_request init_thread_request;
...@@ -3972,7 +3959,6 @@ union generic_reply ...@@ -3972,7 +3959,6 @@ union generic_reply
struct new_process_reply new_process_reply; struct new_process_reply new_process_reply;
struct get_new_process_info_reply get_new_process_info_reply; struct get_new_process_info_reply get_new_process_info_reply;
struct new_thread_reply new_thread_reply; struct new_thread_reply new_thread_reply;
struct init_process_reply init_process_reply;
struct get_startup_info_reply get_startup_info_reply; struct get_startup_info_reply get_startup_info_reply;
struct init_process_done_reply init_process_done_reply; struct init_process_done_reply init_process_done_reply;
struct init_thread_reply init_thread_reply; struct init_thread_reply init_thread_reply;
...@@ -4174,6 +4160,6 @@ union generic_reply ...@@ -4174,6 +4160,6 @@ union generic_reply
struct set_mailslot_info_reply set_mailslot_info_reply; struct set_mailslot_info_reply set_mailslot_info_reply;
}; };
#define SERVER_PROTOCOL_VERSION 186 #define SERVER_PROTOCOL_VERSION 187
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */ #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
...@@ -172,7 +172,7 @@ extern int foreground; ...@@ -172,7 +172,7 @@ extern int foreground;
extern const char *server_argv0; extern const char *server_argv0;
/* server start time used for GetTickCount() */ /* server start time used for GetTickCount() */
extern unsigned int server_start_ticks; extern time_t server_start_time;
/* name space for synchronization objects */ /* name space for synchronization objects */
extern struct namespace *sync_namespace; extern struct namespace *sync_namespace;
......
...@@ -964,13 +964,6 @@ DECL_HANDLER(get_startup_info) ...@@ -964,13 +964,6 @@ DECL_HANDLER(get_startup_info)
info->data_size = 0; info->data_size = 0;
} }
/* initialize a new process */
DECL_HANDLER(init_process)
{
reply->server_start = server_start_ticks;
}
/* signal the end of the process initialization */ /* signal the end of the process initialization */
DECL_HANDLER(init_process_done) DECL_HANDLER(init_process_done)
{ {
......
...@@ -237,13 +237,6 @@ struct security_descriptor ...@@ -237,13 +237,6 @@ struct security_descriptor
@END @END
/* Initialize a process; called from the new process context */
@REQ(init_process)
@REPLY
unsigned int server_start; /* server start time (GetTickCount) */
@END
/* Retrieve the new process startup info */ /* Retrieve the new process startup info */
@REQ(get_startup_info) @REQ(get_startup_info)
@REPLY @REPLY
...@@ -284,6 +277,7 @@ struct security_descriptor ...@@ -284,6 +277,7 @@ struct security_descriptor
process_id_t pid; /* process id of the new thread's process */ process_id_t pid; /* process id of the new thread's process */
thread_id_t tid; /* thread id of the new thread */ thread_id_t tid; /* thread id of the new thread */
size_t info_size; /* total size of startup info */ size_t info_size; /* total size of startup info */
time_t server_start; /* server start time */
int version; /* protocol version */ int version; /* protocol version */
@END @END
......
...@@ -112,7 +112,7 @@ static const struct fd_ops master_socket_fd_ops = ...@@ -112,7 +112,7 @@ static const struct fd_ops master_socket_fd_ops =
struct thread *current = NULL; /* thread handling the current request */ struct thread *current = NULL; /* thread handling the current request */
unsigned int global_error = 0; /* global error code for when no thread is current */ unsigned int global_error = 0; /* global error code for when no thread is current */
unsigned int server_start_ticks = 0; /* tick count offset from server startup */ time_t server_start_time = 0; /* server startup time */
static struct master_socket *master_socket; /* the master socket object */ static struct master_socket *master_socket; /* the master socket object */
...@@ -454,7 +454,7 @@ unsigned int get_tick_count(void) ...@@ -454,7 +454,7 @@ unsigned int get_tick_count(void)
{ {
struct timeval t; struct timeval t;
gettimeofday( &t, NULL ); gettimeofday( &t, NULL );
return (t.tv_sec * 1000) + (t.tv_usec / 1000) - server_start_ticks; return ((t.tv_sec - server_start_time) * 1000) + (t.tv_usec / 1000);
} }
static void master_socket_dump( struct object *obj, int verbose ) static void master_socket_dump( struct object *obj, int verbose )
...@@ -776,8 +776,8 @@ void open_master_socket(void) ...@@ -776,8 +776,8 @@ void open_master_socket(void)
msghdr.msg_iov = &myiovec; msghdr.msg_iov = &myiovec;
msghdr.msg_iovlen = 1; msghdr.msg_iovlen = 1;
/* init startup ticks */ /* init startup time */
server_start_ticks = get_tick_count(); server_start_time = time(NULL);
} }
/* master socket timer expiration handler */ /* master socket timer expiration handler */
......
...@@ -106,7 +106,6 @@ inline static void set_reply_data_ptr( void *data, size_t size ) ...@@ -106,7 +106,6 @@ inline static void set_reply_data_ptr( void *data, size_t size )
DECL_HANDLER(new_process); DECL_HANDLER(new_process);
DECL_HANDLER(get_new_process_info); DECL_HANDLER(get_new_process_info);
DECL_HANDLER(new_thread); DECL_HANDLER(new_thread);
DECL_HANDLER(init_process);
DECL_HANDLER(get_startup_info); DECL_HANDLER(get_startup_info);
DECL_HANDLER(init_process_done); DECL_HANDLER(init_process_done);
DECL_HANDLER(init_thread); DECL_HANDLER(init_thread);
...@@ -315,7 +314,6 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] = ...@@ -315,7 +314,6 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
(req_handler)req_new_process, (req_handler)req_new_process,
(req_handler)req_get_new_process_info, (req_handler)req_get_new_process_info,
(req_handler)req_new_thread, (req_handler)req_new_thread,
(req_handler)req_init_process,
(req_handler)req_get_startup_info, (req_handler)req_get_startup_info,
(req_handler)req_init_process_done, (req_handler)req_init_process_done,
(req_handler)req_init_thread, (req_handler)req_init_thread,
......
...@@ -888,6 +888,7 @@ DECL_HANDLER(init_thread) ...@@ -888,6 +888,7 @@ DECL_HANDLER(init_thread)
reply->pid = get_process_id( process ); reply->pid = get_process_id( process );
reply->tid = get_thread_id( current ); reply->tid = get_thread_id( current );
reply->version = SERVER_PROTOCOL_VERSION; reply->version = SERVER_PROTOCOL_VERSION;
reply->server_start = server_start_time;
return; return;
error: error:
......
...@@ -606,15 +606,6 @@ static void dump_new_thread_reply( const struct new_thread_reply *req ) ...@@ -606,15 +606,6 @@ static void dump_new_thread_reply( const struct new_thread_reply *req )
fprintf( stderr, " handle=%p", req->handle ); fprintf( stderr, " handle=%p", req->handle );
} }
static void dump_init_process_request( const struct init_process_request *req )
{
}
static void dump_init_process_reply( const struct init_process_reply *req )
{
fprintf( stderr, " server_start=%08x", req->server_start );
}
static void dump_get_startup_info_request( const struct get_startup_info_request *req ) static void dump_get_startup_info_request( const struct get_startup_info_request *req )
{ {
} }
...@@ -663,6 +654,7 @@ static void dump_init_thread_reply( const struct init_thread_reply *req ) ...@@ -663,6 +654,7 @@ static void dump_init_thread_reply( const struct init_thread_reply *req )
fprintf( stderr, " pid=%04x,", req->pid ); fprintf( stderr, " pid=%04x,", req->pid );
fprintf( stderr, " tid=%04x,", req->tid ); fprintf( stderr, " tid=%04x,", req->tid );
fprintf( stderr, " info_size=%d,", req->info_size ); fprintf( stderr, " info_size=%d,", req->info_size );
fprintf( stderr, " server_start=%ld,", (long)req->server_start );
fprintf( stderr, " version=%d", req->version ); fprintf( stderr, " version=%d", req->version );
} }
...@@ -3066,7 +3058,6 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = { ...@@ -3066,7 +3058,6 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
(dump_func)dump_new_process_request, (dump_func)dump_new_process_request,
(dump_func)dump_get_new_process_info_request, (dump_func)dump_get_new_process_info_request,
(dump_func)dump_new_thread_request, (dump_func)dump_new_thread_request,
(dump_func)dump_init_process_request,
(dump_func)dump_get_startup_info_request, (dump_func)dump_get_startup_info_request,
(dump_func)dump_init_process_done_request, (dump_func)dump_init_process_done_request,
(dump_func)dump_init_thread_request, (dump_func)dump_init_thread_request,
...@@ -3272,7 +3263,6 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = { ...@@ -3272,7 +3263,6 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
(dump_func)dump_new_process_reply, (dump_func)dump_new_process_reply,
(dump_func)dump_get_new_process_info_reply, (dump_func)dump_get_new_process_info_reply,
(dump_func)dump_new_thread_reply, (dump_func)dump_new_thread_reply,
(dump_func)dump_init_process_reply,
(dump_func)dump_get_startup_info_reply, (dump_func)dump_get_startup_info_reply,
(dump_func)0, (dump_func)0,
(dump_func)dump_init_thread_reply, (dump_func)dump_init_thread_reply,
...@@ -3478,7 +3468,6 @@ static const char * const req_names[REQ_NB_REQUESTS] = { ...@@ -3478,7 +3468,6 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
"new_process", "new_process",
"get_new_process_info", "get_new_process_info",
"new_thread", "new_thread",
"init_process",
"get_startup_info", "get_startup_info",
"init_process_done", "init_process_done",
"init_thread", "init_thread",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment