Module: wine Branch: master Commit: 765815729fc4af2472e60551364e3b29dccfbcff URL: https://source.winehq.org/git/wine.git/?a=commit;h=765815729fc4af2472e605513...
Author: Jacek Caban jacek@codeweavers.com Date: Fri Sep 6 21:33:58 2019 +0200
services: Use threadpool timers for services delay loading.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47675 Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
programs/services/services.c | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-)
diff --git a/programs/services/services.c b/programs/services/services.c index 5eca777..968be35 100644 --- a/programs/services/services.c +++ b/programs/services/services.c @@ -353,37 +353,34 @@ static void CALLBACK delayed_autostart_cancel_callback(void *object, void *userd }
static void CALLBACK delayed_autostart_callback(TP_CALLBACK_INSTANCE *instance, void *context, - TP_WAIT *wait, TP_WAIT_RESULT result) + TP_TIMER *timer) { struct delayed_autostart_params *params = context; struct service_entry *service; unsigned int i; DWORD err;
- if (result == WAIT_TIMEOUT) - { - scmdatabase_lock_startup(active_database, INFINITE); + scmdatabase_lock_startup(active_database, INFINITE);
- for (i = 0; i < params->count; i++) + for (i = 0; i < params->count; i++) + { + service = params->services[i]; + if (service->status.dwCurrentState == SERVICE_STOPPED) { - service = params->services[i]; - if (service->status.dwCurrentState == SERVICE_STOPPED) - { - TRACE("Starting deleyed auto-start service %s\n", debugstr_w(service->name)); - err = service_start(service, 0, NULL); - if (err != ERROR_SUCCESS) - FIXME("Delayed auto-start service %s failed to start: %d\n", - wine_dbgstr_w(service->name), err); - } - release_service(service); + TRACE("Starting delayed auto-start service %s\n", debugstr_w(service->name)); + err = service_start(service, 0, NULL); + if (err != ERROR_SUCCESS) + FIXME("Delayed auto-start service %s failed to start: %d\n", + wine_dbgstr_w(service->name), err); } - - scmdatabase_unlock_startup(active_database); + release_service(service); }
+ scmdatabase_unlock_startup(active_database); + heap_free(params->services); heap_free(params); - CloseThreadpoolWait(wait); + CloseThreadpoolTimer(timer); }
static BOOL schedule_delayed_autostart(struct service_entry **services, unsigned int count) @@ -391,7 +388,7 @@ static BOOL schedule_delayed_autostart(struct service_entry **services, unsigned struct delayed_autostart_params *params; TP_CALLBACK_ENVIRON environment; LARGE_INTEGER timestamp; - TP_WAIT *wait; + TP_TIMER *timer; FILETIME ft;
if (!(delayed_autostart_cleanup = CreateThreadpoolCleanupGroup())) @@ -413,14 +410,14 @@ static BOOL schedule_delayed_autostart(struct service_entry **services, unsigned ft.dwLowDateTime = timestamp.u.LowPart; ft.dwHighDateTime = timestamp.u.HighPart;
- if (!(wait = CreateThreadpoolWait(delayed_autostart_callback, params, &environment))) + if (!(timer = CreateThreadpoolTimer(delayed_autostart_callback, params, &environment))) { ERR("CreateThreadpoolWait failed: %u\n", GetLastError()); heap_free(params); return FALSE; }
- SetThreadpoolWait(wait, params, &ft); + SetThreadpoolTimer(timer, &ft, 0, 0); return TRUE; }