[PATCH 1/4] schedsvc: Check state of the tasks every 10 seconds.
Dmitry Timoshkov
dmitry at baikal.ru
Wed May 16 04:47:34 CDT 2018
Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
---
dlls/schedsvc/atsvc.c | 22 +++++++++++++++++-----
dlls/schedsvc/schedsvc_private.h | 1 +
dlls/schedsvc/svc_main.c | 31 ++++++++++++++++++++++++++++---
3 files changed, 46 insertions(+), 8 deletions(-)
diff --git a/dlls/schedsvc/atsvc.c b/dlls/schedsvc/atsvc.c
index 542dfc3701..61771d87b3 100644
--- a/dlls/schedsvc/atsvc.c
+++ b/dlls/schedsvc/atsvc.c
@@ -76,6 +76,23 @@ static CRITICAL_SECTION_DEBUG cs_debug =
};
static CRITICAL_SECTION at_job_list_section = { &cs_debug, -1, 0, 0, 0, 0 };
+void check_task_state(void)
+{
+ struct job_t *job;
+
+ EnterCriticalSection(&at_job_list_section);
+
+ LIST_FOR_EACH_ENTRY(job, &at_job_list, struct job_t, entry)
+ {
+ if (job->data.flags & 0x08000000)
+ FIXME("Terminate(%s): not implemented\n", debugstr_w(job->info.Command));
+ else if (job->data.flags & 0x04000000)
+ FIXME("Run(%s): not implemented\n", debugstr_w(job->info.Command));
+ }
+
+ LeaveCriticalSection(&at_job_list_section);
+}
+
static DWORD load_unicode_strings(const char *data, DWORD limit, AT_ENUM *info)
{
DWORD i, data_size = 0;
@@ -340,11 +357,6 @@ void add_job(const WCHAR *name)
return;
}
- if (job->data.flags & 0x08000000)
- FIXME("Terminate(%s): not implemented\n", debugstr_w(job->info.Command));
- else if (job->data.flags & 0x04000000)
- FIXME("Run(%s): not implemented\n", debugstr_w(job->info.Command));
-
EnterCriticalSection(&at_job_list_section);
job->name = heap_strdupW(name);
job->info.JobId = current_jobid++;
diff --git a/dlls/schedsvc/schedsvc_private.h b/dlls/schedsvc/schedsvc_private.h
index 215bba003e..df7144431d 100644
--- a/dlls/schedsvc/schedsvc_private.h
+++ b/dlls/schedsvc/schedsvc_private.h
@@ -25,6 +25,7 @@
void schedsvc_auto_start(void) DECLSPEC_HIDDEN;
void add_job(const WCHAR *name) DECLSPEC_HIDDEN;
void remove_job(const WCHAR *name) DECLSPEC_HIDDEN;
+void check_task_state(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 f021d63b98..905582daf1 100644
--- a/dlls/schedsvc/svc_main.c
+++ b/dlls/schedsvc/svc_main.c
@@ -40,11 +40,27 @@ static DWORD WINAPI tasks_monitor_thread(void *arg)
{
static const WCHAR tasksW[] = { '\\','T','a','s','k','s','\\',0 };
WCHAR path[MAX_PATH];
- HANDLE htasks;
+ HANDLE htasks, timer;
+ LARGE_INTEGER period;
OVERLAPPED ov;
TRACE("Starting...\n");
+ timer = CreateWaitableTimerW(NULL, FALSE, NULL);
+ if (timer == NULL)
+ {
+ ERR("CreateWaitableTimer failed\n");
+ return -1;
+ }
+
+ /* check the state of the tasks every 10 seconds */
+ period.QuadPart = 10 * 1000;
+ if (!SetWaitableTimer(timer, &period, period.QuadPart, NULL, NULL, FALSE))
+ {
+ ERR("SetWaitableTimer failed\n");
+ return -1;
+ }
+
GetWindowsDirectoryW(path, MAX_PATH);
lstrcatW(path, tasksW);
@@ -69,7 +85,7 @@ static DWORD WINAPI tasks_monitor_thread(void *arg)
FILE_NOTIFY_INFORMATION data;
WCHAR name_buffer[MAX_PATH];
} info;
- HANDLE events[2];
+ HANDLE events[3];
DWORD ret;
/* the buffer must be DWORD aligned */
@@ -87,10 +103,17 @@ static DWORD WINAPI tasks_monitor_thread(void *arg)
events[0] = done_event;
events[1] = ov.hEvent;
+ events[2] = timer;
- ret = WaitForMultipleObjects(2, events, FALSE, INFINITE);
+ ret = WaitForMultipleObjects(3, events, FALSE, INFINITE);
if (ret == WAIT_OBJECT_0) break;
+ if (ret == WAIT_OBJECT_0 + 2)
+ {
+ check_task_state();
+ continue;
+ }
+
info.data.FileName[info.data.FileNameLength/sizeof(WCHAR)] = 0;
switch (info.data.Action)
@@ -128,6 +151,8 @@ static DWORD WINAPI tasks_monitor_thread(void *arg)
}
}
+ CancelWaitableTimer(timer);
+ CloseHandle(timer);
CloseHandle(ov.hEvent);
CloseHandle(htasks);
--
2.16.3
More information about the wine-devel
mailing list