mstask/tests: Work around race conditions with the task scheduler process.
When a task is created the process scheduler locks and loads it. This can cause ITaskScheduler_Delete() to fail with a sharing violation if it is called at the wrong time. Just retry a bit later when that happens. This fixes failures mostly in Wine but also in Windows 10 from time to time in both task and task_scheduler. Signed-off-by: Francois Gouget <fgouget@icodeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
cf85253a9c
commit
2e6ae16469
|
@ -29,6 +29,9 @@ static ITaskScheduler *scheduler;
|
|||
static const WCHAR task_name[] = {'T','e','s','t','i','n','g',0};
|
||||
static const WCHAR empty[] = {0};
|
||||
|
||||
extern HRESULT taskscheduler_delete(ITaskScheduler*, const WCHAR*);
|
||||
|
||||
|
||||
static LPCWSTR path_resolve_name(LPCWSTR base_name)
|
||||
{
|
||||
static WCHAR buffer[MAX_PATH];
|
||||
|
@ -552,7 +555,7 @@ static void test_Run(void)
|
|||
HRESULT hr, status;
|
||||
|
||||
/* cleanup after previous runs */
|
||||
ITaskScheduler_Delete(scheduler, wine_test_runW);
|
||||
taskscheduler_delete(scheduler, wine_test_runW);
|
||||
|
||||
hr = ITaskScheduler_NewWorkItem(scheduler, wine_test_runW, &CLSID_CTask,
|
||||
&IID_ITask, (IUnknown **)&task);
|
||||
|
@ -679,7 +682,7 @@ static void test_Run(void)
|
|||
else
|
||||
ITask_Release(task);
|
||||
|
||||
hr = ITaskScheduler_Delete(scheduler, wine_test_runW);
|
||||
hr = taskscheduler_delete(scheduler, wine_test_runW);
|
||||
ok(hr == S_OK, "got %#x\n", hr);
|
||||
}
|
||||
|
||||
|
|
|
@ -31,6 +31,27 @@ static ITaskScheduler *test_task_scheduler;
|
|||
|
||||
static const WCHAR does_not_existW[] = {'\\','\\','d','o','e','s','_','n','o','t','_','e','x','i','s','t',0};
|
||||
|
||||
|
||||
HRESULT taskscheduler_delete(ITaskScheduler *scheduler, const WCHAR *name)
|
||||
{
|
||||
HRESULT hr;
|
||||
int i = 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
hr = ITaskScheduler_Delete(scheduler, name);
|
||||
if (hr != HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION)) break;
|
||||
if (++i == 5) break;
|
||||
|
||||
/* The task scheduler locked the file to load the task (see
|
||||
* ITaskScheduler_Activate()). It should be done soon.
|
||||
*/
|
||||
trace("Got a sharing violation deleting %s, retrying...\n", wine_dbgstr_w(name));
|
||||
Sleep(100);
|
||||
}
|
||||
return hr;
|
||||
}
|
||||
|
||||
static void test_NewWorkItem(void)
|
||||
{
|
||||
HRESULT hres;
|
||||
|
@ -225,7 +246,7 @@ static void test_Enum(void)
|
|||
ok(hr == S_OK, "got %#x\n", hr);
|
||||
|
||||
/* cleanup after previous runs */
|
||||
ITaskScheduler_Delete(scheduler, Task1);
|
||||
taskscheduler_delete(scheduler, Task1);
|
||||
|
||||
hr = ITaskScheduler_NewWorkItem(scheduler, Task1, &CLSID_CTask, &IID_ITask, (IUnknown **)&task);
|
||||
ok(hr == S_OK, "got %#x\n", hr);
|
||||
|
@ -291,7 +312,7 @@ static void test_Enum(void)
|
|||
|
||||
IEnumWorkItems_Release(tasks);
|
||||
|
||||
hr = ITaskScheduler_Delete(scheduler, Task1);
|
||||
hr = taskscheduler_delete(scheduler, Task1);
|
||||
ok(hr == S_OK, "got %#x\n", hr);
|
||||
|
||||
ITaskScheduler_Release(scheduler);
|
||||
|
@ -494,11 +515,11 @@ static void test_task_storage(void)
|
|||
|
||||
test_save_task_curfile(task);
|
||||
|
||||
hr = ITaskScheduler_Delete(scheduler, Task1);
|
||||
hr = taskscheduler_delete(scheduler, Task1);
|
||||
ok(hr == S_OK, "got %#x\n", hr);
|
||||
hr = ITaskScheduler_Delete(scheduler, Task2);
|
||||
hr = taskscheduler_delete(scheduler, Task2);
|
||||
ok(hr == S_OK, "got %#x\n", hr);
|
||||
hr = ITaskScheduler_Delete(scheduler, Task3);
|
||||
hr = taskscheduler_delete(scheduler, Task3);
|
||||
ok(hr == S_OK, "got %#x\n", hr);
|
||||
|
||||
ITask_Release(task);
|
||||
|
|
Loading…
Reference in New Issue