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