From 8d540ec7cfebf12c088dc2733566d498dbee4977 Mon Sep 17 00:00:00 2001 From: Dmitry Timoshkov Date: Fri, 8 Jun 2018 15:43:55 +0800 Subject: [PATCH] schedsvc: Add support for running missed tasks at the service start. Signed-off-by: Dmitry Timoshkov Signed-off-by: Alexandre Julliard --- dlls/schedsvc/atsvc.c | 24 ++++++++++++++++++++++++ dlls/schedsvc/schedsvc_private.h | 1 + dlls/schedsvc/svc_main.c | 1 + 3 files changed, 26 insertions(+) diff --git a/dlls/schedsvc/atsvc.c b/dlls/schedsvc/atsvc.c index b5b8317deda..f6ea0f0e237 100644 --- a/dlls/schedsvc/atsvc.c +++ b/dlls/schedsvc/atsvc.c @@ -1039,6 +1039,30 @@ void check_task_time(void) LeaveCriticalSection(&at_job_list_section); } +void check_missed_task_time(void) +{ + FILETIME current_ft, last_ft; + struct job_t *job; + + GetSystemTimeAsFileTime(¤t_ft); + FileTimeToLocalFileTime(¤t_ft, ¤t_ft); + + EnterCriticalSection(&at_job_list_section); + + LIST_FOR_EACH_ENTRY(job, &at_job_list, struct job_t, entry) + { + if (SystemTimeToFileTime(&job->data.last_runtime, &last_ft)) + { + if (job_runs_at(job, &last_ft, ¤t_ft)) + { + run_job(job); + } + } + } + + LeaveCriticalSection(&at_job_list_section); +} + void remove_job(const WCHAR *name) { struct job_t *job; diff --git a/dlls/schedsvc/schedsvc_private.h b/dlls/schedsvc/schedsvc_private.h index 10892d55cac..117c6f51ed9 100644 --- a/dlls/schedsvc/schedsvc_private.h +++ b/dlls/schedsvc/schedsvc_private.h @@ -31,6 +31,7 @@ void update_process_status(DWORD pid) DECLSPEC_HIDDEN; BOOL get_next_runtime(LARGE_INTEGER *rt) DECLSPEC_HIDDEN; void check_task_time(void) DECLSPEC_HIDDEN; void load_at_tasks(void) DECLSPEC_HIDDEN; +void check_missed_task_time(void) DECLSPEC_HIDDEN; static inline WCHAR *heap_strdupW(const WCHAR *src) { diff --git a/dlls/schedsvc/svc_main.c b/dlls/schedsvc/svc_main.c index 2bba674b073..8e23a049db6 100644 --- a/dlls/schedsvc/svc_main.c +++ b/dlls/schedsvc/svc_main.c @@ -54,6 +54,7 @@ static DWORD WINAPI tasks_monitor_thread(void *arg) TRACE("Starting...\n"); load_at_tasks(); + check_missed_task_time(); htimer = CreateWaitableTimerW(NULL, FALSE, NULL); if (htimer == NULL) -- 2.11.4.GIT