Sebastian Lackner : services: Pass a process argument to wait_for_startup function.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Mar 16 11:36:41 CDT 2016
Module: wine
Branch: master
Commit: ed54b881738c616674d7025b32f704a159decd4a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ed54b881738c616674d7025b32f704a159decd4a
Author: Sebastian Lackner <sebastian at fds-team.de>
Date: Wed Mar 16 04:33:09 2016 +0100
services: Pass a process argument to wait_for_startup function.
Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
programs/services/services.c | 47 ++++++++++++++++++++------------------------
1 file changed, 21 insertions(+), 26 deletions(-)
diff --git a/programs/services/services.c b/programs/services/services.c
index 325e7f3..8f53e7e 100644
--- a/programs/services/services.c
+++ b/programs/services/services.c
@@ -714,7 +714,7 @@ static DWORD get_service_binary_path(const struct service_entry *service_entry,
return ERROR_SUCCESS;
}
-static DWORD service_start_process(struct service_entry *service_entry, HANDLE *process)
+static DWORD service_start_process(struct service_entry *service_entry)
{
PROCESS_INFORMATION pi;
STARTUPINFOW si;
@@ -765,37 +765,30 @@ static DWORD service_start_process(struct service_entry *service_entry, HANDLE *
service_entry->status.dwProcessId = pi.dwProcessId;
service_entry->process->process = pi.hProcess;
- *process = pi.hProcess;
CloseHandle( pi.hThread );
return ERROR_SUCCESS;
}
-static DWORD service_wait_for_startup(struct service_entry *service_entry, HANDLE process_handle)
+static DWORD process_wait_for_startup(struct process_entry *process)
{
- HANDLE handles[2] = { service_entry->process->status_changed_event, process_handle };
- DWORD state, ret;
-
- WINE_TRACE("%p\n", service_entry);
+ HANDLE handles[2] = { process->status_changed_event, process->process };
+ DWORD ret;
ret = WaitForMultipleObjects( 2, handles, FALSE, service_pipe_timeout );
- if (ret != WAIT_OBJECT_0)
- return ERROR_SERVICE_REQUEST_TIMEOUT;
- service_lock(service_entry);
- state = service_entry->status.dwCurrentState;
- service_unlock(service_entry);
- if (state == SERVICE_START_PENDING)
- {
- WINE_TRACE("Service state changed to SERVICE_START_PENDING\n");
- return ERROR_SUCCESS;
- }
- else if (state == SERVICE_RUNNING)
- {
- WINE_TRACE("Service started successfully\n");
- return ERROR_SUCCESS;
- }
+ return (ret == WAIT_OBJECT_0) ? ERROR_SUCCESS : ERROR_SERVICE_REQUEST_TIMEOUT;
+}
+
+static DWORD service_is_running(struct service_entry *service)
+{
+ DWORD state;
+
+ service_lock(service);
+ state = service->status.dwCurrentState;
+ service_unlock(service);
- return ERROR_SERVICE_REQUEST_TIMEOUT;
+ return (state == SERVICE_START_PENDING || state == SERVICE_RUNNING) ?
+ ERROR_SUCCESS : ERROR_SERVICE_REQUEST_TIMEOUT;
}
/******************************************************************************
@@ -874,7 +867,6 @@ DWORD service_start(struct service_entry *service, DWORD service_argc, LPCWSTR *
struct process_entry *process = service->process;
DWORD err;
LPWSTR name;
- HANDLE process_handle = NULL;
err = scmdatabase_lock_startup(service->db);
if (err != ERROR_SUCCESS)
@@ -907,7 +899,7 @@ DWORD service_start(struct service_entry *service, DWORD service_argc, LPCWSTR *
}
else
{
- err = service_start_process(service, &process_handle);
+ err = service_start_process(service);
if (err == ERROR_SUCCESS)
{
if (!process_send_start_message(process, service->name, service_argv, service_argc))
@@ -915,7 +907,10 @@ DWORD service_start(struct service_entry *service, DWORD service_argc, LPCWSTR *
}
if (err == ERROR_SUCCESS)
- err = service_wait_for_startup(service, process_handle);
+ err = process_wait_for_startup(process);
+
+ if (err == ERROR_SUCCESS)
+ err = service_is_running(service);
}
if (err == ERROR_SUCCESS)
More information about the wine-cvs
mailing list