[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