Dmitry Timoshkov : services: Add a 3000 ms timeout to StartService.
Alexandre Julliard
julliard at winehq.org
Mon Apr 9 15:41:11 CDT 2018
Module: wine
Branch: master
Commit: b5c1a8f635f2f8f8ccf7c85ad52c40a632711a03
URL: https://source.winehq.org/git/wine.git/?a=commit;h=b5c1a8f635f2f8f8ccf7c85ad52c40a632711a03
Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date: Mon Apr 9 19:29:02 2018 +0800
services: Add a 3000 ms timeout to StartService.
Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
programs/services/rpc.c | 4 ++--
programs/services/services.c | 15 ++++++++++++---
programs/services/services.h | 2 +-
3 files changed, 15 insertions(+), 6 deletions(-)
diff --git a/programs/services/rpc.c b/programs/services/rpc.c
index 5ecd660..efbcd76 100644
--- a/programs/services/rpc.c
+++ b/programs/services/rpc.c
@@ -1212,7 +1212,7 @@ DWORD __cdecl svcctl_StartServiceW(
if (service->service_entry->config.dwStartType == SERVICE_DISABLED)
return ERROR_SERVICE_DISABLED;
- if (!scmdatabase_lock_startup(service->service_entry->db))
+ if (!scmdatabase_lock_startup(service->service_entry->db, 3000))
return ERROR_SERVICE_DATABASE_LOCKED;
err = service_start(service->service_entry, dwNumServiceArgs, lpServiceArgVectors);
@@ -1374,7 +1374,7 @@ DWORD __cdecl svcctl_LockServiceDatabase(
if ((err = validate_scm_handle(hSCManager, SC_MANAGER_LOCK, &manager)) != ERROR_SUCCESS)
return err;
- if (!scmdatabase_lock_startup(manager->db))
+ if (!scmdatabase_lock_startup(manager->db, 0))
return ERROR_SERVICE_DATABASE_LOCKED;
lock = HeapAlloc(GetProcessHeap(), 0, sizeof(struct sc_lock));
diff --git a/programs/services/services.c b/programs/services/services.c
index f7c47b5..eba98d6 100644
--- a/programs/services/services.c
+++ b/programs/services/services.c
@@ -361,7 +361,7 @@ static void scmdatabase_autostart_services(struct scmdatabase *db)
scmdatabase_unlock(db);
qsort(services_list, size, sizeof(services_list[0]), compare_tags);
- while (!scmdatabase_lock_startup(db)) Sleep(10);
+ scmdatabase_lock_startup(db, INFINITE);
for (i = 0; i < size; i++)
{
@@ -619,9 +619,18 @@ static DWORD scmdatabase_load_services(struct scmdatabase *db)
return ERROR_SUCCESS;
}
-BOOL scmdatabase_lock_startup(struct scmdatabase *db)
+BOOL scmdatabase_lock_startup(struct scmdatabase *db, int timeout)
{
- return !InterlockedCompareExchange(&db->service_start_lock, TRUE, FALSE);
+ while (InterlockedCompareExchange(&db->service_start_lock, TRUE, FALSE))
+ {
+ if (timeout != INFINITE)
+ {
+ timeout -= 10;
+ if (timeout <= 0) return FALSE;
+ }
+ Sleep(10);
+ }
+ return TRUE;
}
void scmdatabase_unlock_startup(struct scmdatabase *db)
diff --git a/programs/services/services.h b/programs/services/services.h
index fd19ed3..5a79c35 100644
--- a/programs/services/services.h
+++ b/programs/services/services.h
@@ -77,7 +77,7 @@ struct service_entry *scmdatabase_find_service(struct scmdatabase *db, LPCWSTR n
struct service_entry *scmdatabase_find_service_by_displayname(struct scmdatabase *db, LPCWSTR name);
DWORD scmdatabase_add_service(struct scmdatabase *db, struct service_entry *entry);
-BOOL scmdatabase_lock_startup(struct scmdatabase *db);
+BOOL scmdatabase_lock_startup(struct scmdatabase *db, int timeout);
void scmdatabase_unlock_startup(struct scmdatabase *db);
void scmdatabase_lock(struct scmdatabase *db);
More information about the wine-cvs
mailing list