diff --git a/harbour/ChangeLog b/harbour/ChangeLog index fef5f0195e..2af78a9479 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,17 @@ 2008-12-31 13:59 UTC+0100 Foo Bar (foo.bar foobar.org) */ +2008-10-30 15:03 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/include/hbvmpub.h + + added HB_VM_ISFUNC(), HB_VM_FUNCUNREF() and HB_VM_EXECUTE() + macros to operate on HB_SYMB structure + + * harbour/source/vm/hvm.c + * harbour/source/vm/classes.c + * use HB_VM_ISFUNC()/HB_VM_FUNCUNREF()/HB_VM_EXECUTE() macros + for executing function inside HB_SYMB structure to avoid possible + synchronization problems during modifications + 2008-10-29 19:06 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com) * harbour/contrib/gtwvg/gtwvg.c * harbour/contrib/gtwvg/gtwvg.h diff --git a/harbour/include/hbvmpub.h b/harbour/include/hbvmpub.h index 2c926b7b81..89454ec804 100644 --- a/harbour/include/hbvmpub.h +++ b/harbour/include/hbvmpub.h @@ -92,6 +92,25 @@ struct _HB_SYMB; } \ } while( 0 ) +#define HB_VM_ISFUNC( pSym ) ( ( pSym )->value.pFunPtr ) + +#define HB_VM_FUNCUNREF( pSym ) \ + do { \ + if( ( ( pSym )->scope.value & HB_FS_DEFERRED ) && \ + ( pSym )->pDynSym ) \ + pSym = ( pSym )->pDynSym->pSymbol; \ + } while( 0 ) + +#define HB_VM_EXECUTE( pSym ) \ + do { \ + /* Running pCode dynamic function from .hrb? */ \ + if( ( pSym )->scope.value & HB_FS_PCODEFUNC ) \ + hb_vmExecute( ( pSym )->value.pCodeFunc->pCode, \ + ( pSym )->value.pCodeFunc->pSymbols ); \ + else \ + ( pSym )->value.pFunPtr(); \ + } while( 0 ) + /* dynamic symbol structure */ typedef struct _HB_DYNS { diff --git a/harbour/source/vm/classes.c b/harbour/source/vm/classes.c index b3a4ecd54e..1210bea0b3 100644 --- a/harbour/source/vm/classes.c +++ b/harbour/source/vm/classes.c @@ -4133,14 +4133,11 @@ static HARBOUR hb___msgDelegate( void ) PMETHOD pMethod = pClass->pMethods + pStack->uiMethod; PHB_SYMB pExecSym = pClass->pMethods[ pMethod->uiData ].pFuncSym; - if( pExecSym && pExecSym->value.pFunPtr ) + if( pExecSym ) + HB_VM_FUNCUNREF( pExecSym ); + if( pExecSym && HB_VM_ISFUNC( pExecSym ) ) { - if( pExecSym->scope.value & HB_FS_PCODEFUNC ) - /* Running pCode dynamic function from .hrb */ - hb_vmExecute( pExecSym->value.pCodeFunc->pCode, - pExecSym->value.pCodeFunc->pSymbols ); - else - pExecSym->value.pFunPtr(); + HB_VM_EXECUTE( pExecSym ); } else { @@ -4155,7 +4152,9 @@ static HARBOUR hb___msgSync( void ) PMETHOD pMethod = pClass->pMethods + pStack->uiMethod; PHB_SYMB pExecSym = pMethod->pRealSym; - if( pExecSym && pExecSym->value.pFunPtr ) + if( pExecSym ) + HB_VM_FUNCUNREF( pExecSym ); + if( pExecSym && HB_VM_ISFUNC( pExecSym ) ) { PHB_ITEM pObject = hb_stackSelfItem(); USHORT uiClass = hb_objGetClass( pObject ); @@ -4166,13 +4165,7 @@ static HARBOUR hb___msgSync( void ) if( !pMutex || hb_threadMutexLock( pMutex ) ) { - if( pExecSym->scope.value & HB_FS_PCODEFUNC ) - /* Running pCode dynamic function from .hrb */ - hb_vmExecute( pExecSym->value.pCodeFunc->pCode, - pExecSym->value.pCodeFunc->pSymbols ); - else - pExecSym->value.pFunPtr(); - + HB_VM_EXECUTE( pExecSym ); if( pMutex ) hb_threadMutexUnlock( pMutex ); } @@ -4190,18 +4183,15 @@ static HARBOUR hb___msgSyncClass( void ) PMETHOD pMethod = pClass->pMethods + pStack->uiMethod; PHB_SYMB pExecSym = pMethod->pRealSym; - if( pExecSym && pExecSym->value.pFunPtr ) + if( pExecSym ) + HB_VM_FUNCUNREF( pExecSym ); + if( pExecSym && HB_VM_ISFUNC( pExecSym ) ) { - if( hb_threadMutexLock( pClass->pMutex ) ) + if( !pClass->pMutex || hb_threadMutexLock( pClass->pMutex ) ) { - if( pExecSym->scope.value & HB_FS_PCODEFUNC ) - /* Running pCode dynamic function from .hrb */ - hb_vmExecute( pExecSym->value.pCodeFunc->pCode, - pExecSym->value.pCodeFunc->pSymbols ); - else - pExecSym->value.pFunPtr(); - - hb_threadMutexUnlock( pClass->pMutex ); + HB_VM_EXECUTE( pExecSym ); + if( pClass->pMutex ) + hb_threadMutexUnlock( pClass->pMutex ); } } else diff --git a/harbour/source/vm/hvm.c b/harbour/source/vm/hvm.c index 66bfcee4f8..49f12f5ebf 100644 --- a/harbour/source/vm/hvm.c +++ b/harbour/source/vm/hvm.c @@ -5363,17 +5363,13 @@ HB_EXPORT void hb_vmDo( USHORT uiParams ) PHB_SYMB pExecSym; pExecSym = hb_objGetMethod( pSelf, pSym, &sStackState ); - if( pExecSym && ( pExecSym->scope.value & HB_FS_DEFERRED ) && pExecSym->pDynSym ) - pExecSym = pExecSym->pDynSym->pSymbol; - if( pExecSym && pExecSym->value.pFunPtr ) + if( pExecSym ) + HB_VM_FUNCUNREF( pExecSym ); + if( pExecSym && HB_VM_ISFUNC( pExecSym ) ) { HB_TRACE_PRG(("Calling: %s:%s", hb_objGetClsName( pSelf ), pSym->szName)); - if( pExecSym->scope.value & HB_FS_PCODEFUNC ) - /* Running pCode dynamic function from .hrb */ - hb_vmExecute( pExecSym->value.pCodeFunc->pCode, - pExecSym->value.pCodeFunc->pSymbols ); - else - pExecSym->value.pFunPtr(); + + HB_VM_EXECUTE( pExecSym ); #ifndef HB_NO_PROFILER if( bProfiler ) @@ -5387,21 +5383,17 @@ HB_EXPORT void hb_vmDo( USHORT uiParams ) } else /* it is a function */ { - if( ( pSym->scope.value & HB_FS_DEFERRED ) && pSym->pDynSym ) - pSym = pSym->pDynSym->pSymbol; - if( pSym->value.pFunPtr ) + HB_VM_FUNCUNREF( pSym ); + if( HB_VM_ISFUNC( pSym ) ) { HB_TRACE_PRG(("Calling: %s", pSym->szName)); + #ifndef HB_NO_PROFILER if( bProfiler && pSym->pDynSym ) pSym->pDynSym->ulRecurse++; #endif - /* Running pCode dynamic function from .hrb? */ - if( pSym->scope.value & HB_FS_PCODEFUNC ) - hb_vmExecute( pSym->value.pCodeFunc->pCode, - pSym->value.pCodeFunc->pSymbols ); - else - pSym->value.pFunPtr(); + + HB_VM_EXECUTE( pSym ); #ifndef HB_NO_PROFILER if( bProfiler && pSym->pDynSym ) @@ -5454,18 +5446,13 @@ HB_EXPORT void hb_vmSend( USHORT uiParams ) pSelf = hb_stackSelfItem(); /* NIL, OBJECT or BLOCK */ pExecSym = hb_objGetMethod( pSelf, pSym, &sStackState ); - if( pExecSym && ( pExecSym->scope.value & HB_FS_DEFERRED ) && pExecSym->pDynSym ) - pExecSym = pExecSym->pDynSym->pSymbol; - if( pExecSym && pExecSym->value.pFunPtr ) + if( pExecSym ) + HB_VM_FUNCUNREF( pExecSym ); + if( pExecSym && HB_VM_ISFUNC( pExecSym ) ) { HB_TRACE_PRG(("Calling: %s:%s", hb_objGetClsName( pSelf ), pSym->szName)); - if( pExecSym->scope.value & HB_FS_PCODEFUNC ) - /* Running pCode dynamic function from .hrb */ - hb_vmExecute( pExecSym->value.pCodeFunc->pCode, - pExecSym->value.pCodeFunc->pSymbols ); - else - pExecSym->value.pFunPtr(); + HB_VM_EXECUTE( pExecSym ); #ifndef HB_NO_PROFILER if( bProfiler )