diff options
author | Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> | 2016-01-03 14:38:58 +0100 |
---|---|---|
committer | Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> | 2016-12-12 15:22:01 +0000 |
commit | 9ca635482d649c59e312e6f1cd73df6685d280b0 (patch) | |
tree | 56ef7631ed10ee497136b889740f569b37974ef4 /config.tests | |
parent | 3ce6b1e578cbc78e428ca621930a016e8f61ac9b (diff) |
PCRE2: port QRegularExpression to PCRE2
PCRE1 is going towards EOL. PCRE2 is the way forward in terms
of new features, performance, and security improvements. The
APIs that QRegularExpression uses are similar so the required
modifications aren't extensive.
The biggest difference comes to JIT-compiling of the pattern.
In PCRE1, JIT-compiling did not modify the processed PCRE pattern,
but returned a new chunk of data.
This allowed multiple threads to keep matching using the same
processed data and NULL for the JIT data, until a thread
JIT-compiled and atomically set the shared JIT data to the results
of the compilation.
In PCRE2, JIT-compiling _modifies_ the processed PCRE pattern in a
way that it's thread unsafe [1]; the results of JIT-compilation
are stored somewhere inside the processed pattern.
This means the above approach cannot work -- a thread may be
matching while another one JIT-compiles, causing a data race.
While waiting for better workarounds from upstream, employ a
read/write mutex to protect the matching from JIT-compilation.
[1] https://lists.exim.org/lurker/message/20160104.105831.3cb25b39.en.html
[ChangeLog][General] QRegularExpression now requires the PCRE2
library, at least version 10.20. Support for the PCRE1 library
has been dropped. A copy of PCRE2 is shipped with Qt and will
automatically be used on those platforms which lack it.
Change-Id: I9fe11104230a096796df2d0bdcea861acf769f57
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'config.tests')
-rw-r--r-- | config.tests/unix/pcre/pcre.pro | 2 | ||||
-rw-r--r-- | config.tests/unix/pcre2/pcre2.cpp (renamed from config.tests/unix/pcre/pcre.cpp) | 6 | ||||
-rw-r--r-- | config.tests/unix/pcre2/pcre2.pro | 2 |
3 files changed, 5 insertions, 5 deletions
diff --git a/config.tests/unix/pcre/pcre.pro b/config.tests/unix/pcre/pcre.pro deleted file mode 100644 index a47e6d1e96..0000000000 --- a/config.tests/unix/pcre/pcre.pro +++ /dev/null @@ -1,2 +0,0 @@ -SOURCES = pcre.cpp -CONFIG -= qt dylib diff --git a/config.tests/unix/pcre/pcre.cpp b/config.tests/unix/pcre2/pcre2.cpp index 18f7f7d954..48130f97c4 100644 --- a/config.tests/unix/pcre/pcre.cpp +++ b/config.tests/unix/pcre2/pcre2.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2012 Giuseppe D'Angelo <dangelog@gmail.com>. +** Copyright (C) 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the config.tests of the Qt Toolkit. @@ -37,9 +37,9 @@ ** ****************************************************************************/ -#include <pcre.h> +#include <pcre2.h> -#if (PCRE_MAJOR < 8) || ((PCRE_MAJOR == 8) && (PCRE_MINOR < 31)) +#if (PCRE2_MAJOR < 10) || ((PCRE2_MAJOR == 10) && (PCRE_MINOR < 20)) #error This PCRE version is not supported #endif diff --git a/config.tests/unix/pcre2/pcre2.pro b/config.tests/unix/pcre2/pcre2.pro new file mode 100644 index 0000000000..6a3fc275bc --- /dev/null +++ b/config.tests/unix/pcre2/pcre2.pro @@ -0,0 +1,2 @@ +SOURCES = pcre2.cpp +CONFIG -= qt dylib |