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
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 )
|
||||
|
||||
Reference in New Issue
Block a user