From da82de17b1a1dd208efa59f396fb2cd5d6235a2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20Czerpak?= Date: Tue, 6 May 2014 17:32:45 +0200 Subject: [PATCH] 2014-05-06 17:32 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * src/rtl/cdpapi.c * src/rtl/iousr.c * src/rtl/hbjson.c * src/rtl/gtcrs/gtcrs.c * src/rtl/gtsln/gtsln.c * src/rtl/gttrm/gttrm.c * src/rtl/gtxwc/gtxwc.c * src/rdd/workarea.c * src/rdd/hbsix/sxcompr.c * contrib/hbct/token2.c * contrib/hbsqlit3/core.c * pacified some of -Wshadow warnings * include/hbapicdp.h ! typo in comment: bytes -> bits * src/vm/garbage.c * src/vm/thread.c * disabled some code with spinlocks when HB_HELGRIND_FRIENDLY macro is defined. It causes that final MT HVM code is slower using native platform mutexes but only such ones helgrind can recognize so the new macro can be useful for people who want to make some tests with helgrind. In such case they should rebuild Harbour with HB_USER_CFLAGS=HB_HELGRIND_FRIENDLY We use spinlocks and atomic integer operations also in few other places so it's possible that deeper tests can exploit them and we will have to cover them by HB_HELGRIND_FRIENDLY too just to easy detect real problems. --- ChangeLog.txt | 30 ++++++++++++++++++++++++++++++ contrib/hbct/token2.c | 14 +++++++------- contrib/hbsqlit3/core.c | 10 +++++----- include/hbapicdp.h | 4 ++-- src/rdd/hbsix/sxcompr.c | 14 +++++++------- src/rdd/workarea.c | 6 +++--- src/rtl/cdpapi.c | 4 ++-- src/rtl/gtcrs/gtcrs.c | 12 ++++++------ src/rtl/gtsln/gtsln.c | 8 ++++---- src/rtl/gttrm/gttrm.c | 12 ++++++------ src/rtl/gtxwc/gtxwc.c | 30 +++++++++++++++--------------- src/rtl/hbjson.c | 4 +++- src/rtl/iousr.c | 8 ++++---- src/vm/garbage.c | 2 +- src/vm/thread.c | 41 +++++++++++++++++++++++++---------------- 15 files changed, 120 insertions(+), 79 deletions(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index fa20f770dd..b497e979da 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -10,6 +10,36 @@ * Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment */ +2014-05-06 17:32 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) + * src/rtl/cdpapi.c + * src/rtl/iousr.c + * src/rtl/hbjson.c + * src/rtl/gtcrs/gtcrs.c + * src/rtl/gtsln/gtsln.c + * src/rtl/gttrm/gttrm.c + * src/rtl/gtxwc/gtxwc.c + * src/rdd/workarea.c + * src/rdd/hbsix/sxcompr.c + * contrib/hbct/token2.c + * contrib/hbsqlit3/core.c + * pacified some of -Wshadow warnings + + * include/hbapicdp.h + ! typo in comment: bytes -> bits + + * src/vm/garbage.c + * src/vm/thread.c + * disabled some code with spinlocks when HB_HELGRIND_FRIENDLY macro + is defined. It causes that final MT HVM code is slower using native + platform mutexes but only such ones helgrind can recognize so the + new macro can be useful for people who want to make some tests with + helgrind. In such case they should rebuild Harbour with + HB_USER_CFLAGS=HB_HELGRIND_FRIENDLY + We use spinlocks and atomic integer operations also in few other + places so it's possible that deeper tests can exploit them and + we will have to cover them by HB_HELGRIND_FRIENDLY too just to + easy detect real problems. + 2014-04-11 17:36 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * contrib/gtqtc/gtqtc.h * contrib/gtqtc/gtqtc1.cpp diff --git a/contrib/hbct/token2.c b/contrib/hbct/token2.c index 3935682a94..4ba4c3f9d4 100644 --- a/contrib/hbct/token2.c +++ b/contrib/hbct/token2.c @@ -92,7 +92,7 @@ static TOKEN_ENVIRONMENT sTokEnvNew( void ) /* add a tokenizing position to a token environment */ static int sTokEnvAddPos( TOKEN_ENVIRONMENT * pEnv, TOKEN_POSITION * pPos ) { - HB_SIZE index; + HB_SIZE nIndex; TOKEN_ENVIRONMENT env = *pEnv; /* new memory needed ? */ @@ -105,9 +105,9 @@ static int sTokEnvAddPos( TOKEN_ENVIRONMENT * pEnv, TOKEN_POSITION * pPos ) env[ 0 ].sEndPos += TOKEN_ENVIRONMENT_STEP; } - index = env[ 0 ].sStartPos + 2; /* +2 because of extra elements */ - env[ index ].sStartPos = pPos->sStartPos; - env[ index ].sEndPos = pPos->sEndPos; + nIndex = env[ 0 ].sStartPos + 2; /* +2 because of extra elements */ + env[ nIndex ].sStartPos = pPos->sStartPos; + env[ nIndex ].sEndPos = pPos->sEndPos; env[ 0 ].sStartPos++; return 1; @@ -135,12 +135,12 @@ static TOKEN_POSITION * sTokEnvGetPos( TOKEN_ENVIRONMENT env ) } /* get position element pointed to by given 0-based index */ -static TOKEN_POSITION * sTokEnvGetPosIndex( TOKEN_ENVIRONMENT env, HB_SIZE index ) +static TOKEN_POSITION * sTokEnvGetPosIndex( TOKEN_ENVIRONMENT env, HB_SIZE nIndex ) { - if( index >= env[ 0 ].sStartPos ) + if( nIndex >= env[ 0 ].sStartPos ) return NULL; - return env + 2 + index; /* "+2" because of extra elements */ + return env + 2 + nIndex; /* "+2" because of extra elements */ } /* increment tokenizing pointer by one */ diff --git a/contrib/hbsqlit3/core.c b/contrib/hbsqlit3/core.c index b35728eb86..9f383f0256 100644 --- a/contrib/hbsqlit3/core.c +++ b/contrib/hbsqlit3/core.c @@ -1296,9 +1296,9 @@ HB_FUNC( SQLITE3_COLUMN_BLOB ) if( pStmt ) { - int index = hb_parni( 2 ) - 1; + int iIndex = hb_parni( 2 ) - 1; hb_retclen( ( const char * ) sqlite3_column_blob( pStmt, - index ), sqlite3_column_bytes( pStmt, index ) ); + iIndex ), sqlite3_column_bytes( pStmt, iIndex ) ); } else hb_errRT_BASE_SubstR( EG_ARG, 0, NULL, HB_ERR_FUNCNAME, 1, hb_paramError( 1 ) ); @@ -1340,10 +1340,10 @@ HB_FUNC( SQLITE3_COLUMN_TEXT ) if( pStmt ) { - int index = hb_parni( 2 ) - 1; + int iIndex = hb_parni( 2 ) - 1; hb_retstrlen_utf8( ( const char * ) sqlite3_column_text( pStmt, - index ), - sqlite3_column_bytes( pStmt, index ) ); + iIndex ), + sqlite3_column_bytes( pStmt, iIndex ) ); } else hb_errRT_BASE_SubstR( EG_ARG, 0, NULL, HB_ERR_FUNCNAME, 1, hb_paramError( 1 ) ); diff --git a/include/hbapicdp.h b/include/hbapicdp.h index 00047ac41c..1e9ed0ab4e 100644 --- a/include/hbapicdp.h +++ b/include/hbapicdp.h @@ -395,8 +395,8 @@ extern HB_EXPORT void hb_vmSetCDP( PHB_CODEPAGE pCDP ); /* maximal size of unicode character in 'char' representation for buffers * To encode all ISO 10646 Universal Character Set (UCS) values (characters - * can en encoded in 31-bit code space) in UTF-8 we need 6 bytes. - * UC2 characters (16bytes) encoded in UTF8 needs 3 bytes. + * can be encoded in 31-bit code space) in UTF-8 we need 6 bytes. + * UC2 characters (16bits) encoded in UTF8 needs 3 bytes. * 8 seems to be a little bit redundant and large enough for all encodings. * In theory some other encodings may need more bytes but I do not know any * one used in practice. [druzus] diff --git a/src/rdd/hbsix/sxcompr.c b/src/rdd/hbsix/sxcompr.c index 76d65a2a43..eef4fce49b 100644 --- a/src/rdd/hbsix/sxcompr.c +++ b/src/rdd/hbsix/sxcompr.c @@ -300,9 +300,9 @@ static HB_BOOL hb_LZSSxDecode( PHB_LZSSX_COMPR pCompr ) { HB_BOOL fResult = HB_TRUE; HB_USHORT itemMask; - int offset, length, index, c, h; + int offset, length, rbufidx, c, h; - index = RBUFLENGTH - MAXLENGTH; + rbufidx = RBUFLENGTH - MAXLENGTH; itemMask = 0; do @@ -326,8 +326,8 @@ static HB_BOOL hb_LZSSxDecode( PHB_LZSSX_COMPR pCompr ) fResult = HB_FALSE; break; } - pCompr->ring_buffer[ index ] = ( HB_UCHAR ) c; - index = RBUFINDEX( index + 1 ); + pCompr->ring_buffer[ rbufidx ] = ( HB_UCHAR ) c; + rbufidx = RBUFINDEX( rbufidx + 1 ); } else /* we have an item pair (ring buffer offset : match length) */ { @@ -349,9 +349,9 @@ static HB_BOOL hb_LZSSxDecode( PHB_LZSSX_COMPR pCompr ) /* SIX does not use additional buffers and dynamically overwrite the ring buffer - we have to make exactly the same or our results will be differ when - abs( offset - index ) < length */ - pCompr->ring_buffer[ index ] = ( HB_UCHAR ) c; - index = RBUFINDEX( index + 1 ); + abs( offset - rbufidx ) < length */ + pCompr->ring_buffer[ rbufidx ] = ( HB_UCHAR ) c; + rbufidx = RBUFINDEX( rbufidx + 1 ); } } } diff --git a/src/rdd/workarea.c b/src/rdd/workarea.c index 11d9ad0c42..1e996eb7ab 100644 --- a/src/rdd/workarea.c +++ b/src/rdd/workarea.c @@ -822,12 +822,12 @@ static HB_ERRCODE hb_waInfo( AREAP pArea, HB_USHORT uiIndex, PHB_ITEM pItem ) * Retrieve information about the current order that SELF could not. * Called by SELF_ORDINFO if uiIndex is not supported. */ -static HB_ERRCODE hb_waOrderInfo( AREAP pArea, HB_USHORT index, LPDBORDERINFO pInfo ) +static HB_ERRCODE hb_waOrderInfo( AREAP pArea, HB_USHORT uiIndex, LPDBORDERINFO pInfo ) { - HB_TRACE( HB_TR_DEBUG, ( "hb_waOrderInfo(%p, %hu, %p)", pArea, index, pInfo ) ); + HB_TRACE( HB_TR_DEBUG, ( "hb_waOrderInfo(%p, %hu, %p)", pArea, uiIndex, pInfo ) ); HB_SYMBOL_UNUSED( pArea ); - HB_SYMBOL_UNUSED( index ); + HB_SYMBOL_UNUSED( uiIndex ); if( pInfo->itmResult ) hb_itemClear( pInfo->itmResult ); diff --git a/src/rtl/cdpapi.c b/src/rtl/cdpapi.c index 0a99eed6e2..04df423b34 100644 --- a/src/rtl/cdpapi.c +++ b/src/rtl/cdpapi.c @@ -1294,10 +1294,10 @@ HB_BOOL hb_cdpGetFromUTF8( PHB_CODEPAGE cdp, HB_UCHAR ch, { if( HB_CDPCHAR_LEN( cdp, *pwc ) == 1 ) { - HB_SIZE n = 0; + HB_SIZE nS = 0; char c; - if( HB_CDPCHAR_PUT( cdp, &c, 1, &n, *pwc ) ) + if( HB_CDPCHAR_PUT( cdp, &c, 1, &nS, *pwc ) ) *pwc = ( HB_UCHAR ) c; } } diff --git a/src/rtl/gtcrs/gtcrs.c b/src/rtl/gtcrs/gtcrs.c index 31aa35b43c..ffb01ca153 100644 --- a/src/rtl/gtcrs/gtcrs.c +++ b/src/rtl/gtcrs/gtcrs.c @@ -395,9 +395,9 @@ static void sig_handler( int signo ) { case SIGCHLD: { - int stat; + int status; pid_t pid; - while( ( pid = waitpid( -1, &stat, WNOHANG ) ) > 0 ) ; + while( ( pid = waitpid( -1, &status, WNOHANG ) ) > 0 ) ; break; } case SIGWINCH: @@ -447,10 +447,10 @@ static void sig_handler( int signo ) { case SIGCHLD: { - int stat; + int status; pid_t pid; pszSig = "SIGCHLD"; - while( ( pid = waitpid( -1, &stat, WNOHANG ) ) > 0 ) ; + while( ( pid = waitpid( -1, &status, WNOHANG ) ) > 0 ) ; break; } case SIGWINCH: @@ -1864,7 +1864,7 @@ static void setKeyTrans( InOutBase * ioBase, PHB_CODEPAGE cdpTerm, PHB_CODEPAGE } } -static void setDispTrans( InOutBase * ioBase, PHB_CODEPAGE cdpHost, PHB_CODEPAGE cdpTerm, int box ) +static void setDispTrans( InOutBase * ioBase, PHB_CODEPAGE cdpHost, PHB_CODEPAGE cdpTerm, int transBox ) { int i, aSet; chtype ch; @@ -1923,7 +1923,7 @@ static void setDispTrans( InOutBase * ioBase, PHB_CODEPAGE cdpHost, PHB_CODEPAGE hb_cdpTranslateDispChar( i, cdpHost, cdpTerm ); ioBase->std_chmap[ i ] = uc | A_NORMAL; - if( box ) + if( transBox ) ioBase->box_chmap[ i ] = uc | A_NORMAL; if( i != ( int ) uc ) { diff --git a/src/rtl/gtsln/gtsln.c b/src/rtl/gtsln/gtsln.c index c531eb1ee4..294c0b2263 100644 --- a/src/rtl/gtsln/gtsln.c +++ b/src/rtl/gtsln/gtsln.c @@ -488,7 +488,7 @@ static int hb_sln_isUTF8( int iStdOut, int iStdIn ) { char rdbuf[ 64 ]; int i, j, n, d, y, x; - HB_MAXUINT end_timer, time; + HB_MAXUINT end_timer, cur_time; n = j = x = y = 0; /* wait up to 2 seconds for answer */ @@ -527,8 +527,8 @@ static int hb_sln_isUTF8( int iStdOut, int iStdIn ) } if( n == sizeof( rdbuf ) ) break; - time = hb_dateMilliSeconds(); - if( time > end_timer ) + cur_time = hb_dateMilliSeconds(); + if( cur_time > end_timer ) break; else { @@ -538,7 +538,7 @@ static int hb_sln_isUTF8( int iStdOut, int iStdIn ) FD_ZERO( &rdfds ); FD_SET( iStdIn, &rdfds ); - iMilliSec = ( int ) ( end_timer - time ); + iMilliSec = ( int ) ( end_timer - cur_time ); tv.tv_sec = iMilliSec / 1000; tv.tv_usec = ( iMilliSec % 1000 ) * 1000; diff --git a/src/rtl/gttrm/gttrm.c b/src/rtl/gttrm/gttrm.c index 34b5c0504a..fc82416cb2 100644 --- a/src/rtl/gttrm/gttrm.c +++ b/src/rtl/gttrm/gttrm.c @@ -458,13 +458,13 @@ static int getClipKey( int nKey ) static void sig_handler( int iSigNo ) { - int e = errno, stat; + int e = errno, status; pid_t pid; switch( iSigNo ) { case SIGCHLD: - while( ( pid = waitpid( -1, &stat, WNOHANG ) ) > 0 ) + while( ( pid = waitpid( -1, &status, WNOHANG ) ) > 0 ) ; break; case SIGWINCH: @@ -1799,7 +1799,7 @@ static HB_BOOL hb_gt_trm_AnsiGetCursorPos( PHB_GTTRM pTerm, int * iRow, int * iC { char rdbuf[ 64 ]; int i, j, n, d, y, x; - HB_MAXUINT end_timer, time; + HB_MAXUINT end_timer, cur_time; hb_gt_trm_termOut( pTerm, "\x1B[6n", 4 ); if( szPost ) @@ -1858,8 +1858,8 @@ static HB_BOOL hb_gt_trm_AnsiGetCursorPos( PHB_GTTRM pTerm, int * iRow, int * iC } if( n == sizeof( rdbuf ) ) break; - time = hb_dateMilliSeconds(); - if( time > end_timer ) + cur_time = hb_dateMilliSeconds(); + if( cur_time > end_timer ) break; else { @@ -1870,7 +1870,7 @@ static HB_BOOL hb_gt_trm_AnsiGetCursorPos( PHB_GTTRM pTerm, int * iRow, int * iC FD_ZERO( &rdfds ); FD_SET( pTerm->hFilenoStdin, &rdfds ); - iMilliSec = ( int ) ( end_timer - time ); + iMilliSec = ( int ) ( end_timer - cur_time ); tv.tv_sec = iMilliSec / 1000; tv.tv_usec = ( iMilliSec % 1000 ) * 1000; diff --git a/src/rtl/gtxwc/gtxwc.c b/src/rtl/gtxwc/gtxwc.c index b4ae4b1b67..82c5aa5122 100644 --- a/src/rtl/gtxwc/gtxwc.c +++ b/src/rtl/gtxwc/gtxwc.c @@ -2418,12 +2418,12 @@ static void hb_gt_xwc_AddCharToInputQueue( PXWND_DEF wnd, int keyCode ) { if( wnd->keyBuffNO > 0 && HB_INKEY_ISMOUSEPOS( keyCode ) ) { - int index = wnd->keyBuffPointer - 1; - if( index < 0 ) - index += XWC_CHAR_QUEUE_SIZE; - if( HB_INKEY_ISMOUSEPOS( wnd->KeyBuff[ index ] ) ) + int keyBuffPtr = wnd->keyBuffPointer - 1; + if( keyBuffPtr < 0 ) + keyBuffPtr += XWC_CHAR_QUEUE_SIZE; + if( HB_INKEY_ISMOUSEPOS( wnd->KeyBuff[ keyBuffPtr ] ) ) { - wnd->KeyBuff[ index ] = keyCode; + wnd->KeyBuff[ keyBuffPtr ] = keyCode; return; } } @@ -2444,10 +2444,10 @@ static HB_BOOL hb_gt_xwc_GetCharFromInputQueue( PXWND_DEF wnd, int * keyCode ) *keyCode = 0; if( wnd->keyBuffNO > 0 ) { - int index = wnd->keyBuffPointer - wnd->keyBuffNO; - if( index < 0 ) - index += XWC_CHAR_QUEUE_SIZE; - *keyCode = wnd->KeyBuff[ index ]; + int keyBuffPtr = wnd->keyBuffPointer - wnd->keyBuffNO; + if( keyBuffPtr < 0 ) + keyBuffPtr += XWC_CHAR_QUEUE_SIZE; + *keyCode = wnd->KeyBuff[ keyBuffPtr ]; wnd->keyBuffNO--; return HB_TRUE; } @@ -3650,7 +3650,7 @@ static HB_U32 hb_gt_xwc_HashCurrChar( HB_BYTE attr, HB_BYTE color, HB_USHORT chr static void hb_gt_xwc_RepaintChar( PXWND_DEF wnd, int colStart, int rowStart, int colStop, int rowStop ) { - HB_USHORT irow, icol, index, startCol = 0, len, basex, basey, nsize; + HB_USHORT irow, icol, scridx, startCol = 0, len, basex, basey, nsize; HB_BYTE oldColor = 0, color, attr; HB_USHORT usCh16, usChBuf[ XWC_MAX_COLS ]; HB_U32 u32Curr = 0xFFFFFFFF; @@ -3673,7 +3673,7 @@ static void hb_gt_xwc_RepaintChar( PXWND_DEF wnd, int colStart, int rowStart, in for( irow = rowStart; irow <= rowStop; irow++ ) { icol = colStart; - index = icol + irow * wnd->cols; + scridx = icol + irow * wnd->cols; len = 0; /* attribute may change mid line... * so buffer up text with same attrib, and output it @@ -3704,12 +3704,12 @@ static void hb_gt_xwc_RepaintChar( PXWND_DEF wnd, int colStart, int rowStart, in color = ( color << 4 ) | ( color >> 4 ); } if( len > 0 && ( chTrans->type != CH_CHAR || - color != oldColor || u32Curr == wnd->pCurrScr[ index ] ) ) + color != oldColor || u32Curr == wnd->pCurrScr[ scridx ] ) ) { hb_gt_xwc_DrawString( wnd, startCol, irow, oldColor, usChBuf, len ); len = 0; } - if( wnd->pCurrScr[ index ] != u32Curr ) + if( wnd->pCurrScr[ scridx ] != u32Curr ) { switch( chTrans->type ) { @@ -3834,10 +3834,10 @@ static void hb_gt_xwc_RepaintChar( PXWND_DEF wnd, int colStart, int rowStart, in break; } - wnd->pCurrScr[ index ] = u32Curr; + wnd->pCurrScr[ scridx ] = u32Curr; } icol++; - index++; + scridx++; } if( len > 0 ) { diff --git a/src/rtl/hbjson.c b/src/rtl/hbjson.c index 93be9fd9aa..4a0fe653f1 100644 --- a/src/rtl/hbjson.c +++ b/src/rtl/hbjson.c @@ -334,7 +334,6 @@ static void _hb_jsonEncode( PHB_ITEM pValue, PHB_JSON_ENCODE_CTX pCtx, if( HB_IS_STRING( pKey ) ) { PHB_ITEM pItem = hb_hashGetValueAt( pValue, nIndex ); - HB_BOOL fEOL = HB_FALSE; if( nIndex > 1 ) _hb_jsonCtxAdd( pCtx, ",", 1 ); @@ -352,7 +351,10 @@ static void _hb_jsonEncode( PHB_ITEM pValue, PHB_JSON_ENCODE_CTX pCtx, fEOL = ( HB_IS_ARRAY( pItem ) || HB_IS_HASH( pItem ) ) && hb_itemSize( pItem ) > 0; } else + { _hb_jsonCtxAdd( pCtx, ":", 1 ); + fEOL = HB_FALSE; + } _hb_jsonEncode( pItem, pCtx, nLevel + 1, fEOL ); } diff --git a/src/rtl/iousr.c b/src/rtl/iousr.c index 7d1ec318ea..bb5c6319cb 100644 --- a/src/rtl/iousr.c +++ b/src/rtl/iousr.c @@ -758,10 +758,10 @@ HB_FUNC( IOUSR_SETERROR ) if( HB_ISNUM( 1 ) ) { - HB_ERRCODE errCode = ( HB_ERRCODE ) hb_parni( 1 ); - if( errCode != 0 ) - errCode += ( HB_ERRCODE ) hb_parni( 2 ); - hb_fsSetError( errCode ); + HB_ERRCODE errCodeNew = ( HB_ERRCODE ) hb_parni( 1 ); + if( errCodeNew != 0 ) + errCodeNew += ( HB_ERRCODE ) hb_parni( 2 ); + hb_fsSetError( errCodeNew ); } hb_retni( errCode ); diff --git a/src/vm/garbage.c b/src/vm/garbage.c index dde1eb8dcc..d4303a6e9f 100644 --- a/src/vm/garbage.c +++ b/src/vm/garbage.c @@ -69,7 +69,7 @@ /* Use spinlock instead of mutex */ -# if defined( HB_SPINLOCK_INIT ) && 1 +# if defined( HB_SPINLOCK_INIT ) && ! defined( HB_HELGRIND_FRIENDLY ) HB_SPINLOCK_T s_gcSpinLock = HB_SPINLOCK_INIT; # define HB_GC_LOCK() HB_SPINLOCK_ACQUIRE( &s_gcSpinLock ) diff --git a/src/vm/thread.c b/src/vm/thread.c index e1df1c645f..23254c2692 100644 --- a/src/vm/thread.c +++ b/src/vm/thread.c @@ -2053,34 +2053,43 @@ HB_BOOL hb_threadMutexLock( PHB_ITEM pItem ) pMutex->owner = ( HB_THREAD_ID ) 1; fResult = HB_TRUE; #else +# if ! defined( HB_HELGRIND_FRIENDLY ) if( HB_THREAD_EQUAL( pMutex->owner, HB_THREAD_SELF() ) ) { pMutex->lock_count++; fResult = HB_TRUE; } else +#endif { hb_vmUnlock(); HB_CRITICAL_LOCK( pMutex->mutex ); - while( pMutex->lock_count != 0 ) - { - pMutex->lockers++; -# if defined( HB_PTHREAD_API ) - pthread_cond_wait( &pMutex->cond_l, &pMutex->mutex ); -# elif defined( HB_TASK_THREAD ) - hb_taskWait( &pMutex->cond_l, &pMutex->mutex, HB_TASK_INFINITE_WAIT ); -# elif defined( HB_COND_HARBOUR_SUPPORT ) - _hb_thread_cond_wait( &pMutex->cond_l, &pMutex->mutex, HB_THREAD_INFINITE_WAIT ); -# else - HB_CRITICAL_UNLOCK( pMutex->mutex ); - ( void ) HB_COND_WAIT( pMutex->cond_l ); - HB_CRITICAL_LOCK( pMutex->mutex ); +# if defined( HB_HELGRIND_FRIENDLY ) + if( HB_THREAD_EQUAL( pMutex->owner, HB_THREAD_SELF() ) ) + pMutex->lock_count++; + else # endif - pMutex->lockers--; + { + while( pMutex->lock_count != 0 ) + { + pMutex->lockers++; +# if defined( HB_PTHREAD_API ) + pthread_cond_wait( &pMutex->cond_l, &pMutex->mutex ); +# elif defined( HB_TASK_THREAD ) + hb_taskWait( &pMutex->cond_l, &pMutex->mutex, HB_TASK_INFINITE_WAIT ); +# elif defined( HB_COND_HARBOUR_SUPPORT ) + _hb_thread_cond_wait( &pMutex->cond_l, &pMutex->mutex, HB_THREAD_INFINITE_WAIT ); +# else + HB_CRITICAL_UNLOCK( pMutex->mutex ); + ( void ) HB_COND_WAIT( pMutex->cond_l ); + HB_CRITICAL_LOCK( pMutex->mutex ); +# endif + pMutex->lockers--; + } + pMutex->lock_count = 1; + pMutex->owner = HB_THREAD_SELF(); } - pMutex->lock_count = 1; - pMutex->owner = HB_THREAD_SELF(); HB_CRITICAL_UNLOCK( pMutex->mutex ); fResult = HB_TRUE;