2010-03-29 22:42 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)

* harbour/include/hbthread.h
  * harbour/src/vm/thread.c
    % use thread local memory to optimize _hb_gettid()
    % use _hb_gettid() instead of _gettid() in OS2 GCC builds

  * harbour/src/vm/hvm.c
    % minor speed improvement

  * harbour/src/vm/memvars.c
    ! cleaned local vars detaching code
This commit is contained in:
Przemyslaw Czerpak
2010-03-29 20:43:03 +00:00
parent 8ea115f759
commit a6153e5087
5 changed files with 56 additions and 22 deletions

View File

@@ -17,6 +17,18 @@
past entries belonging to author(s): Viktor Szakats.
*/
2010-03-29 22:42 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbthread.h
* harbour/src/vm/thread.c
% use thread local memory to optimize _hb_gettid()
% use _hb_gettid() instead of _gettid() in OS2 GCC builds
* harbour/src/vm/hvm.c
% minor speed improvement
* harbour/src/vm/memvars.c
! cleaned local vars detaching code
2010-03-29 22:34 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
* utils/hbmk2/hbmk2.prg
! Fixed to always convert pathseps in icon filename to forward

View File

@@ -230,7 +230,7 @@ HB_EXTERN_BEGIN
# define HB_THREAD_END _endthread(); return;
# define HB_THREAD_RAWEND return;
# if defined( __GNUC__ )
# if defined( __GNUC__ ) && 0
# define HB_THREAD_SELF() ( ( TID ) _gettid() )
# else
# define HB_THREAD_SELF() ( ( TID ) _hb_gettid() )

View File

@@ -4535,10 +4535,9 @@ static void hb_vmEnumReference( PHB_ITEM pBase )
HB_TRACE(HB_TR_DEBUG, ("hb_vmEnumReference(%p)", pBase));
pEnumExtRef = ( PHB_ENUMREF ) hb_xgrab( sizeof( HB_ENUMREF ) );
pEnumExtRef->basevalue.type = HB_IT_NIL;
pEnumExtRef->oldvalue.type = HB_IT_NIL;
pEnumExtRef->enumref.type = HB_IT_NIL;
hb_itemMove( &pEnumExtRef->basevalue, pBase );
hb_itemRawCpy( &pEnumExtRef->basevalue, pBase );
pBase->type = HB_IT_BYREF | HB_IT_EXTREF;
pBase->item.asExtRef.value = ( void * ) pEnumExtRef;
pBase->item.asExtRef.func = &s_EnumExtRef;

View File

@@ -167,20 +167,23 @@ HB_ITEM_PTR hb_memvarDetachLocal( PHB_ITEM pLocal )
{
do
{
if( HB_IS_MEMVAR( pLocal ) )
if( HB_IS_MEMVAR( pLocal ) || HB_IS_EXTREF( pLocal ) )
break;
else if( HB_IS_ENUM( pLocal ) && !pLocal->item.asEnum.valuePtr )
else if( HB_IS_ENUM( pLocal ) )
{
PHB_ITEM pBase = HB_IS_BYREF( pLocal->item.asEnum.basePtr ) ?
hb_itemUnRef( pLocal->item.asEnum.basePtr ) :
pLocal->item.asEnum.basePtr;
if( HB_IS_ARRAY( pBase ) )
if( !pLocal->item.asEnum.valuePtr )
{
PHB_ITEM pItem = hb_itemNew( NULL );
hb_arrayGetItemRef( pBase, pLocal->item.asEnum.offset, pItem );
pLocal->item.asEnum.valuePtr = pItem;
pLocal = pItem;
break;
PHB_ITEM pBase = HB_IS_BYREF( pLocal->item.asEnum.basePtr ) ?
hb_itemUnRef( pLocal->item.asEnum.basePtr ) :
pLocal->item.asEnum.basePtr;
if( HB_IS_ARRAY( pBase ) )
{
PHB_ITEM pItem = hb_itemNew( NULL );
hb_arrayGetItemRef( pBase, pLocal->item.asEnum.offset, pItem );
pLocal->item.asEnum.valuePtr = pItem;
pLocal = pItem;
break;
}
}
}
else if( pLocal->item.asRefer.value >= 0 &&

View File

@@ -441,16 +441,36 @@ static HB_BOOL _hb_thread_cond_wait( HB_COND_T * cond, HB_RAWCRITICAL_T * critic
#endif
#if defined( HB_OS_OS2 ) && !defined( __GNUC__ )
ULONG _hb_gettid( void )
{
ULONG tid = 0;
PTIB ptib = NULL;
#if 0
ULONG _hb_gettid( void )
{
ULONG tid = 0;
PTIB ptib = NULL;
if( DosGetInfoBlocks( &ptib, NULL ) == NO_ERROR )
tid = ptib->tib_ptib2->tib2_ultid;
if( DosGetInfoBlocks( &ptib, NULL ) == NO_ERROR )
tid = ptib->tib_ptib2->tib2_ultid;
return tid;
}
return tid;
}
#else
ULONG _hb_gettid( void )
{
static PULONG s_pThID = NULL;
if( !s_pThID )
{
DosAllocThreadLocalMemory( 1, &s_pThID );
*s_pThID = 0;
}
if( ! *s_pThID )
{
PTIB ptib = NULL;
if( DosGetInfoBlocks( &ptib, NULL ) == NO_ERROR )
*s_pThID = ptib->tib_ptib2->tib2_ultid;
}
return *s_pThID;
}
#endif
#endif
/*