-rw-r--r-- | qmake/tools/qgarray.cpp | 97 |
1 files changed, 80 insertions, 17 deletions
diff --git a/qmake/tools/qgarray.cpp b/qmake/tools/qgarray.cpp index 45c45ce..0a522e4 100644 --- a/qmake/tools/qgarray.cpp +++ b/qmake/tools/qgarray.cpp | |||
@@ -34,11 +34,15 @@ | |||
34 | ** not clear to you. | 34 | ** not clear to you. |
35 | ** | 35 | ** |
36 | **********************************************************************/ | 36 | **********************************************************************/ |
37 | 37 | ||
38 | #include "qglobal.h" // needed to define Q_WS_WIN | 38 | #include "qglobal.h" |
39 | #ifdef Q_WS_WIN | 39 | #if defined(Q_CC_BOR) |
40 | #include "qt_windows.h" // needed for bsearch on some platforms | 40 | // needed for qsort() because of a std namespace problem on Borland |
41 | # include "qplatformdefs.h" | ||
42 | #elif defined(Q_WS_WIN) | ||
43 | // needed for bsearch on some platforms | ||
44 | # include "qt_windows.h" | ||
41 | #endif | 45 | #endif |
42 | 46 | ||
43 | #define QGARRAY_CPP | 47 | #define QGARRAY_CPP |
44 | #include "qgarray.h" | 48 | #include "qgarray.h" |
@@ -48,9 +52,15 @@ | |||
48 | #ifdef QT_THREAD_SUPPORT | 52 | #ifdef QT_THREAD_SUPPORT |
49 | # include <private/qmutexpool_p.h> | 53 | # include <private/qmutexpool_p.h> |
50 | #endif // QT_THREAD_SUPPORT | 54 | #endif // QT_THREAD_SUPPORT |
51 | 55 | ||
52 | #define USE_MALLOC // comment to use new/delete | 56 | /* |
57 | If USE_MALLOC isn't defined, we use new[] and delete[] to allocate | ||
58 | memory. The documentation for QMemArray<T>::assign() explicitly | ||
59 | mentions that the array is freed using free(), so don't mess around | ||
60 | with USE_MALLOC unless you know what you're doing. | ||
61 | */ | ||
62 | #define USE_MALLOC | ||
53 | 63 | ||
54 | #undef NEW | 64 | #undef NEW |
55 | #undef DELETE | 65 | #undef DELETE |
56 | 66 | ||
@@ -134,9 +144,13 @@ QGArray::QGArray( int size ) | |||
134 | if ( size == 0 ) // zero length | 144 | if ( size == 0 ) // zero length |
135 | return; | 145 | return; |
136 | shd->data = NEW(char,size); | 146 | shd->data = NEW(char,size); |
137 | Q_CHECK_PTR( shd->data ); | 147 | Q_CHECK_PTR( shd->data ); |
138 | shd->len = size; | 148 | shd->len = |
149 | #ifdef QT_QGARRAY_SPEED_OPTIM | ||
150 | shd->maxl = | ||
151 | #endif | ||
152 | size; | ||
139 | } | 153 | } |
140 | 154 | ||
141 | /*! | 155 | /*! |
142 | Constructs a shallow copy of \a a. | 156 | Constructs a shallow copy of \a a. |
@@ -211,37 +225,72 @@ bool QGArray::isEqual( const QGArray &a ) const | |||
211 | } | 225 | } |
212 | 226 | ||
213 | 227 | ||
214 | /*! | 228 | /*! |
215 | Resizes the array to \a newsize bytes. | 229 | Resizes the array to \a newsize bytes. \a optim is either |
230 | MemOptim (the default) or SpeedOptim. | ||
216 | */ | 231 | */ |
217 | 232 | bool QGArray::resize( uint newsize, Optimization optim ) | |
218 | bool QGArray::resize( uint newsize ) | ||
219 | { | 233 | { |
220 | if ( newsize == shd->len ) // nothing to do | 234 | #ifndef QT_QGARRAY_SPEED_OPTIM |
235 | Q_UNUSED(optim); | ||
236 | #endif | ||
237 | |||
238 | if ( newsize == shd->len | ||
239 | #ifdef QT_QGARRAY_SPEED_OPTIM | ||
240 | && newsize == shd->maxl | ||
241 | #endif | ||
242 | ) // nothing to do | ||
221 | return TRUE; | 243 | return TRUE; |
222 | if ( newsize == 0 ) { // remove array | 244 | if ( newsize == 0 ) { // remove array |
223 | duplicate( 0, 0 ); | 245 | duplicate( 0, 0 ); |
224 | return TRUE; | 246 | return TRUE; |
225 | } | 247 | } |
248 | |||
249 | uint newmaxl = newsize; | ||
250 | #ifdef QT_QGARRAY_SPEED_OPTIM | ||
251 | if ( optim == SpeedOptim ) { | ||
252 | if ( newsize <= shd->maxl && | ||
253 | ( newsize * 4 > shd->maxl || shd->maxl <= 4 ) ) { | ||
254 | shd->len = newsize; | ||
255 | return TRUE; | ||
256 | } | ||
257 | newmaxl = 4; | ||
258 | while ( newmaxl < newsize ) | ||
259 | newmaxl *= 2; | ||
260 | // try to spare some memory | ||
261 | if ( newmaxl >= 1024 * 1024 && newsize <= newmaxl - (newmaxl >> 2) ) | ||
262 | newmaxl -= newmaxl >> 2; | ||
263 | } | ||
264 | shd->maxl = newmaxl; | ||
265 | #endif | ||
266 | |||
226 | if ( shd->data ) { // existing data | 267 | if ( shd->data ) { // existing data |
227 | #if defined(DONT_USE_REALLOC) | 268 | #if defined(DONT_USE_REALLOC) |
228 | char *newdata = NEW(char,newsize);// manual realloc | 269 | char *newdata = NEW(char,newsize);// manual realloc |
229 | memcpy( newdata, shd->data, QMIN(shd->len,newsize) ); | 270 | memcpy( newdata, shd->data, QMIN(shd->len,newmaxl) ); |
230 | DELETE(shd->data); | 271 | DELETE(shd->data); |
231 | shd->data = newdata; | 272 | shd->data = newdata; |
232 | #else | 273 | #else |
233 | shd->data = (char *)realloc( shd->data, newsize ); | 274 | shd->data = (char *)realloc( shd->data, newmaxl ); |
234 | #endif | 275 | #endif |
235 | } else { | 276 | } else { |
236 | shd->data = NEW(char,newsize); | 277 | shd->data = NEW(char,newmaxl); |
237 | } | 278 | } |
238 | if ( !shd->data ) // no memory | 279 | if ( !shd->data ) // no memory |
239 | return FALSE; | 280 | return FALSE; |
240 | shd->len = newsize; | 281 | shd->len = newsize; |
241 | return TRUE; | 282 | return TRUE; |
242 | } | 283 | } |
243 | 284 | ||
285 | /*!\overload | ||
286 | */ | ||
287 | bool QGArray::resize( uint newsize ) | ||
288 | { | ||
289 | return resize( newsize, MemOptim ); | ||
290 | } | ||
291 | |||
292 | |||
244 | /*! | 293 | /*! |
245 | Fills the array with the repeated occurrences of \a d, which is | 294 | Fills the array with the repeated occurrences of \a d, which is |
246 | \a sz bytes long. | 295 | \a sz bytes long. |
247 | If \a len is specified as different from -1, then the array will be | 296 | If \a len is specified as different from -1, then the array will be |
@@ -318,9 +367,13 @@ QGArray &QGArray::assign( const char *d, uint len ) | |||
318 | if ( shd->data ) | 367 | if ( shd->data ) |
319 | DELETE(shd->data); | 368 | DELETE(shd->data); |
320 | } | 369 | } |
321 | shd->data = (char *)d; | 370 | shd->data = (char *)d; |
322 | shd->len = len; | 371 | shd->len = |
372 | #ifdef QT_QGARRAY_SPEED_OPTIM | ||
373 | shd->maxl = | ||
374 | #endif | ||
375 | len; | ||
323 | return *this; | 376 | return *this; |
324 | } | 377 | } |
325 | 378 | ||
326 | /*! | 379 | /*! |
@@ -363,9 +416,13 @@ QGArray &QGArray::duplicate( const QGArray &a ) | |||
363 | memcpy( shd->data, a.shd->data, a.shd->len ); | 416 | memcpy( shd->data, a.shd->data, a.shd->len ); |
364 | } else { | 417 | } else { |
365 | shd->data = 0; | 418 | shd->data = 0; |
366 | } | 419 | } |
367 | shd->len = a.shd->len; | 420 | shd->len = |
421 | #ifdef QT_QGARRAY_SPEED_OPTIM | ||
422 | shd->maxl = | ||
423 | #endif | ||
424 | a.shd->len; | ||
368 | if ( oldptr ) | 425 | if ( oldptr ) |
369 | DELETE(oldptr); | 426 | DELETE(oldptr); |
370 | return *this; | 427 | return *this; |
371 | } | 428 | } |
@@ -401,9 +458,13 @@ QGArray &QGArray::duplicate( const char *d, uint len ) | |||
401 | if ( shd->data ) | 458 | if ( shd->data ) |
402 | DELETE(shd->data); | 459 | DELETE(shd->data); |
403 | } | 460 | } |
404 | shd->data = data; | 461 | shd->data = data; |
405 | shd->len = len; | 462 | shd->len = |
463 | #ifdef QT_QGARRAY_SPEED_OPTIM | ||
464 | shd->maxl = | ||
465 | #endif | ||
466 | len; | ||
406 | return *this; | 467 | return *this; |
407 | } | 468 | } |
408 | 469 | ||
409 | /*! | 470 | /*! |
@@ -658,9 +719,10 @@ void QGArray::sort( uint sz ) | |||
658 | if ( numItems < 2 ) | 719 | if ( numItems < 2 ) |
659 | return; | 720 | return; |
660 | 721 | ||
661 | #ifdef QT_THREAD_SUPPORT | 722 | #ifdef QT_THREAD_SUPPORT |
662 | QMutexLocker locker( qt_global_mutexpool->get( &cmp_item_size ) ); | 723 | QMutexLocker locker( qt_global_mutexpool ? |
724 | qt_global_mutexpool->get( &cmp_item_size ) : 0 ); | ||
663 | #endif // QT_THREAD_SUPPORT | 725 | #endif // QT_THREAD_SUPPORT |
664 | 726 | ||
665 | cmp_item_size = sz; | 727 | cmp_item_size = sz; |
666 | qsort( shd->data, numItems, sz, cmp_arr ); | 728 | qsort( shd->data, numItems, sz, cmp_arr ); |
@@ -676,9 +738,10 @@ int QGArray::bsearch( const char *d, uint sz ) const | |||
676 | if ( !numItems ) | 738 | if ( !numItems ) |
677 | return -1; | 739 | return -1; |
678 | 740 | ||
679 | #ifdef QT_THREAD_SUPPORT | 741 | #ifdef QT_THREAD_SUPPORT |
680 | QMutexLocker locker( qt_global_mutexpool->get( &cmp_item_size ) ); | 742 | QMutexLocker locker( qt_global_mutexpool ? |
743 | qt_global_mutexpool->get( &cmp_item_size ) : 0 ); | ||
681 | #endif // QT_THREAD_SUPPORT | 744 | #endif // QT_THREAD_SUPPORT |
682 | 745 | ||
683 | cmp_item_size = sz; | 746 | cmp_item_size = sz; |
684 | char* r = (char*)::bsearch( d, shd->data, numItems, sz, cmp_arr ); | 747 | char* r = (char*)::bsearch( d, shd->data, numItems, sz, cmp_arr ); |