From ee4f69205a375f821c32b4d2dd77e8d603910820 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Wed, 11 Sep 2019 14:49:17 +0200 Subject: QReadWriteLocker: also benchmark recursive mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ic2e357f4702d05220cf6c96717672dcabacd78d6 Reviewed-by: MÃ¥rten Nordheim --- .../qreadwritelock/tst_bench_qreadwritelock.cpp | 66 ++++++++++++++++++++++ 1 file changed, 66 insertions(+) (limited to 'tests/benchmarks/corelib') diff --git a/tests/benchmarks/corelib/thread/qreadwritelock/tst_bench_qreadwritelock.cpp b/tests/benchmarks/corelib/thread/qreadwritelock/tst_bench_qreadwritelock.cpp index be12877df1..824f85ec6a 100644 --- a/tests/benchmarks/corelib/thread/qreadwritelock/tst_bench_qreadwritelock.cpp +++ b/tests/benchmarks/corelib/thread/qreadwritelock/tst_bench_qreadwritelock.cpp @@ -44,6 +44,49 @@ struct LockerWrapper : T } }; +struct QRecursiveReadWriteLock : QReadWriteLock +{ + QRecursiveReadWriteLock() : QReadWriteLock(Recursive) {} +}; + +template + // requires N = 2^M for some Integral M >= 0 +struct Recursive +{ + Recursive r1, r2; + + template + Q_ALWAYS_INLINE + explicit Recursive(Args &&...args) + : r1(args...), + r2(args...) + {} +}; + +template +struct Recursive +{ + T t; + template + Q_ALWAYS_INLINE + explicit Recursive(Args &&...args) + : t(args...) {} +}; + +template +struct Recursive +{ + template + Q_ALWAYS_INLINE + explicit Recursive(Args &&...) {} +}; + +template +using QRecursiveReadLocker = Recursive; + +template +using QRecursiveWriteLocker = Recursive; + int threadCount; class tst_QReadWriteLock : public QObject @@ -105,6 +148,15 @@ void tst_QReadWriteLock::uncontended_data() << FunctionPtrHolder(testUncontended); QTest::newRow("QReadWriteLock, write") << FunctionPtrHolder(testUncontended); +#define ROW(n) \ + QTest::addRow("QReadWriteLock, %s, recursive: %d", "read", n) \ + << FunctionPtrHolder(testUncontended>); \ + QTest::addRow("QReadWriteLock, %s, recursive: %d", "write", n) \ + << FunctionPtrHolder(testUncontended>) + ROW(1); + ROW(2); + ROW(32); +#undef ROW QTest::newRow("std::mutex") << FunctionPtrHolder( testUncontended>>); #ifdef __cpp_lib_shared_mutex @@ -172,6 +224,13 @@ void tst_QReadWriteLock::readOnly_data() QTest::newRow("nothing") << FunctionPtrHolder(testReadOnly); QTest::newRow("QMutex") << FunctionPtrHolder(testReadOnly>); QTest::newRow("QReadWriteLock") << FunctionPtrHolder(testReadOnly); +#define ROW(n) \ + QTest::addRow("QReadWriteLock, recursive: %d", n) \ + << FunctionPtrHolder(testReadOnly>) + ROW(1); + ROW(2); + ROW(32); +#undef ROW QTest::newRow("std::mutex") << FunctionPtrHolder( testReadOnly>>); #ifdef __cpp_lib_shared_mutex @@ -233,6 +292,13 @@ void tst_QReadWriteLock::writeOnly_data() // QTest::newRow("nothing") << FunctionPtrHolder(testWriteOnly); QTest::newRow("QMutex") << FunctionPtrHolder(testWriteOnly>); QTest::newRow("QReadWriteLock") << FunctionPtrHolder(testWriteOnly); +#define ROW(n) \ + QTest::addRow("QReadWriteLock, recursive: %d", n) \ + << FunctionPtrHolder(testWriteOnly>) + ROW(1); + ROW(2); + ROW(32); +#undef ROW QTest::newRow("std::mutex") << FunctionPtrHolder( testWriteOnly>>); #ifdef __cpp_lib_shared_mutex -- cgit v1.2.3