[Piglit] [PATCH] framework: fix running with mixed concurrency (neither -c or -1)

Dylan Baker dylan at pnwbakers.com
Tue May 8 17:32:26 UTC 2018


test_list is an iterator, you can't walk an iterator more than once. To
solve this we use itertools.tee, which creates a shared buffer for the
iterators to draw from. This fixes errors like:

[000/480]
Traceback (most recent call last):
  File "./piglit", line 178, in <module>
    main()
  File "./piglit", line 174, in main
    sys.exit(runner(args))
  File "/home/user/piglit/framework/exceptions.py", line 51, in _inner
    func(*args, **kwargs)
  File "/home/user/piglit/framework/programs/run.py", line 370, in run
    backend.finalize({'time_elapsed': time_elapsed.to_json()})
  File "/home/user/piglit/framework/backends/json.py", line 163, in finalize
    assert data['tests']
  AssertionError

Thanks Tomi for figuring out what was wrong with the original patch!

CC: Michel Dänzer <michel at daenzer.net>
CC: Tomi Sarvela <tomi.p.sarvela at intel.com>
CC: "Juan A. Suarez Romero" <jasuarez at igalia.com>
---
 framework/profile.py | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/framework/profile.py b/framework/profile.py
index 1c75025b3..5161f6e4c 100644
--- a/framework/profile.py
+++ b/framework/profile.py
@@ -596,13 +596,16 @@ def run(profiles, logger, backend, concurrency):
             run_threads(single, profile, test_list)
         else:
             assert concurrency == "some"
+            # test_list is an iterator, we need to copy it to run it twice.
+            test_list = itertools.tee(test_list, 2)
+
             # Filter and return only thread safe tests to the threaded pool
-            run_threads(multi, profile, test_list,
+            run_threads(multi, profile, test_list[0],
                         lambda x: x[1].run_concurrent)
 
             # Filter and return the non thread safe tests to the single
             # pool
-            run_threads(single, profile, test_list,
+            run_threads(single, profile, test_list[1],
                         lambda x: not x[1].run_concurrent)
         profile.teardown()
 
-- 
2.17.0



More information about the Piglit mailing list