2009-10-20 13:48 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/src/vm/thread.c
* harbour/include/hbthread.h
* eliminated nameless unions
This commit is contained in:
@@ -17,6 +17,11 @@
|
||||
past entries belonging to author(s): Viktor Szakats.
|
||||
*/
|
||||
|
||||
2009-10-20 13:48 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
|
||||
* harbour/src/vm/thread.c
|
||||
* harbour/include/hbthread.h
|
||||
* eliminated nameless unions
|
||||
|
||||
2009-10-20 11:37 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
|
||||
* harbour/config/win/xcc.mk
|
||||
+ added small hack enabled for sh only to resolve two problems with
|
||||
|
||||
@@ -156,7 +156,7 @@ HB_EXTERN_BEGIN
|
||||
# if !defined( HB_CRITICAL_NEED_INIT )
|
||||
# define HB_CRITICAL_NEED_INIT
|
||||
# endif
|
||||
# define HB_CRITICAL_GET(v) ( &( (v)->critical ) )
|
||||
# define HB_CRITICAL_GET(v) ( &( (v)->critical.value ) )
|
||||
# endif
|
||||
|
||||
# if defined( PTHREAD_COND_INITIALIZER ) && !defined( HB_COND_NEED_INIT )
|
||||
@@ -168,7 +168,7 @@ HB_EXTERN_BEGIN
|
||||
# if !defined( HB_COND_NEED_INIT )
|
||||
# define HB_COND_NEED_INIT
|
||||
# endif
|
||||
# define HB_COND_GET(v) ( &( (v)->cond ) )
|
||||
# define HB_COND_GET(v) ( &( (v)->cond.value ) )
|
||||
# endif
|
||||
|
||||
#elif defined( HB_OS_WIN )
|
||||
@@ -308,8 +308,8 @@ HB_EXTERN_BEGIN
|
||||
union
|
||||
{
|
||||
int dummy;
|
||||
HB_RAWCRITICAL_T critical;
|
||||
};
|
||||
HB_RAWCRITICAL_T value;
|
||||
} critical;
|
||||
} HB_CRITICAL_T;
|
||||
# define HB_CRITICAL_NEW( name ) HB_CRITICAL_T name = { FALSE, { 0 } }
|
||||
#endif /* HB_CRITICAL_NEED_INIT */
|
||||
@@ -322,8 +322,8 @@ HB_EXTERN_BEGIN
|
||||
union
|
||||
{
|
||||
int dummy;
|
||||
HB_RAWCOND_T cond;
|
||||
};
|
||||
HB_RAWCOND_T value;
|
||||
} cond;
|
||||
} HB_COND_T;
|
||||
# define HB_COND_NEW( name ) HB_COND_T name = { FALSE, { 0 } }
|
||||
# else
|
||||
@@ -333,14 +333,14 @@ HB_EXTERN_BEGIN
|
||||
int waiters;
|
||||
union
|
||||
{
|
||||
int dummycond;
|
||||
HB_RAWCOND_T cond;
|
||||
};
|
||||
int dummy;
|
||||
HB_RAWCOND_T value;
|
||||
} cond;
|
||||
union
|
||||
{
|
||||
int dummy;
|
||||
HB_RAWCRITICAL_T critical;
|
||||
};
|
||||
HB_RAWCRITICAL_T value;
|
||||
} critical;
|
||||
} HB_COND_T;
|
||||
# define HB_COND_NEW( name ) HB_COND_T name = { FALSE, 0, { 0 }, { 0 } }
|
||||
# endif
|
||||
|
||||
@@ -147,7 +147,7 @@ static PHB_ITEM s_pOnceMutex = NULL;
|
||||
HB_CRITICAL_LOCK( s_init_mtx );
|
||||
if( !critical->fInit )
|
||||
{
|
||||
HB_CRITICAL_INIT( critical->critical );
|
||||
HB_CRITICAL_INIT( critical->critical.value );
|
||||
critical->fInit = TRUE;
|
||||
}
|
||||
HB_CRITICAL_UNLOCK( s_init_mtx );
|
||||
@@ -171,9 +171,9 @@ static PHB_ITEM s_pOnceMutex = NULL;
|
||||
HB_CRITICAL_LOCK( s_init_mtx );
|
||||
if( !cond->fInit )
|
||||
{
|
||||
HB_COND_INIT( cond->cond );
|
||||
HB_COND_INIT( cond->cond.value );
|
||||
# if !defined( HB_COND_OS_SUPPORT )
|
||||
HB_CRITICAL_INIT( cond->critical );
|
||||
HB_CRITICAL_INIT( cond->critical.value );
|
||||
cond->waiters = 0;
|
||||
# endif
|
||||
cond->fInit = TRUE;
|
||||
@@ -533,7 +533,7 @@ void hb_threadEnterCriticalSection( HB_CRITICAL_T * critical )
|
||||
#elif defined( HB_CRITICAL_NEED_INIT )
|
||||
if( !critical->fInit )
|
||||
hb_threadCriticalInit( critical );
|
||||
HB_CRITICAL_LOCK( critical->critical );
|
||||
HB_CRITICAL_LOCK( critical->critical.value );
|
||||
#else
|
||||
HB_CRITICAL_LOCK( *critical );
|
||||
#endif
|
||||
@@ -544,7 +544,7 @@ void hb_threadLeaveCriticalSection( HB_CRITICAL_T * critical )
|
||||
#if !defined( HB_MT_VM )
|
||||
HB_SYMBOL_UNUSED( critical );
|
||||
#elif defined( HB_CRITICAL_NEED_INIT )
|
||||
HB_CRITICAL_UNLOCK( critical->critical );
|
||||
HB_CRITICAL_UNLOCK( critical->critical.value );
|
||||
#else
|
||||
HB_CRITICAL_UNLOCK( *critical );
|
||||
#endif
|
||||
@@ -579,13 +579,13 @@ BOOL hb_threadCondSignal( HB_COND_T * cond )
|
||||
if( !cond->fInit )
|
||||
hb_threadCondInit( cond );
|
||||
|
||||
HB_CRITICAL_LOCK( cond->critical );
|
||||
HB_CRITICAL_LOCK( cond->critical.value );
|
||||
if( cond->waiters )
|
||||
{
|
||||
HB_COND_SIGNAL( cond->cond );
|
||||
HB_COND_SIGNAL( cond->cond.value );
|
||||
cond->waiters--;
|
||||
}
|
||||
HB_CRITICAL_UNLOCK( cond->critical );
|
||||
HB_CRITICAL_UNLOCK( cond->critical.value );
|
||||
|
||||
return TRUE;
|
||||
|
||||
@@ -621,13 +621,13 @@ BOOL hb_threadCondBroadcast( HB_COND_T * cond )
|
||||
if( !cond->fInit )
|
||||
hb_threadCondInit( cond );
|
||||
|
||||
HB_CRITICAL_LOCK( cond->critical );
|
||||
HB_CRITICAL_LOCK( cond->critical.value );
|
||||
if( cond->waiters )
|
||||
{
|
||||
HB_COND_SIGNALN( cond->cond, cond->waiters );
|
||||
HB_COND_SIGNALN( cond->cond.value, cond->waiters );
|
||||
cond->waiters = 0;
|
||||
}
|
||||
HB_CRITICAL_UNLOCK( cond->critical );
|
||||
HB_CRITICAL_UNLOCK( cond->critical.value );
|
||||
|
||||
return TRUE;
|
||||
|
||||
@@ -656,7 +656,7 @@ BOOL hb_threadCondWait( HB_COND_T * cond, HB_CRITICAL_T * mutex )
|
||||
|
||||
#elif defined( HB_COND_HARBOUR_SUPPORT )
|
||||
|
||||
return _hb_thread_cond_wait( cond, &mutex->critical, HB_THREAD_INFINITE_WAIT );
|
||||
return _hb_thread_cond_wait( cond, &mutex->critical.value, HB_THREAD_INFINITE_WAIT );
|
||||
|
||||
#else
|
||||
|
||||
@@ -669,22 +669,22 @@ BOOL hb_threadCondWait( HB_COND_T * cond, HB_CRITICAL_T * mutex )
|
||||
* to make initialization test here
|
||||
*/
|
||||
|
||||
HB_CRITICAL_LOCK( cond->critical );
|
||||
HB_CRITICAL_LOCK( cond->critical.value );
|
||||
cond->waiters++;
|
||||
HB_CRITICAL_UNLOCK( cond->critical );
|
||||
HB_CRITICAL_UNLOCK( cond->critical.value );
|
||||
|
||||
HB_CRITICAL_UNLOCK( mutex->critical );
|
||||
fResult = HB_COND_WAIT( cond->cond );
|
||||
HB_CRITICAL_LOCK( mutex->critical );
|
||||
HB_CRITICAL_UNLOCK( mutex->critical.value );
|
||||
fResult = HB_COND_WAIT( cond->cond.value );
|
||||
HB_CRITICAL_LOCK( mutex->critical.value );
|
||||
/* There is race condition here and user code should always check if
|
||||
* the wait condition is valid after leaving hb_threadCondWait()
|
||||
* even if it returns TRUE
|
||||
*/
|
||||
if( !fResult )
|
||||
{
|
||||
HB_CRITICAL_LOCK( cond->critical );
|
||||
HB_CRITICAL_LOCK( cond->critical.value );
|
||||
cond->waiters--;
|
||||
HB_CRITICAL_UNLOCK( cond->critical );
|
||||
HB_CRITICAL_UNLOCK( cond->critical.value );
|
||||
}
|
||||
|
||||
return fResult;
|
||||
@@ -721,7 +721,7 @@ BOOL hb_threadCondTimedWait( HB_COND_T * cond, HB_CRITICAL_T * mutex, ULONG ulMi
|
||||
|
||||
#elif defined( HB_COND_HARBOUR_SUPPORT )
|
||||
|
||||
return _hb_thread_cond_wait( cond, &mutex->critical, ulMilliSec );
|
||||
return _hb_thread_cond_wait( cond, &mutex->critical.value, ulMilliSec );
|
||||
|
||||
#else
|
||||
|
||||
@@ -734,22 +734,22 @@ BOOL hb_threadCondTimedWait( HB_COND_T * cond, HB_CRITICAL_T * mutex, ULONG ulMi
|
||||
* to make initialization test here
|
||||
*/
|
||||
|
||||
HB_CRITICAL_LOCK( cond->critical );
|
||||
HB_CRITICAL_LOCK( cond->critical.value );
|
||||
cond->waiters++;
|
||||
HB_CRITICAL_UNLOCK( cond->critical );
|
||||
HB_CRITICAL_UNLOCK( cond->critical.value );
|
||||
|
||||
HB_CRITICAL_UNLOCK( mutex->critical );
|
||||
fResult = HB_COND_TIMEDWAIT( cond->cond, ulMilliSec );
|
||||
HB_CRITICAL_LOCK( mutex->critical );
|
||||
HB_CRITICAL_UNLOCK( mutex->critical.value );
|
||||
fResult = HB_COND_TIMEDWAIT( cond->cond.value, ulMilliSec );
|
||||
HB_CRITICAL_LOCK( mutex->critical.value );
|
||||
/* There is race condition here and user code should always check if
|
||||
* the wait condition is valid after leaving hb_threadCondTimedWait()
|
||||
* even if it returns TRUE
|
||||
*/
|
||||
if( !fResult )
|
||||
{
|
||||
HB_CRITICAL_LOCK( cond->critical );
|
||||
HB_CRITICAL_LOCK( cond->critical.value );
|
||||
cond->waiters--;
|
||||
HB_CRITICAL_UNLOCK( cond->critical );
|
||||
HB_CRITICAL_UNLOCK( cond->critical.value );
|
||||
}
|
||||
|
||||
return fResult;
|
||||
|
||||
Reference in New Issue
Block a user