Alexandre Julliard : services: Load some timeout parameters from the registry.
Alexandre Julliard
julliard at winehq.org
Fri May 20 12:44:31 CDT 2011
Module: wine
Branch: master
Commit: c9dc9a10631eecd731009e7d6d549cb4491d055e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c9dc9a10631eecd731009e7d6d549cb4491d055e
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri May 20 12:33:58 2011 +0200
services: Load some timeout parameters from the registry.
---
programs/services/services.c | 35 ++++++++++++++++++++++++++++++++++-
programs/services/services.h | 3 +++
2 files changed, 37 insertions(+), 1 deletions(-)
diff --git a/programs/services/services.c b/programs/services/services.c
index b3ed1a3..2b1b8c5 100644
--- a/programs/services/services.c
+++ b/programs/services/services.c
@@ -38,6 +38,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(service);
HANDLE g_hStartedEvent;
struct scmdatabase *active_database;
+DWORD service_pipe_timeout = 10000;
+DWORD service_kill_timeout = 20000;
+
static const int is_win64 = (sizeof(void *) > sizeof(int));
static const WCHAR SZ_LOCAL_SYSTEM[] = {'L','o','c','a','l','S','y','s','t','e','m',0};
@@ -650,7 +653,7 @@ static DWORD service_wait_for_startup(struct service_entry *service_entry, HANDL
DWORD dwCurrentStatus;
HANDLE handles[2] = { service_entry->status_changed_event, process_handle };
DWORD ret;
- ret = WaitForMultipleObjects(sizeof(handles)/sizeof(handles[0]), handles, FALSE, 20000);
+ ret = WaitForMultipleObjects( 2, handles, FALSE, service_pipe_timeout );
if (ret != WAIT_OBJECT_0)
return ERROR_SERVICE_REQUEST_TIMEOUT;
service_lock_shared(service_entry);
@@ -775,12 +778,42 @@ DWORD service_start(struct service_entry *service, DWORD service_argc, LPCWSTR *
return err;
}
+static void load_registry_parameters(void)
+{
+ static const WCHAR controlW[] =
+ { 'S','y','s','t','e','m','\\',
+ 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
+ 'C','o','n','t','r','o','l',0 };
+ static const WCHAR pipetimeoutW[] =
+ {'S','e','r','v','i','c','e','s','P','i','p','e','T','i','m','e','o','u','t',0};
+ static const WCHAR killtimeoutW[] =
+ {'W','a','i','t','T','o','K','i','l','l','S','e','r','v','i','c','e','T','i','m','e','o','u','t',0};
+ HKEY key;
+ WCHAR buffer[64];
+ DWORD type, count, val;
+
+ if (RegOpenKeyW( HKEY_LOCAL_MACHINE, controlW, &key )) return;
+
+ count = sizeof(buffer);
+ if (!RegQueryValueExW( key, pipetimeoutW, NULL, &type, (BYTE *)buffer, &count ) &&
+ type == REG_SZ && (val = atoiW( buffer )))
+ service_pipe_timeout = val;
+
+ count = sizeof(buffer);
+ if (!RegQueryValueExW( key, killtimeoutW, NULL, &type, (BYTE *)buffer, &count ) &&
+ type == REG_SZ && (val = atoiW( buffer )))
+ service_kill_timeout = val;
+
+ RegCloseKey( key );
+}
int main(int argc, char *argv[])
{
static const WCHAR svcctl_started_event[] = SVCCTL_STARTED_EVENT;
DWORD err;
+
g_hStartedEvent = CreateEventW(NULL, TRUE, FALSE, svcctl_started_event);
+ load_registry_parameters();
err = scmdatabase_create(&active_database);
if (err != ERROR_SUCCESS)
return err;
diff --git a/programs/services/services.h b/programs/services/services.h
index ea917f4..63154c8 100644
--- a/programs/services/services.h
+++ b/programs/services/services.h
@@ -80,6 +80,9 @@ BOOL service_send_command( struct service_entry *service, HANDLE pipe,
extern HANDLE g_hStartedEvent;
+extern DWORD service_pipe_timeout;
+extern DWORD service_kill_timeout;
+
DWORD RPC_Init(void);
DWORD RPC_MainLoop(void);
More information about the wine-cvs
mailing list