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:
Przemyslaw Czerpak
2008-10-30 14:03:16 +00:00
parent a826560895
commit 6822b74b3d
4 changed files with 59 additions and 52 deletions

View File

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

View File

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

View File

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

View File

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