Module: wine Branch: stable Commit: 157a9870823140800a7f99f7872d3900a4ba3ce5 URL: https://source.winehq.org/git/wine.git/?a=commit;h=157a9870823140800a7f99f78...
Author: Dmitry Timoshkov dmitry@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@baikal.ru Signed-off-by: Alexandre Julliard julliard@winehq.org (cherry picked from commit b5c1a8f635f2f8f8ccf7c85ad52c40a632711a03) Signed-off-by: Michael Stefaniuc mstefani@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 20c5a27..786c851 100644 --- a/programs/services/rpc.c +++ b/programs/services/rpc.c @@ -1126,7 +1126,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); @@ -1288,7 +1288,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 cda70e0..df47473 100644 --- a/programs/services/services.h +++ b/programs/services/services.h @@ -73,7 +73,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);