Dmitry Timoshkov : services: Add a 3000 ms timeout to StartService.
Module: wine Branch: stable Commit: 157a9870823140800a7f99f7872d3900a4ba3ce5 URL: https://source.winehq.org/git/wine.git/?a=commit;h=157a9870823140800a7f99f78... Author: Dmitry Timoshkov <dmitry(a)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(a)baikal.ru> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> (cherry picked from commit b5c1a8f635f2f8f8ccf7c85ad52c40a632711a03) Signed-off-by: Michael Stefaniuc <mstefani(a)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);
participants (1)
-
Alexandre Julliard