Jacek Caban : services: Use threadpool timers for services delay loading.
Alexandre Julliard
julliard at winehq.org
Fri Sep 6 16:05:43 CDT 2019
Module: wine
Branch: master
Commit: 765815729fc4af2472e60551364e3b29dccfbcff
URL: https://source.winehq.org/git/wine.git/?a=commit;h=765815729fc4af2472e60551364e3b29dccfbcff
Author: Jacek Caban <jacek at 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 at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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;
}
More information about the wine-cvs
mailing list