diff --git a/harbour/ChangeLog b/harbour/ChangeLog index d850fa9a6a..25e1d67a17 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -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 diff --git a/harbour/include/hbthread.h b/harbour/include/hbthread.h index 9f14ce9eae..5e4f0bb0e3 100644 --- a/harbour/include/hbthread.h +++ b/harbour/include/hbthread.h @@ -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 diff --git a/harbour/src/vm/thread.c b/harbour/src/vm/thread.c index ee4ac0a95e..296b944f38 100644 --- a/harbour/src/vm/thread.c +++ b/harbour/src/vm/thread.c @@ -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;