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:
Przemyslaw Czerpak
2009-10-20 11:48:46 +00:00
parent 5009da7bd6
commit ed9cd3fc9e
3 changed files with 43 additions and 38 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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;