qt5base-lts/tests/auto/corelib/tools
Giuseppe D'Angelo 06af9a1e38 QRegularExpression: refactor pattern optimization
After the move to PCRE2, optimizing patterns has been a thorn in the
side due to the fact that PCRE2's JIT compiler modifies the pattern
object itself (instead of returning a new set of data, like PCRE1
did). To make this fit with the existing behavior, a read/write
lock was introduced, with the read part locking when matching and
the write when compiling (or JIT-compiling) the pattern.

This locking strategy however introduced a performance issue,
as we needed:

* to acquire a write lock to compile/optimize the pattern (incl. the
common case where the pattern was already compiled, so bailing out
immediately);

* to acquire a read lock during the actual match, to prevent
some other thread from optimizing the pattern under our nose.

This was due to the "lazy" optimization policy of QRegularExpression
-- optimize a pattern after a certain number of usages. The
excessive amount of locking effectively limited scalability.

Simplify the code, and drop that policy altogether: since JIT
compiling in PCRE2 is faster and pretty much "always recommended",
just always do it for any pattern (unless it gets disabled via
env variables) when compiling it.

This allows to go back to a plain QMutex, and now the actual
matching doesn't require acquiring any locks any longer. Of course,
there is still a mutex acquired just before matching for checking
whether the pattern needs recompiling in the first place; this can
probably be further optimized via double-checked locking (using
atomics), but not doing it right now.

This shift makes a couple of pattern options controlling
optimization useless, and allows to centralize the 3
QRegularExpression tests (which were actually the very same test,
just setting slightly different optimizations strategies).

While at it, install a stress-test for threading, with the idea
of running it under TSAN or helgrind to catch bugs in
QRegularExpression's locking.

[ChangeLog][Important Behavior Changes][QRegularExpression] Regular
expressions are now automatically optimized (including JIT
compiling) on their first usage. The pattern options
OptimizeOnFirstUsageOption and DontAutomaticallyOptimizeOption no
longer have any effect, and will get removed in a future version of
Qt. QRegularExpression::optimize() can be still used to compile and
optimize the regular expression in advance (before any match), if
needed.

Task-number: QTBUG-66781
Change-Id: Ia0e97208ae78255fe811b78029ed01c204e47bd2
Reviewed-by: David Faure <david.faure@kdab.com>
2018-06-22 19:43:54 +00:00
..
collections implement non-member operator+ for iterators 2018-03-06 22:04:37 +00:00
containerapisymmetry Add front()/back() to QString, QStringRef, QByteArray and QLatin1String 2017-04-07 08:32:32 +00:00
qalgorithms Change almost all other uses of qrand() to QRandomGenerator 2017-11-08 09:14:03 +00:00
qarraydata tst_QArrayData: fix unused variable warning in reallocate() 2017-03-22 09:22:34 +00:00
qarraydata_strictiterators Make sure all containers compile in strict-iterator mode 2014-02-22 04:38:01 +01:00
qbitarray Updated license headers 2016-01-21 18:55:18 +00:00
qbytearray QByteArray: Add functions isUpper() and isLower() for Latin1 byte arrays 2018-02-17 12:23:24 +00:00
qbytearraylist Updated license headers 2016-01-21 18:55:18 +00:00
qbytearraymatcher Long live QStaticByteArrayMatcher! 2017-01-19 21:37:46 +00:00
qbytedatabuffer Updated license headers 2016-01-21 18:55:18 +00:00
qcache Updated license headers 2016-01-21 18:55:18 +00:00
qchar Merge remote-tracking branch 'origin/5.9' into 5.11 2018-02-14 12:51:24 +01:00
qcollator Support for Q_OS_ANDROID_EMBEDDED and android-embedded build flags 2018-01-20 18:16:59 +00:00
qcommandlineparser Support for Q_OS_ANDROID_EMBEDDED and android-embedded build flags 2018-01-20 18:16:59 +00:00
qcontiguouscache Updated license headers 2016-01-21 18:55:18 +00:00
qcryptographichash QCryptographicHash: Add a static method to retrieve hash length 2018-04-10 12:17:43 +00:00
qdate Raise the upper bound on years to 9999 2017-11-30 20:19:13 +00:00
qdatetime Revise dates of Pacific/Kiritimati's day-skip transition 2018-04-06 18:05:04 +00:00
qeasingcurve Animation: Fix case where QEasingCurve::valueForProgress returns nan 2018-03-26 15:53:10 +00:00
qexplicitlyshareddatapointer Add nullptr comparison to Q{Explicitly,}SharedDataPointer 2018-03-18 17:28:26 +00:00
qfreelist Use qtConfig throughout in qtbase 2016-08-19 04:28:05 +00:00
qhash Merge remote-tracking branch 'origin/5.9' into dev 2017-05-07 13:08:18 +02:00
qhash_strictiterators Make sure all containers compile in strict-iterator mode 2014-02-22 04:38:01 +01:00
qhashfunctions QHash: make it so a zero seed selects a constant algorithm 2017-04-26 15:22:44 +00:00
qlatin1string Replace Q_NULLPTR with nullptr where possible 2017-09-19 11:53:55 +00:00
qline Tests: Fix clang warnings about unused variables and captures 2018-05-02 09:36:00 +00:00
qlinkedlist Merge remote-tracking branch 'origin/5.6' into 5.7 2016-05-19 12:55:27 +02:00
qlist Merge remote-tracking branch 'origin/5.6' into 5.7 2016-05-19 12:55:27 +02:00
qlist_strictiterators Make sure all containers compile in strict-iterator mode 2014-02-22 04:38:01 +01:00
qlocale tst_QLocale: Avoid manual deletes 2018-04-06 05:44:50 +00:00
qmacautoreleasepool macOS: Detect use of heap-allocated QMacAutoReleasePool 2017-09-08 12:05:21 +00:00
qmap Implement key-value iterator 2017-05-05 14:25:56 +00:00
qmap_strictiterators Make sure all containers compile in strict-iterator mode 2014-02-22 04:38:01 +01:00
qmargins Updated license headers 2016-01-21 18:55:18 +00:00
qmessageauthenticationcode Updated license headers 2016-01-21 18:55:18 +00:00
qpair Merge remote-tracking branch 'origin/5.6' into 5.7 2016-07-15 20:47:57 +02:00
qpoint Updated license headers 2016-01-21 18:55:18 +00:00
qpointf Use qFuzzyCompare instead of qFuzzyIsNull in QPointF == 2018-05-30 08:28:11 +00:00
qqueue Updated license headers 2016-01-21 18:55:18 +00:00
qrect Improve rounding of QRect::toRect 2017-06-26 21:35:38 +00:00
qregexp QtCore: Remove Windows CE. 2016-03-30 11:22:47 +00:00
qregularexpression QRegularExpression: refactor pattern optimization 2018-06-22 19:43:54 +00:00
qringbuffer QRingBuffer: avoid reallocations of the data 2017-12-30 10:15:10 +00:00
qscopedpointer QScopedPointer: add get() 2017-09-17 11:42:26 +00:00
qscopedvaluerollback Updated license headers 2016-01-21 18:55:18 +00:00
qset Updated license headers 2016-01-21 18:55:18 +00:00
qsharedpointer Add support for QSharedPointer<cv qualified>::create() 2018-05-17 15:08:04 +00:00
qsize Updated license headers 2016-01-21 18:55:18 +00:00
qsizef Updated license headers 2016-01-21 18:55:18 +00:00
qstl Updated license headers 2016-01-21 18:55:18 +00:00
qstring Merge remote-tracking branch 'origin/5.11' into dev 2018-05-02 13:15:15 +02:00
qstring_no_cast_from_bytearray Updated license headers 2016-01-21 18:55:18 +00:00
qstringapisymmetry qstringapisymmetry: Fix XML parsing failing on invalid encodings 2018-03-02 07:59:12 +00:00
qstringbuilder QStringBuilder: add support for QStringView 2018-01-08 09:41:43 +00:00
qstringiterator QStringIterator: port to QStringView 2017-04-03 15:41:09 +00:00
qstringlist QStringList: add contains(QLatin1String) overload 2017-03-20 06:16:59 +00:00
qstringmatcher QStringMatcher: fix setCaseSensitivity() on a non-QString-backed matcher 2017-02-07 16:31:00 +00:00
qstringref Remove references to obsolete platforms 2017-11-05 06:33:53 +00:00
qstringview Fix license headers 2018-01-11 11:40:36 +00:00
qtextboundaryfinder Merge remote-tracking branch 'origin/5.9' into 5.11 2018-02-14 12:51:24 +01:00
qtime Raise the upper bound on years to 9999 2017-11-30 20:19:13 +00:00
qtimeline Blacklist flaky tst_QTimeLine tests on macOS 10.12 2017-06-18 12:58:53 +00:00
qtimezone Clean up some trivia in tst_QTimeZone 2018-04-12 11:48:06 +00:00
qvarlengtharray fixup oversight in rvalue overloads of operator+=() and operator<<() 2018-03-26 14:29:47 +00:00
qvector fixup oversight in rvalue overloads of operator+=() and operator<<() 2018-03-26 14:29:47 +00:00
qvector_strictiterators Make sure all containers compile in strict-iterator mode 2014-02-22 04:38:01 +01:00
qversionnumber Tests: Raise minimum supported MSVC version to 2015 2018-01-04 20:23:25 +00:00
tools.pro macOS: Detect use of heap-allocated QMacAutoReleasePool 2017-09-08 12:05:21 +00:00