summaryrefslogtreecommitdiffstats
path: root/src/corelib
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib')
-rw-r--r--src/corelib/codecs/qtextcodec.cpp4
-rw-r--r--src/corelib/global/qlogging.cpp18
-rw-r--r--src/corelib/io/qdebug.cpp4
-rw-r--r--src/corelib/io/qfiledevice.cpp6
-rw-r--r--src/corelib/io/qfilesystemwatcher_fsevents.mm3
-rw-r--r--src/corelib/io/qloggingcategory.cpp8
-rw-r--r--src/corelib/io/qprocess.cpp10
-rw-r--r--src/corelib/io/qstandardpaths.cpp8
-rw-r--r--src/corelib/io/qtemporarydir.cpp2
-rw-r--r--src/corelib/io/qtextstream.cpp16
-rw-r--r--src/corelib/io/qurl.cpp13
-rw-r--r--src/corelib/kernel/qfunctions_winrt.cpp4
-rw-r--r--src/corelib/kernel/qfunctions_winrt.h61
-rw-r--r--src/corelib/kernel/qjni.cpp83
-rw-r--r--src/corelib/kernel/qtranslator.cpp20
-rw-r--r--src/corelib/tools/qalgorithms.qdoc88
16 files changed, 197 insertions, 151 deletions
diff --git a/src/corelib/codecs/qtextcodec.cpp b/src/corelib/codecs/qtextcodec.cpp
index d2857c03b6..6eae9e598d 100644
--- a/src/corelib/codecs/qtextcodec.cpp
+++ b/src/corelib/codecs/qtextcodec.cpp
@@ -380,7 +380,7 @@ QTextCodec::ConverterState::~ConverterState()
If Qt is compiled with ICU support enabled, most codecs supported by
ICU will also be available to the application.
- QTextCodecs can be used as follows to convert some locally encoded
+ \l {QTextCodec}s can be used as follows to convert some locally encoded
string to Unicode. Suppose you have some string encoded in Russian
KOI8-R encoding, and want to convert it to Unicode. The simple way
to do it is like this:
@@ -453,7 +453,7 @@ QTextCodec::ConverterState::~ConverterState()
\li Converts a Unicode string to an 8-bit character string.
\endtable
- \sa QTextStream, QTextDecoder, QTextEncoder, {Codecs Example}
+ \sa QTextStream, QTextDecoder, QTextEncoder, {Text Codecs Example}
*/
/*!
diff --git a/src/corelib/global/qlogging.cpp b/src/corelib/global/qlogging.cpp
index 39c5ac602e..843ec6b0ca 100644
--- a/src/corelib/global/qlogging.cpp
+++ b/src/corelib/global/qlogging.cpp
@@ -1201,11 +1201,14 @@ QString qFormatLogMessage(QtMsgType type, const QMessageLogContext &context, con
}
#endif
} else if (token == timeTokenC) {
- quint64 ms = pattern->timer.elapsed();
- if (pattern->timeFormat.isEmpty())
+ if (pattern->timeFormat == QLatin1String("process")) {
+ quint64 ms = pattern->timer.elapsed();
message.append(QString().sprintf("%6d.%03d", uint(ms / 1000), uint(ms % 1000)));
- else
- message.append(pattern->startTime.addMSecs(ms).toString(pattern->timeFormat));
+ } else if (pattern->timeFormat.isEmpty()) {
+ message.append(QDateTime::currentDateTime().toString(Qt::ISODate));
+ } else {
+ message.append(QDateTime::currentDateTime().toString(pattern->timeFormat));
+ }
#endif
} else if (token == ifCategoryTokenC) {
if (!context.category || (strcmp(context.category, "default") == 0))
@@ -1550,9 +1553,10 @@ void qErrnoWarning(int code, const char *msg, ...)
\row \li \c %{pid} \li QCoreApplication::applicationPid()
\row \li \c %{threadid} \li ID of current thread
\row \li \c %{type} \li "debug", "warning", "critical" or "fatal"
- \row \li \c %{time} \li time of the message, in seconds since the process started
- \row \li \c %{time format} \li system time when the message occurred, formatted by
- passing the \c format to \l QDateTime::toString()
+ \row \li \c %{time process} \li time of the message, in seconds since the process started (the token "process" is literal)
+ \row \li \c %{time [format]} \li system time when the message occurred, formatted by
+ passing the \c format to \l QDateTime::toString(). If the format is
+ not specified, the format of Qt::ISODate is used.
\row \li \c{%{backtrace [depth=N] [separator="..."]}} \li A backtrace with the number of frames
specified by the optional \c depth parameter (defaults to 5), and separated by the optional
\c separator parameter (defaults to "|").
diff --git a/src/corelib/io/qdebug.cpp b/src/corelib/io/qdebug.cpp
index 9eed1f352a..050a48bd65 100644
--- a/src/corelib/io/qdebug.cpp
+++ b/src/corelib/io/qdebug.cpp
@@ -425,8 +425,8 @@ QDebug &QDebug::resetFormat()
\brief Convenience class for custom QDebug operators
Saves the settings used by QDebug, and restores them upon destruction,
- then calls maybeSpace(), to separate arguments with a space if
- autoInsertSpaces() was true at the time of constructing the QDebugStateSaver.
+ then calls \l {QDebug::maybeSpace()}{maybeSpace()}, to separate arguments with a space if
+ \l {QDebug::autoInsertSpaces()}{autoInsertSpaces()} was true at the time of constructing the QDebugStateSaver.
The automatic insertion of spaces between writes is one of the settings
that QDebugStateSaver stores for the duration of the current block.
diff --git a/src/corelib/io/qfiledevice.cpp b/src/corelib/io/qfiledevice.cpp
index 598347a56f..29b59f1dcc 100644
--- a/src/corelib/io/qfiledevice.cpp
+++ b/src/corelib/io/qfiledevice.cpp
@@ -240,7 +240,7 @@ bool QFileDevice::isSequential() const
Returns the file handle of the file.
This is a small positive integer, suitable for use with C library
- functions such as fdopen() and fcntl(). On systems that use file
+ functions such as \c fdopen() and \c fcntl(). On systems that use file
descriptors for sockets (i.e. Unix systems, but not Windows) the handle
can be used with QSocketNotifier as well.
@@ -389,9 +389,9 @@ bool QFileDevice::atEnd() const
return false.
Seeking beyond the end of a file:
- If the position is beyond the end of a file, then seek() shall not
+ If the position is beyond the end of a file, then seek() will not
immediately extend the file. If a write is performed at this position,
- then the file shall be extended. The content of the file between the
+ then the file will be extended. The content of the file between the
previous end of file and the newly written data is UNDEFINED and
varies between platforms and file systems.
*/
diff --git a/src/corelib/io/qfilesystemwatcher_fsevents.mm b/src/corelib/io/qfilesystemwatcher_fsevents.mm
index eebca1cfb0..90ef7a6336 100644
--- a/src/corelib/io/qfilesystemwatcher_fsevents.mm
+++ b/src/corelib/io/qfilesystemwatcher_fsevents.mm
@@ -518,7 +518,6 @@ bool QFseventsFileSystemWatcherEngine::startStream()
NULL
};
const CFAbsoluteTime latency = .5; // in seconds
- FSEventStreamCreateFlags flags = kFSEventStreamCreateFlagWatchRoot;
// Never start with kFSEventStreamEventIdSinceNow, because this will generate an invalid
// soft-assert in FSEventStreamFlushSync in CarbonCore when no event occurred.
@@ -530,7 +529,7 @@ bool QFseventsFileSystemWatcherEngine::startStream()
reinterpret_cast<CFArrayRef>(pathsToWatch),
lastReceivedEvent,
latency,
- flags);
+ FSEventStreamCreateFlags(0));
if (!stream) {
DEBUG() << "Failed to create stream!";
diff --git a/src/corelib/io/qloggingcategory.cpp b/src/corelib/io/qloggingcategory.cpp
index fef48a9040..79d20601a6 100644
--- a/src/corelib/io/qloggingcategory.cpp
+++ b/src/corelib/io/qloggingcategory.cpp
@@ -149,10 +149,10 @@ static void setBoolLane(QBasicAtomicInt *atomic, bool enable, int shift)
Order of evaluation:
\list
- \li Rules from QtProject/qtlogging.ini
- \li Rules set by \l setFilterRules()
- \li Rules from file in \c QT_LOGGING_CONF
- \li Rules from environment variable QT_LOGGING_RULES
+ \li QtProject/qtlogging.ini
+ \li \l setFilterRules()
+ \li \c QT_LOGGING_CONF
+ \li \c QT_LOGGING_RULES
\endlist
The \c QtProject/qtlogging.ini file is looked up in all directories returned
diff --git a/src/corelib/io/qprocess.cpp b/src/corelib/io/qprocess.cpp
index e76a836954..a234050777 100644
--- a/src/corelib/io/qprocess.cpp
+++ b/src/corelib/io/qprocess.cpp
@@ -1853,8 +1853,8 @@ void QProcess::setProcessState(ProcessState state)
/*!
This function is called in the child process context just before the
- program is executed on Unix or Mac OS X (i.e., after \e fork(), but before
- \e execve()). Reimplement this function to do last minute initialization
+ program is executed on Unix or OS X (i.e., after \c fork(), but before
+ \c execve()). Reimplement this function to do last minute initialization
of the child process. Example:
\snippet code/src_corelib_io_qprocess.cpp 4
@@ -1864,7 +1864,7 @@ void QProcess::setProcessState(ProcessState state)
execution, your workaround is to emit finished() and then call
exit().
- \warning This function is called by QProcess on Unix and Mac OS X
+ \warning This function is called by QProcess on Unix and OS X
only. On Windows and QNX, it is not called.
*/
void QProcess::setupChildProcess()
@@ -2272,7 +2272,7 @@ void QProcess::setArguments(const QStringList &arguments)
On Windows, terminate() posts a WM_CLOSE message to all toplevel windows
of the process and then to the main thread of the process itself. On Unix
- and Mac OS X the SIGTERM signal is sent.
+ and OS X the \c SIGTERM signal is sent.
Console applications on Windows that do not run an event loop, or whose
event loop does not handle the WM_CLOSE message, can only be terminated by
@@ -2289,7 +2289,7 @@ void QProcess::terminate()
/*!
Kills the current process, causing it to exit immediately.
- On Windows, kill() uses TerminateProcess, and on Unix and Mac OS X, the
+ On Windows, kill() uses TerminateProcess, and on Unix and OS X, the
SIGKILL signal is sent to the process.
\sa terminate()
diff --git a/src/corelib/io/qstandardpaths.cpp b/src/corelib/io/qstandardpaths.cpp
index 6950d58fda..b41aee55d2 100644
--- a/src/corelib/io/qstandardpaths.cpp
+++ b/src/corelib/io/qstandardpaths.cpp
@@ -588,11 +588,11 @@ QString QStandardPaths::displayName(StandardLocation type)
GenericCacheLocation, CacheLocation.
Other locations are not affected.
- On Unix, XDG_DATA_HOME is set to ~/.qttest/share, XDG_CONFIG_HOME is
- set to ~/.qttest/config, and XDG_CACHE_HOME is set to ~/.qttest/cache.
+ On Unix, \c XDG_DATA_HOME is set to \e ~/.qttest/share, \c XDG_CONFIG_HOME is
+ set to \e ~/.qttest/config, and \c XDG_CACHE_HOME is set to \e ~/.qttest/cache.
- On Mac, data goes to "~/.qttest/Application Support", cache goes to
- ~/.qttest/Cache, and config goes to ~/.qttest/Preferences.
+ On OS X, data goes to \e ~/.qttest/Application Support, cache goes to
+ \e ~/.qttest/Cache, and config goes to \e ~/.qttest/Preferences.
On Windows, everything goes to a "qttest" directory under Application Data.
*/
diff --git a/src/corelib/io/qtemporarydir.cpp b/src/corelib/io/qtemporarydir.cpp
index 7ce37fd320..5e0def74ee 100644
--- a/src/corelib/io/qtemporarydir.cpp
+++ b/src/corelib/io/qtemporarydir.cpp
@@ -180,7 +180,7 @@ void QTemporaryDirPrivate::create(const QString &templateName)
\snippet code/src_corelib_io_qtemporarydir.cpp 0
It is very important to test that the temporary directory could be
- created, using isValid(). Do not use exists(), since a default-constructed
+ created, using isValid(). Do not use \l {QDir::exists()}{exists()}, since a default-constructed
QDir represents the current directory, which exists.
The path to the temporary dir can be found by calling path().
diff --git a/src/corelib/io/qtextstream.cpp b/src/corelib/io/qtextstream.cpp
index 6cbe91fab2..18cf58d397 100644
--- a/src/corelib/io/qtextstream.cpp
+++ b/src/corelib/io/qtextstream.cpp
@@ -85,8 +85,8 @@ static const int QTEXTSTREAM_BUFFERSIZE = 16384;
\li Chunk by chunk, by calling readLine() or readAll().
- \li Word by word. QTextStream supports streaming into QStrings,
- QByteArrays and char* buffers. Words are delimited by space, and
+ \li Word by word. QTextStream supports streaming into \l {QString}s,
+ \l {QByteArray}s and char* buffers. Words are delimited by space, and
leading white space is automatically skipped.
\li Character by character, by streaming into QChar or char types.
@@ -158,7 +158,7 @@ static const int QTEXTSTREAM_BUFFERSIZE = 16384;
parameter: qSetFieldWidth(), qSetPadChar(), and
qSetRealNumberPrecision().
- \sa QDataStream, QIODevice, QFile, QBuffer, QTcpSocket, {Codecs Example}
+ \sa QDataStream, QIODevice, QFile, QBuffer, QTcpSocket, {Text Codecs Example}
*/
/*! \enum QTextStream::RealNumberNotation
@@ -1557,7 +1557,7 @@ bool QTextStream::atEnd() const
QString. Avoid this function when working on large files, as it
will consume a significant amount of memory.
- Calling readLine() is better if you do not know how much data is
+ Calling \l {QTextStream::readLine()}{readLine()} is better if you do not know how much data is
available.
\sa readLine()
@@ -1582,9 +1582,9 @@ QString QTextStream::readAll()
The returned line has no trailing end-of-line characters ("\\n"
or "\\r\\n"), so calling QString::trimmed() is unnecessary.
- If the stream has read to the end of the file, readLine() will return a
- null QString. For strings, or for devices that support it, you can
- explicitly test for the end of the stream using atEnd().
+ If the stream has read to the end of the file, \l {QTextStream::readLine()}{readLine()}
+ will return a null QString. For strings, or for devices that support it,
+ you can explicitly test for the end of the stream using atEnd().
\sa readAll(), QIODevice::readLine()
*/
@@ -2816,7 +2816,7 @@ QTextStream &endl(QTextStream &stream)
/*!
\relates QTextStream
- Calls QTextStream::flush() on \a stream and returns \a stream.
+ Calls \l{QTextStream::flush()}{flush()} on \a stream and returns \a stream.
\sa endl(), reset(), {QTextStream manipulators}
*/
diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp
index b21e9b51e1..eb97eaf6d6 100644
--- a/src/corelib/io/qurl.cpp
+++ b/src/corelib/io/qurl.cpp
@@ -2687,8 +2687,8 @@ void QUrl::setQuery(const QUrlQuery &query)
Sets the query string of the URL to an encoded version of \a
query. The contents of \a query are converted to a string
internally, each pair delimited by the character returned by
- queryPairDelimiter(), and the key and value are delimited by
- queryValueDelimiter().
+ \l {QUrlQuery::queryPairDelimiter()}{queryPairDelimiter()}, and the key and value are delimited by
+ \l {QUrlQuery::queryValueDelimiter()}{queryValueDelimiter()}
\note This method does not encode spaces (ASCII 0x20) as plus (+) signs,
like HTML forms do. If you need that kind of encoding, you must encode
@@ -2707,8 +2707,8 @@ void QUrl::setQuery(const QUrlQuery &query)
Sets the query string of the URL to the encoded version of \a
query. The contents of \a query are converted to a string
internally, each pair delimited by the character returned by
- queryPairDelimiter(), and the key and value are delimited by
- queryValueDelimiter().
+ \l {QUrlQuery::queryPairDelimiter()}{queryPairDelimiter()}, and the key and value are delimited by
+ \l {QUrlQuery::queryValueDelimiter()}{queryValueDelimiter()}.
\obsolete Use QUrlQuery and setQuery().
@@ -2725,8 +2725,9 @@ void QUrl::setQuery(const QUrlQuery &query)
The key-value pair is encoded before it is added to the query. The
pair is converted into separate strings internally. The \a key and
\a value is first encoded into UTF-8 and then delimited by the
- character returned by queryValueDelimiter(). Each key-value pair is
- delimited by the character returned by queryPairDelimiter().
+ character returned by \l {QUrlQuery::queryValueDelimiter()}{queryValueDelimiter()}.
+ Each key-value pair is delimited by the character returned by
+ \l {QUrlQuery::queryPairDelimiter()}{queryPairDelimiter()}
\note This method does not encode spaces (ASCII 0x20) as plus (+) signs,
like HTML forms do. If you need that kind of encoding, you must encode
diff --git a/src/corelib/kernel/qfunctions_winrt.cpp b/src/corelib/kernel/qfunctions_winrt.cpp
index 84e7b5688f..60faead122 100644
--- a/src/corelib/kernel/qfunctions_winrt.cpp
+++ b/src/corelib/kernel/qfunctions_winrt.cpp
@@ -37,7 +37,7 @@
#include "qbytearray.h"
#include "qhash.h"
-QT_USE_NAMESPACE
+QT_BEGIN_NAMESPACE
// Environment ------------------------------------------------------
inline QHash<QByteArray, QByteArray> &qt_app_environment()
@@ -94,4 +94,6 @@ void qt_winrt__tzset()
{
}
+QT_END_NAMESPACE
+
#endif // Q_OS_WINRT
diff --git a/src/corelib/kernel/qfunctions_winrt.h b/src/corelib/kernel/qfunctions_winrt.h
index 04ebda5cfe..2bec1fc2ff 100644
--- a/src/corelib/kernel/qfunctions_winrt.h
+++ b/src/corelib/kernel/qfunctions_winrt.h
@@ -42,21 +42,36 @@
#include <QtCore/QAbstractEventDispatcher>
#include <QtCore/qt_windows.h>
-QT_BEGIN_NAMESPACE
+// Convenience macros for handling HRESULT values
+#define RETURN_IF_FAILED(msg, ret) \
+ if (FAILED(hr)) { \
+ qErrnoWarning(hr, msg); \
+ ret; \
+ }
-#ifdef QT_BUILD_CORE_LIB
-#endif
+#define RETURN_HR_IF_FAILED(msg) RETURN_IF_FAILED(msg, return hr)
+#define RETURN_OK_IF_FAILED(msg) RETURN_IF_FAILED(msg, return S_OK)
+#define RETURN_FALSE_IF_FAILED(msg) RETURN_IF_FAILED(msg, return false)
+#define RETURN_VOID_IF_FAILED(msg) RETURN_IF_FAILED(msg, return)
-QT_END_NAMESPACE
+#define Q_ASSERT_SUCCEEDED(hr) \
+ Q_ASSERT_X(SUCCEEDED(hr), Q_FUNC_INFO, qPrintable(qt_error_string(hr)));
#ifdef Q_OS_WINRT
+QT_BEGIN_NAMESPACE
+
+#ifdef QT_BUILD_CORE_LIB
+#endif
+
// Environment ------------------------------------------------------
errno_t qt_winrt_getenv_s(size_t*, char*, size_t, const char*);
errno_t qt_winrt__putenv_s(const char*, const char*);
void qt_winrt_tzset();
void qt_winrt__tzset();
+QT_END_NAMESPACE
+
// As Windows Runtime lacks some standard functions used in Qt, these got
// reimplemented. Other projects do this as well. Inline functions are used
// that there is a central place to disable functions for newer versions if
@@ -69,42 +84,42 @@ void qt_winrt__tzset();
#define generate_inline_return_func0(funcname, returntype) \
inline returntype funcname() \
{ \
- return qt_winrt_##funcname(); \
+ return QT_PREPEND_NAMESPACE(qt_winrt_##funcname)(); \
}
#define generate_inline_return_func1(funcname, returntype, param1) \
inline returntype funcname(param1 p1) \
{ \
- return qt_winrt_##funcname(p1); \
+ return QT_PREPEND_NAMESPACE(qt_winrt_##funcname)(p1); \
}
#define generate_inline_return_func2(funcname, returntype, param1, param2) \
inline returntype funcname(param1 p1, param2 p2) \
{ \
- return qt_winrt_##funcname(p1, p2); \
+ return QT_PREPEND_NAMESPACE(qt_winrt_##funcname)(p1, p2); \
}
#define generate_inline_return_func3(funcname, returntype, param1, param2, param3) \
inline returntype funcname(param1 p1, param2 p2, param3 p3) \
{ \
- return qt_winrt_##funcname(p1, p2, p3); \
+ return QT_PREPEND_NAMESPACE(qt_winrt_##funcname)(p1, p2, p3); \
}
#define generate_inline_return_func4(funcname, returntype, param1, param2, param3, param4) \
inline returntype funcname(param1 p1, param2 p2, param3 p3, param4 p4) \
{ \
- return qt_winrt_##funcname(p1, p2, p3, p4); \
+ return QT_PREPEND_NAMESPACE(qt_winrt_##funcname)(p1, p2, p3, p4); \
}
#define generate_inline_return_func5(funcname, returntype, param1, param2, param3, param4, param5) \
inline returntype funcname(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \
{ \
- return qt_winrt_##funcname(p1, p2, p3, p4, p5); \
+ return QT_PREPEND_NAMESPACE(qt_winrt_##funcname)(p1, p2, p3, p4, p5); \
}
#define generate_inline_return_func6(funcname, returntype, param1, param2, param3, param4, param5, param6) \
inline returntype funcname(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6) \
{ \
- return qt_winrt_##funcname(p1, p2, p3, p4, p5, p6); \
+ return QT_PREPEND_NAMESPACE(qt_winrt_##funcname)(p1, p2, p3, p4, p5, p6); \
}
#define generate_inline_return_func7(funcname, returntype, param1, param2, param3, param4, param5, param6, param7) \
inline returntype funcname(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7) \
{ \
- return qt_winrt_##funcname(p1, p2, p3, p4, p5, p6, p7); \
+ return QT_PREPEND_NAMESPACE(qt_winrt_##funcname)(p1, p2, p3, p4, p5, p6, p7); \
}
typedef unsigned (__stdcall *StartAdressExFunc)(void *);
@@ -116,23 +131,7 @@ generate_inline_return_func2(_putenv_s, errno_t, const char *, const char *)
generate_inline_return_func0(tzset, void)
generate_inline_return_func0(_tzset, void)
-#endif // Q_OS_WINRT
-
-// Convenience macros for handling HRESULT values
-#define RETURN_IF_FAILED(msg, ret) \
- if (FAILED(hr)) { \
- qErrnoWarning(hr, msg); \
- ret; \
- }
-
-#define RETURN_HR_IF_FAILED(msg) RETURN_IF_FAILED(msg, return hr)
-#define RETURN_OK_IF_FAILED(msg) RETURN_IF_FAILED(msg, return S_OK)
-#define RETURN_FALSE_IF_FAILED(msg) RETURN_IF_FAILED(msg, return false)
-#define RETURN_VOID_IF_FAILED(msg) RETURN_IF_FAILED(msg, return)
-
-#define Q_ASSERT_SUCCEEDED(hr) \
- Q_ASSERT_X(SUCCEEDED(hr), Q_FUNC_INFO, qPrintable(qt_error_string(hr)));
-
+QT_BEGIN_NAMESPACE
namespace Microsoft { namespace WRL { template <typename T> class ComPtr; } }
@@ -207,6 +206,10 @@ static inline HRESULT await(const Microsoft::WRL::ComPtr<T> &asyncOp, U *results
} // QWinRTFunctions
+QT_END_NAMESPACE
+
+#endif // Q_OS_WINRT
+
#endif // Q_OS_WIN
#endif // QFUNCTIONS_WINRT_H
diff --git a/src/corelib/kernel/qjni.cpp b/src/corelib/kernel/qjni.cpp
index b179323fdc..9d74fd69de 100644
--- a/src/corelib/kernel/qjni.cpp
+++ b/src/corelib/kernel/qjni.cpp
@@ -37,6 +37,7 @@
#include <QtCore/qhash.h>
#include <QtCore/qstring.h>
#include <QtCore/QThread>
+#include <QtCore/QReadWriteLock>
QT_BEGIN_NAMESPACE
@@ -45,11 +46,6 @@ static inline QString keyBase()
return QStringLiteral("%1%2%3");
}
-static inline QByteArray threadBaseName()
-{
- return QByteArrayLiteral("QtThread-");
-}
-
static QString qt_convertJString(jstring string)
{
QJNIEnvironmentPrivate env;
@@ -74,6 +70,7 @@ static inline bool exceptionCheckAndClear(JNIEnv *env)
typedef QHash<QString, jclass> JClassHash;
Q_GLOBAL_STATIC(JClassHash, cachedClasses)
+Q_GLOBAL_STATIC(QReadWriteLock, cachedClassesLock)
static QString toDotEncodedClassName(const char *className)
{
@@ -82,8 +79,9 @@ static QString toDotEncodedClassName(const char *className)
static jclass getCachedClass(const QString &classDotEnc, bool *isCached = 0)
{
- QHash<QString, jclass>::iterator it = cachedClasses->find(classDotEnc);
- const bool found = (it != cachedClasses->end());
+ QReadLocker locker(cachedClassesLock);
+ const QHash<QString, jclass>::const_iterator &it = cachedClasses->constFind(classDotEnc);
+ const bool found = (it != cachedClasses->constEnd());
if (isCached != 0)
*isCached = found;
@@ -102,6 +100,12 @@ static jclass loadClassDotEnc(const QString &classDotEnc, JNIEnv *env)
if (!classLoader.isValid())
return 0;
+ QWriteLocker locker(cachedClassesLock);
+ // did we lose the race?
+ const QHash<QString, jclass>::const_iterator &it = cachedClasses->constFind(classDotEnc);
+ if (it != cachedClasses->constEnd())
+ return it.value();
+
QJNIObjectPrivate stringName = QJNIObjectPrivate::fromString(classDotEnc);
QJNIObjectPrivate classObject = classLoader.callObjectMethod("loadClass",
"(Ljava/lang/String;)Ljava/lang/Class;",
@@ -121,6 +125,7 @@ inline static jclass loadClass(const char *className, JNIEnv *env)
typedef QHash<QString, jmethodID> JMethodIDHash;
Q_GLOBAL_STATIC(JMethodIDHash, cachedMethodID)
+Q_GLOBAL_STATIC(QReadWriteLock, cachedMethodIDLock)
static jmethodID getCachedMethodID(JNIEnv *env,
jclass clazz,
@@ -128,11 +133,24 @@ static jmethodID getCachedMethodID(JNIEnv *env,
const char *sig,
bool isStatic = false)
{
- jmethodID id = 0;
// TODO: We need to use something else then the ref. from clazz to avoid collisions.
- QString key = keyBase().arg(size_t(clazz)).arg(QLatin1String(name)).arg(QLatin1String(sig));
- QHash<QString, jmethodID>::iterator it = cachedMethodID->find(key);
- if (it == cachedMethodID->end()) {
+ const QString key = keyBase().arg(size_t(clazz)).arg(QLatin1String(name)).arg(QLatin1String(sig));
+ QHash<QString, jmethodID>::const_iterator it;
+
+ {
+ QReadLocker locker(cachedMethodIDLock);
+ it = cachedMethodID->constFind(key);
+ if (it != cachedMethodID->constEnd())
+ return it.value();
+ }
+
+ {
+ QWriteLocker locker(cachedMethodIDLock);
+ it = cachedMethodID->constFind(key);
+ if (it != cachedMethodID->constEnd())
+ return it.value();
+
+ jmethodID id = 0;
if (isStatic)
id = env->GetStaticMethodID(clazz, name, sig);
else
@@ -142,14 +160,13 @@ static jmethodID getCachedMethodID(JNIEnv *env,
id = 0;
cachedMethodID->insert(key, id);
- } else {
- id = it.value();
+ return id;
}
- return id;
}
typedef QHash<QString, jfieldID> JFieldIDHash;
Q_GLOBAL_STATIC(JFieldIDHash, cachedFieldID)
+Q_GLOBAL_STATIC(QReadWriteLock, cachedFieldIDLock)
static jfieldID getCachedFieldID(JNIEnv *env,
jclass clazz,
@@ -157,10 +174,23 @@ static jfieldID getCachedFieldID(JNIEnv *env,
const char *sig,
bool isStatic = false)
{
- jfieldID id = 0;
- QString key = keyBase().arg(size_t(clazz)).arg(QLatin1String(name)).arg(QLatin1String(sig));
- QHash<QString, jfieldID>::iterator it = cachedFieldID->find(key);
- if (it == cachedFieldID->end()) {
+ const QString key = keyBase().arg(size_t(clazz)).arg(QLatin1String(name)).arg(QLatin1String(sig));
+ QHash<QString, jfieldID>::const_iterator it;
+
+ {
+ QReadLocker locker(cachedFieldIDLock);
+ it = cachedFieldID->constFind(key);
+ if (it != cachedFieldID->constEnd())
+ return it.value();
+ }
+
+ {
+ QWriteLocker locker(cachedFieldIDLock);
+ it = cachedFieldID->constFind(key);
+ if (it != cachedFieldID->constEnd())
+ return it.value();
+
+ jfieldID id = 0;
if (isStatic)
id = env->GetStaticFieldID(clazz, name, sig);
else
@@ -170,10 +200,8 @@ static jfieldID getCachedFieldID(JNIEnv *env,
id = 0;
cachedFieldID->insert(key, id);
- } else {
- id = it.value();
+ return id;
}
- return id;
}
class QJNIEnvironmentPrivateTLS
@@ -187,14 +215,14 @@ public:
Q_GLOBAL_STATIC(QThreadStorage<QJNIEnvironmentPrivateTLS *>, jniEnvTLS)
+static const char qJniThreadName[] = "QtThread";
+
QJNIEnvironmentPrivate::QJNIEnvironmentPrivate()
: jniEnv(0)
{
JavaVM *vm = QtAndroidPrivate::javaVM();
if (vm->GetEnv((void**)&jniEnv, JNI_VERSION_1_6) == JNI_EDETACHED) {
- const qulonglong id = reinterpret_cast<qulonglong>(QThread::currentThreadId());
- const QByteArray threadName = threadBaseName() + QByteArray::number(id);
- JavaVMAttachArgs args = { JNI_VERSION_1_6, threadName, Q_NULLPTR };
+ JavaVMAttachArgs args = { JNI_VERSION_1_6, qJniThreadName, Q_NULLPTR };
if (vm->AttachCurrentThread(&jniEnv, &args) != JNI_OK)
return;
}
@@ -223,6 +251,12 @@ jclass QJNIEnvironmentPrivate::findClass(const char *className, JNIEnv *env)
return clazz;
if (env != 0) { // We got an env. pointer (We expect this to be the right env. and call FindClass())
+ QWriteLocker locker(cachedClassesLock);
+ const QHash<QString, jclass>::const_iterator &it = cachedClasses->constFind(classDotEnc);
+ // Did we lose the race?
+ if (it != cachedClasses->constEnd())
+ return it.value();
+
jclass fclazz = env->FindClass(className);
if (!exceptionCheckAndClear(env)) {
clazz = static_cast<jclass>(env->NewGlobalRef(fclazz));
@@ -400,7 +434,6 @@ QJNIObjectPrivate::QJNIObjectPrivate(jobject obj)
d->m_jclass = static_cast<jclass>(env->NewGlobalRef(objectClass));
env->DeleteLocalRef(objectClass);
}
-
template <>
void QJNIObjectPrivate::callMethodV<void>(const char *methodName, const char *sig, va_list args) const
{
diff --git a/src/corelib/kernel/qtranslator.cpp b/src/corelib/kernel/qtranslator.cpp
index a2cf4a7813..a9c608384a 100644
--- a/src/corelib/kernel/qtranslator.cpp
+++ b/src/corelib/kernel/qtranslator.cpp
@@ -86,13 +86,13 @@ static const uchar magic[MagicLength] = {
0xcd, 0x21, 0x1c, 0xbf, 0x60, 0xa1, 0xbd, 0xdd
};
-static bool match(const uchar* found, const char* target, uint len)
+static bool match(const uchar *found, uint foundLen, const char *target, uint targetLen)
{
// catch the case if \a found has a zero-terminating symbol and \a len includes it.
// (normalize it to be without the zero-terminating symbol)
- if (len > 0 && found[len-1] == '\0')
- --len;
- return (memcmp(found, target, len) == 0 && target[len] == '\0');
+ if (foundLen > 0 && found[foundLen-1] == '\0')
+ --foundLen;
+ return ((targetLen == foundLen) && memcmp(found, target, foundLen) == 0);
}
static void elfHash_continue(const char *name, uint &h)
@@ -878,6 +878,9 @@ static QString getMessage(const uchar *m, const uchar *end, const char *context,
{
const uchar *tn = 0;
uint tn_length = 0;
+ const uint sourceTextLen = uint(strlen(sourceText));
+ const uint contextLen = uint(strlen(context));
+ const uint commentLen = uint(strlen(comment));
for (;;) {
uchar tag = 0;
@@ -904,7 +907,7 @@ static QString getMessage(const uchar *m, const uchar *end, const char *context,
case Tag_SourceText: {
quint32 len = read32(m);
m += 4;
- if (!match(m, sourceText, len))
+ if (!match(m, len, sourceText, sourceTextLen))
return QString();
m += len;
}
@@ -912,7 +915,7 @@ static QString getMessage(const uchar *m, const uchar *end, const char *context,
case Tag_Context: {
quint32 len = read32(m);
m += 4;
- if (!match(m, context, len))
+ if (!match(m, len, context, contextLen))
return QString();
m += len;
}
@@ -920,7 +923,7 @@ static QString getMessage(const uchar *m, const uchar *end, const char *context,
case Tag_Comment: {
quint32 len = read32(m);
m += 4;
- if (*m && !match(m, comment, len))
+ if (*m && !match(m, len, comment, commentLen))
return QString();
m += len;
}
@@ -970,11 +973,12 @@ QString QTranslatorPrivate::do_translate(const char *context, const char *source
return QString();
c = contextArray + (2 + (hTableSize << 1) + (off << 1));
+ const uint contextLen = uint(strlen(context));
for (;;) {
quint8 len = read8(c++);
if (len == 0)
return QString();
- if (match(c, context, len))
+ if (match(c, len, context, contextLen))
break;
c += len;
}
diff --git a/src/corelib/tools/qalgorithms.qdoc b/src/corelib/tools/qalgorithms.qdoc
index 5e5a2b42e2..226a63ccae 100644
--- a/src/corelib/tools/qalgorithms.qdoc
+++ b/src/corelib/tools/qalgorithms.qdoc
@@ -168,43 +168,43 @@
\li STL function
\row
\li qBinaryFind
- \li std::binary_search or std::lower_bound
+ \li \c std::binary_search or \c std::lower_bound
\row
\li qCopy
- \li std::copy
+ \li \c std::copy
\row
\li qCopyBackward
- \li std::copy_backward
+ \li \c std::copy_backward
\row
\li qEqual
- \li std::equal
+ \li \c std::equal
\row
\li qFill
- \li std::fill
+ \li \c std::fill
\row
\li qFind
- \li std::find
+ \li \c std::find
\row
\li qCount
- \li std::count
+ \li \c std::count
\row
\li qSort
- \li std::sort
+ \li \c std::sort
\row
\li qStableSort
- \li std::stable_sort
+ \li \c std::stable_sort
\row
\li qLowerBound
- \li std::lower_bound
+ \li \c std::lower_bound
\row
\li qUpperBound
- \li std::upper_bound
+ \li \c std::upper_bound
\row
\li qLess
- \li std::less
+ \li \c std::less
\row
\li qGreater
- \li std::greater
+ \li \c std::greater
\endtable
@@ -223,7 +223,7 @@
Instead, since it's not possible to pass a custom swapper functor to STL
functions, the only workaround for a template specialization for qSwap() is
- providing the same specialization for std::swap().
+ providing the same specialization for \c std::swap().
\sa {container classes}, <QtGlobal>
*/
@@ -232,7 +232,7 @@
\relates <QtAlgorithms>
\deprecated
- Use std::copy instead.
+ Use \c std::copy instead.
Copies the items from range [\a begin1, \a end1) to range [\a
begin2, ...), in the order in which they appear.
@@ -251,7 +251,7 @@
\relates <QtAlgorithms>
\deprecated
- Use std::copy_backward instead.
+ Use \c std::copy_backward instead.
Copies the items from range [\a begin1, \a end1) to range [...,
\a end2).
@@ -270,7 +270,7 @@
\relates <QtAlgorithms>
\deprecated
- Use std::equal instead.
+ Use \c std::equal instead.
Compares the items in the range [\a begin1, \a end1) with the
items in the range [\a begin2, ...). Returns \c true if all the
@@ -289,7 +289,7 @@
\relates <QtAlgorithms>
\deprecated
- Use std::fill instead.
+ Use \c std::fill instead.
Fills the range [\a begin, \a end) with \a value.
@@ -304,7 +304,7 @@
\deprecated
\overload
- Use std::fill instead.
+ Use \c std::fill instead.
This is the same as qFill(\a{container}.begin(), \a{container}.end(), \a value);
*/
@@ -313,7 +313,7 @@
\relates <QtAlgorithms>
\deprecated
- Use std::find instead.
+ Use \c std::find instead.
Returns an iterator to the first occurrence of \a value in a
container in the range [\a begin, \a end). Returns \a end if \a
@@ -337,16 +337,16 @@
\deprecated
\overload
- Use std::find instead.
+ Use \c std::find instead.
- This is the same as qFind(\a{container}.constBegin(), \a{container}.constEnd(), value);
+ This is the same as qFind(\a{container}.constBegin(), \a{container}.constEnd(), \a value);
*/
/*! \fn void qCount(InputIterator begin, InputIterator end, const T &value, Size &n)
\relates <QtAlgorithms>
\deprecated
- Use std::count instead.
+ Use \c std::count instead.
Returns the number of occurrences of \a value in the range [\a begin, \a end),
which is returned in \a n. \a n is never initialized, the count is added to \a n.
@@ -367,7 +367,7 @@
\deprecated
\overload
- Use std::count instead.
+ Use \c std::count instead.
Instead of operating on iterators, as in the other overload, this function
operates on the specified \a container to obtain the number of instances
@@ -378,7 +378,7 @@
\relates <QtAlgorithms>
\deprecated
- Use std::swap instead.
+ Use \c std::swap instead.
Exchanges the values of variables \a var1 and \a var2.
@@ -390,7 +390,7 @@
\relates <QtAlgorithms>
\deprecated
- Use std::sort instead.
+ Use \c std::sort instead.
Sorts the items in range [\a begin, \a end) in ascending order
using the quicksort algorithm.
@@ -416,7 +416,7 @@
\deprecated
\overload
- Use std::sort instead.
+ Use \c std::sort instead.
Uses the \a lessThan function instead of \c operator<() to
compare the items.
@@ -452,7 +452,7 @@
\deprecated
\overload
- Use std::sort instead.
+ Use \c std::sort instead.
This is the same as qSort(\a{container}.begin(), \a{container}.end());
*/
@@ -462,7 +462,7 @@
\relates <QtAlgorithms>
\deprecated
- Use std::stable_sort instead.
+ Use \c std::stable_sort instead.
Sorts the items in range [\a begin, \a end) in ascending order
using a stable sorting algorithm.
@@ -490,7 +490,7 @@
\deprecated
\overload
- Use std::stable_sort instead.
+ Use \c std::stable_sort instead.
Uses the \a lessThan function instead of \c operator<() to
compare the items.
@@ -522,7 +522,7 @@
\deprecated
\overload
- Use std::stable_sort instead.
+ Use \c std::stable_sort instead.
This is the same as qStableSort(\a{container}.begin(), \a{container}.end());
*/
@@ -531,7 +531,7 @@
\relates <QtAlgorithms>
\deprecated
- Use std::lower_bound instead.
+ Use \c std::lower_bound instead.
Performs a binary search of the range [\a begin, \a end) and
returns the position of the first occurrence of \a value. If no
@@ -561,7 +561,7 @@
\deprecated
\overload
- Use std::lower_bound instead.
+ Use \c std::lower_bound instead.
Uses the \a lessThan function instead of \c operator<() to
compare the items.
@@ -576,7 +576,7 @@
\deprecated
\overload
- Use std::lower_bound instead.
+ Use \c std::lower_bound instead.
For read-only iteration over containers, this function is broadly equivalent to
qLowerBound(\a{container}.begin(), \a{container}.end(), value). However, since it
@@ -588,7 +588,7 @@
\relates <QtAlgorithms>
\deprecated
- Use std::upper_bound instead.
+ Use \c std::upper_bound instead.
Performs a binary search of the range [\a begin, \a end) and
returns the position of the one-past-the-last occurrence of \a
@@ -618,7 +618,7 @@
\deprecated
\overload
- Use std::upper_bound instead.
+ Use \c std::upper_bound instead.
Uses the \a lessThan function instead of \c operator<() to
compare the items.
@@ -633,9 +633,9 @@
\deprecated
\overload
- Use std::upper_bound instead.
+ Use \c std::upper_bound instead.
- This is the same as qUpperBound(\a{container}.begin(), \a{container}.end(), value);
+ This is the same as qUpperBound(\a{container}.begin(), \a{container}.end(), \a value);
*/
@@ -643,7 +643,7 @@
\relates <QtAlgorithms>
\deprecated
- Use std::binary_search or std::lower_bound instead.
+ Use \c std::binary_search or \c std::lower_bound instead.
Performs a binary search of the range [\a begin, \a end) and
returns the position of an occurrence of \a value. If there are
@@ -670,7 +670,7 @@
\deprecated
\overload
- Use std::binary_search or std::lower_bound instead.
+ Use \c std::binary_search or \c std::lower_bound instead.
Uses the \a lessThan function instead of \c operator<() to
compare the items.
@@ -685,9 +685,9 @@
\deprecated
\overload
- Use std::binary_search or std::lower_bound instead.
+ Use \c std::binary_search or \c std::lower_bound instead.
- This is the same as qBinaryFind(\a{container}.begin(), \a{container}.end(), value);
+ This is the same as qBinaryFind(\a{container}.begin(), \a{container}.end(), \a value);
*/
@@ -727,7 +727,7 @@
\relates <QtAlgorithms>
\deprecated
- Use std::less instead.
+ Use \c std::less instead.
Returns a functional object, or functor, that can be passed to qSort()
or qStableSort().
@@ -743,7 +743,7 @@
\relates <QtAlgorithms>
\deprecated
- Use std::greater instead.
+ Use \c std::greater instead.
Returns a functional object, or functor, that can be passed to qSort()
or qStableSort().