diff options
author | Timothy Pearson <[email protected]> | 2013-03-21 16:21:25 -0500 |
---|---|---|
committer | Timothy Pearson <[email protected]> | 2013-03-21 16:21:25 -0500 |
commit | f5b03149e8e68e510efe9842d85a058b42a51264 (patch) | |
tree | 49c476a64e7377ecf25a949a9116fc7bf89c4cf5 /src/tools | |
parent | 1b0a52a0c1285bf6237aac3fbd99eaebeca5663a (diff) | |
download | tqt3-f5b03149e8e68e510efe9842d85a058b42a51264.tar.gz tqt3-f5b03149e8e68e510efe9842d85a058b42a51264.zip |
Automated update from Qt3
Diffstat (limited to 'src/tools')
-rw-r--r-- | src/tools/ntqstring.h | 14 | ||||
-rw-r--r-- | src/tools/qstring.cpp | 79 |
2 files changed, 87 insertions, 6 deletions
diff --git a/src/tools/ntqstring.h b/src/tools/ntqstring.h index 29704e719..b91caf83c 100644 --- a/src/tools/ntqstring.h +++ b/src/tools/ntqstring.h @@ -360,11 +360,10 @@ inline bool operator>( TQChar c1, TQChar c2 ) { return !(c2>=c1); } // internal struct Q_EXPORT TQStringData : public TQShared { TQStringData() : - TQShared(), unicode(0), ascii(0), len(0), issimpletext(TRUE), maxl(0), islatin1(FALSE) { ref(); } + TQShared(), unicode(0), ascii(0), len(0), issimpletext(TRUE), maxl(0), islatin1(FALSE), security_unpaged(FALSE) { ref(); } TQStringData(TQChar *u, uint l, uint m) : - TQShared(), unicode(u), ascii(0), len(l), issimpletext(FALSE), maxl(m), islatin1(FALSE) { } - ~TQStringData() { if ( unicode ) delete[] ((char*)unicode); - if ( ascii ) delete[] ascii; } + TQShared(), unicode(u), ascii(0), len(l), issimpletext(FALSE), maxl(m), islatin1(FALSE), security_unpaged(FALSE) { } + ~TQStringData(); void deleteSelf(); TQChar *unicode; @@ -389,6 +388,8 @@ struct Q_EXPORT TQStringData : public TQShared { #endif uint islatin1 : 1; + bool security_unpaged : 1; + private: #if defined(TQ_DISABLE_COPY) TQStringData( const TQStringData& ); @@ -750,7 +751,12 @@ private: // needed for TQDeepCopy void detach(); + + void setSecurityUnPaged(bool lock); + static char* unicodeToLatin1( const TQChar*, uint len, bool unpaged ); + friend class TQDeepCopy<TQString>; + friend class TQLineEdit; }; class Q_EXPORT TQCharRef { diff --git a/src/tools/qstring.cpp b/src/tools/qstring.cpp index 86ba42469..878f3e60f 100644 --- a/src/tools/qstring.cpp +++ b/src/tools/qstring.cpp @@ -65,10 +65,18 @@ #if defined(Q_WS_WIN) #include "qt_windows.h" #endif +#if defined(Q_OS_LINUX) +#include <sys/mman.h> +#endif #if !defined( QT_NO_COMPONENT ) && !defined( QT_LITE_COMPONENT ) #include "ntqcleanuphandler.h" #endif +#if defined(Q_OS_LINUX) +#define LINUX_MEMLOCK_LIMIT_BYTES 16384 +#define LINUX_MEMLOCK_LIMIT_CHARACTERS LINUX_MEMLOCK_LIMIT_BYTES/sizeof(TQChar) +#endif + #ifndef LLONG_MAX #define LLONG_MAX TQ_INT64_C(9223372036854775807) #endif @@ -1025,6 +1033,14 @@ static inline bool format(TQChar::Decomposition tag, TQString & str, } // format() #endif +TQStringData::~TQStringData() { + if ( unicode ) delete[] ((char*)unicode); + if ( ascii && security_unpaged ) { + munlock(ascii, LINUX_MEMLOCK_LIMIT_BYTES); + } + if ( ascii ) delete[] ascii; +} + /* TQString::compose() and visual() were developed by Gordon Tisher <[email protected]>, with input from Lars Knoll <[email protected]>, @@ -1203,19 +1219,34 @@ static TQChar* internalLatin1ToUnicode( const char *str, uint* len, } /*! + ABI compatibility +*/ + +char* TQString::unicodeToLatin1(const TQChar *uc, uint l) +{ + return unicodeToLatin1(uc, l, false); +} + +/*! This utility function converts \a l 16-bit characters from \a uc to ASCII, returning a '\0'-terminated string. The caller is responsible for deleting the resultant string with delete[]. */ -char* TQString::unicodeToLatin1(const TQChar *uc, uint l) + +char* TQString::unicodeToLatin1(const TQChar *uc, uint l, bool unpaged) { if (!uc) { return 0; } char *a = new char[l+1]; char *result = a; + if (unpaged) { +#if defined(Q_OS_LINUX) + mlock(result, LINUX_MEMLOCK_LIMIT_BYTES); +#endif + } while (l--) { *a++ = (uc->unicode() > 0xff) ? '?' : (char)uc->unicode(); uc++; @@ -1707,8 +1738,10 @@ void TQString::setLength( uint newLen ) if ( nd ) { uint len = TQMIN( d->len, newLen ); memcpy( nd, d->unicode, sizeof(TQChar) * len ); + bool unpaged = d->security_unpaged; deref(); d = new TQStringData( nd, newLen, newMax ); + setSecurityUnPaged(unpaged); } } else { d->len = newLen; @@ -1760,8 +1793,10 @@ void TQString::reserve( uint minCapacity ) uint len = d->len; if ( len ) memcpy( nd, d->unicode, sizeof(TQChar) * len ); + bool unpaged = d->security_unpaged; deref(); d = new TQStringData( nd, len, minCapacity ); + setSecurityUnPaged(unpaged); } } } @@ -1780,8 +1815,10 @@ void TQString::squeeze() uint len = d->len; if ( len ) memcpy( nd, d->unicode, sizeof(TQChar) * len ); + bool unpaged = d->security_unpaged; deref(); d = new TQStringData( nd, len, len ); + setSecurityUnPaged(unpaged); } } } @@ -2744,9 +2781,11 @@ TQString& TQString::fill( TQChar c, int len ) if ( len == 0 ) { *this = ""; } else { + bool unpaged = d->security_unpaged; deref(); TQChar * nd = QT_ALLOC_QCHAR_VEC( len ); d = new TQStringData(nd,len,len); + setSecurityUnPaged(unpaged); while (len--) *nd++ = c; } return *this; @@ -5678,8 +5717,15 @@ TQString &TQString::operator+=( char c ) const char* TQString::latin1() const { if ( !d->ascii || !d->islatin1 ) { + if (d->security_unpaged) { +#if defined(Q_OS_LINUX) + if (d->ascii) { + munlock(d->ascii, LINUX_MEMLOCK_LIMIT_BYTES); + } +#endif + } delete [] d->ascii; - d->ascii = unicodeToLatin1( d->unicode, d->len ); + d->ascii = unicodeToLatin1( d->unicode, d->len, d->security_unpaged ); d->islatin1 = TRUE; } return d->ascii; @@ -5699,10 +5745,22 @@ const char* TQString::ascii() const #ifndef QT_NO_TEXTCODEC if ( TQTextCodec::codecForCStrings() ) { if ( !d->ascii || d->islatin1 ) { + if (d->security_unpaged) { +#if defined(Q_OS_LINUX) + if (d->ascii) { + munlock(d->ascii, LINUX_MEMLOCK_LIMIT_BYTES); + } +#endif + } delete [] d->ascii; if (d->unicode) { TQCString s = TQTextCodec::codecForCStrings()->fromUnicode( *this ); d->ascii = new char[s.length() + 1]; + if (d->security_unpaged) { +#if defined(Q_OS_LINUX) + mlock(d->ascii, LINUX_MEMLOCK_LIMIT_BYTES); +#endif + } memcpy(d->ascii, s.data(), s.length() + 1); } else { d->ascii = 0; @@ -5715,6 +5773,23 @@ const char* TQString::ascii() const return latin1(); } +void TQString::setSecurityUnPaged(bool lock) { + if (lock != d->security_unpaged) { + if (d->security_unpaged) { + if (d->ascii) { + munlock(d->ascii, LINUX_MEMLOCK_LIMIT_BYTES); + } + d->security_unpaged = false; + } + else { + if (d->ascii) { + mlock(d->ascii, LINUX_MEMLOCK_LIMIT_BYTES); + } + d->security_unpaged = true; + } + } +} + /*! Returns the string encoded in UTF-8 format. |