2008-10-28 20:08 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)

* harbour/include/hbstack.h
  * harbour/source/vm/estack.c
    + added hb_stackReleaseTSD() function - this function can be called
      only in HVM cleanup state when all threads except the main one are
      released

  * harbour/source/rdd/dbf1.c
  * harbour/source/rdd/dbffpt/dbffpt1.c
  * harbour/source/rdd/dbfntx/dbfntx1.c
  * harbour/source/rdd/dbfcdx/dbfcdx1.c
    * make RDDINFO settings in BDF* based RDDs thread local

  * harbour/include/hbclass.ch
    * minor modification
This commit is contained in:
Przemyslaw Czerpak
2008-10-28 19:08:28 +00:00
parent 9918ec3fc5
commit e9657ea9d8
8 changed files with 89 additions and 30 deletions

View File

@@ -8,6 +8,22 @@
2008-12-31 13:59 UTC+0100 Foo Bar (foo.bar foobar.org)
*/
2008-10-28 20:08 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbstack.h
* harbour/source/vm/estack.c
+ added hb_stackReleaseTSD() function - this function can be called
only in HVM cleanup state when all threads except the main one are
released
* harbour/source/rdd/dbf1.c
* harbour/source/rdd/dbffpt/dbffpt1.c
* harbour/source/rdd/dbfntx/dbfntx1.c
* harbour/source/rdd/dbfcdx/dbfcdx1.c
* make RDDINFO settings in BDF* based RDDs thread local
* harbour/include/hbclass.ch
* minor modification
2008-10-28 17:56 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/source/vm/dynlibhb.c
! added #define INCL_DOSMODULEMGR for OS2 builds

View File

@@ -577,10 +577,10 @@ DECLARE HBClass ;
#endif /* HB_CLS_XPP */
/* Class datas and messages - we do not support real class messages yet */
#xcommand CLASSMETHOD <MethodName> [ AS <type> ] [<export: EXPORTED, VISIBLE>] [<protect: PROTECTED>] [<hidde: HIDDEN>] [<share: SHARED>] [<persistent: PERSISTENT, PROPERTY>] [<sync: SYNC>] => ;
#xcommand CLASSMETHOD <MethodName> [ AS <type> ] [<ctor: CONSTRUCTOR>] [<export: EXPORTED, VISIBLE>] [<protect: PROTECTED>] [<hidde: HIDDEN>] [<share: SHARED>] [<persistent: PERSISTENT, PROPERTY>] [<sync: SYNC>] => ;
_HB_MEMBER __HB_CLS_ASFUNC(<MethodName>) [ AS <type> ];;
__HB_CLS_DECLARE_METHOD __HB_CLS_PARAMS(<MethodName>) _CLASS_NAME_ ;;
oClass:AddClsMethod( __HB_CLS_ASSTRING(<MethodName>), @__HB_CLS_ASID( __HB_CLS_MTHNAME _CLASS_NAME_ <MethodName> )(), __HB_CLS_SCOPE( <.export.>, <.protect.>, <.hidde.> ) + iif( <.share.>, HB_OO_CLSTP_SHARED, 0 ) + iif( <.persistent.>, HB_OO_CLSTP_PERSIST, 0 ) + iif( <.sync.>, HB_OO_CLSTP_SYNC, 0 ) )
oClass:AddClsMethod( __HB_CLS_ASSTRING(<MethodName>), @__HB_CLS_ASID( __HB_CLS_MTHNAME _CLASS_NAME_ <MethodName> )(), __HB_CLS_SCOPE( <.export.>, <.protect.>, <.hidde.> ) + iif( <.share.>, HB_OO_CLSTP_SHARED, 0 ) + iif( <.ctor.>, HB_OO_CLSTP_CTOR, 0 ) + iif( <.persistent.>, HB_OO_CLSTP_PERSIST, 0 ) + iif( <.sync.>, HB_OO_CLSTP_SYNC, 0 ) )
#xcommand CLASSVAR <!DataName1!> [, <!DataNameN!>] [ <tp: TYPE, AS> <type> ] [ <as: ASSIGN, INIT> <uValue> ] [<export: EXPORTED, VISIBLE>] [<protect: PROTECTED>] [<hidde: HIDDEN>] [<ro: READONLY, RO>] [<share: SHARED>] [<persistent: PERSISTENT, PROPERTY>] [<sync: SYNC>] => ;
_HB_MEMBER {[ AS <type>] <DataName1> [, <DataNameN>] } ;;

View File

@@ -281,6 +281,7 @@ extern void hb_stackIncrease( void ); /* increase the stack size */
/* thread specific data */
extern void * hb_stackGetTSD( PHB_TSD pTSD );
extern void * hb_stackTestTSD( PHB_TSD pTSD );
extern void hb_stackReleaseTSD( PHB_TSD pTSD );
extern BYTE * hb_stackDirBuffer( void );
extern PHB_IOERRORS hb_stackIOErrors( void );

View File

@@ -65,6 +65,7 @@
#include "hbmath.h"
#include "hbdbsort.h"
#include "hbsxfunc.h"
#include "hbstack.h"
#include "error.ch"
#include "rddsys.ch"
#include "hbsxdef.ch"
@@ -5318,16 +5319,42 @@ static ERRCODE hb_dbfExists( LPRDDNODE pRDD, PHB_ITEM pItemTable, PHB_ITEM pItem
return hb_spFile( ( BYTE * ) szFileName, NULL ) ? SUCCESS : FAILURE;
}
static void hb_dbfInitTSD( void * Cargo )
{
HB_TRACE(HB_TR_DEBUG, ("hb_dbfInitTSD(%p)", Cargo));
( ( LPDBFDATA ) Cargo )->bTableType = DB_DBF_STD;
( ( LPDBFDATA ) Cargo )->bCryptType = DB_CRYPT_NONE;
( ( LPDBFDATA ) Cargo )->uiDirtyRead = HB_IDXREAD_CLEANMASK;
}
static void hb_dbfDestroyTSD( void * Cargo )
{
LPDBFDATA pData;
HB_TRACE(HB_TR_DEBUG, ("hb_dbfDestroyTSD(%p)", Cargo));
pData = ( LPDBFDATA ) Cargo;
if( pData->szTrigger )
hb_xfree( pData->szTrigger );
if( pData->szPendingTrigger )
hb_xfree( pData->szPendingTrigger );
if( pData->szPasswd )
hb_xfree( pData->szPasswd );
if( pData->szPendingPasswd )
hb_xfree( pData->szPendingPasswd );
}
static ERRCODE hb_dbfInit( LPRDDNODE pRDD )
{
PHB_TSD pTSD;
HB_TRACE(HB_TR_DEBUG, ("hb_dbfInit(%p)", pRDD));
pRDD->lpvCargo = hb_xgrab( sizeof( DBFDATA ) );
memset( pRDD->lpvCargo, 0, sizeof( DBFDATA ) );
( ( LPDBFDATA ) pRDD->lpvCargo )->bTableType = DB_DBF_STD;
( ( LPDBFDATA ) pRDD->lpvCargo )->bCryptType = DB_CRYPT_NONE;
( ( LPDBFDATA ) pRDD->lpvCargo )->uiDirtyRead = HB_IDXREAD_CLEANMASK;
pTSD = ( PHB_TSD ) hb_xgrab( sizeof( HB_TSD ) );
HB_TSD_INIT( pTSD, sizeof( DBFDATA ), hb_dbfInitTSD, hb_dbfDestroyTSD );
pRDD->lpvCargo = ( void * ) pTSD;
return SUCCESS;
}
@@ -5338,17 +5365,7 @@ static ERRCODE hb_dbfExit( LPRDDNODE pRDD )
if( pRDD->lpvCargo )
{
LPDBFDATA pData = ( LPDBFDATA ) pRDD->lpvCargo;
if( pData->szTrigger )
hb_xfree( pData->szTrigger );
if( pData->szPendingTrigger )
hb_xfree( pData->szPendingTrigger );
if( pData->szPasswd )
hb_xfree( pData->szPasswd );
if( pData->szPendingPasswd )
hb_xfree( pData->szPendingPasswd );
hb_stackReleaseTSD( ( PHB_TSD ) pRDD->lpvCargo );
hb_xfree( pRDD->lpvCargo );
pRDD->lpvCargo = NULL;
}
@@ -5363,7 +5380,7 @@ static ERRCODE hb_dbfRddInfo( LPRDDNODE pRDD, USHORT uiIndex, ULONG ulConnect, P
HB_TRACE(HB_TR_DEBUG, ("hb_dbfRddInfo(%p, %hu, %lu, %p)", pRDD, uiIndex, ulConnect, pItem));
pData = ( LPDBFDATA ) pRDD->lpvCargo;
pData = ( LPDBFDATA ) hb_stackGetTSD( ( PHB_TSD ) pRDD->lpvCargo );
switch( uiIndex )
{

View File

@@ -76,12 +76,13 @@
#include "hbapilng.h"
#include "hbvm.h"
#include "hbset.h"
#include "hbstack.h"
#include "hbrddcdx.h"
#include "hbmath.h"
#include "rddsys.ch"
#include "hbregex.h"
#define CDXNODE_DATA( p ) ( ( LPDBFDATA ) ( p )->lpvCargo )
#define CDXNODE_DATA( p ) ( ( LPDBFDATA ) hb_stackGetTSD( ( PHB_TSD ) ( p )->lpvCargo ) )
#define CDXAREA_DATA( p ) CDXNODE_DATA( SELF_RDDNODE( p ) )
#ifndef HB_CDP_SUPPORT_OFF
@@ -8598,7 +8599,7 @@ static ERRCODE hb_cdxRddInfo( LPRDDNODE pRDD, USHORT uiIndex, ULONG ulConnect, P
HB_TRACE(HB_TR_DEBUG, ("hb_cdxRddInfo(%p, %hu, %lu, %p)", pRDD, uiIndex, ulConnect, pItem));
pData = ( LPDBFDATA ) pRDD->lpvCargo;
pData = CDXNODE_DATA( pRDD );
switch( uiIndex )
{

View File

@@ -67,6 +67,7 @@
#include "hbapierr.h"
#include "hbapilng.h"
#include "hbset.h"
#include "hbstack.h"
#include "hbvm.h"
#include "hbdate.h"
#include "hbrddfpt.h"
@@ -77,6 +78,9 @@
# include "hbapicdp.h"
#endif
#define FPTNODE_DATA( p ) ( ( LPDBFDATA ) hb_stackGetTSD( ( PHB_TSD ) ( p )->lpvCargo ) )
#define FPTAREA_DATA( p ) FPTNODE_DATA( SELF_RDDNODE( p ) )
#define FPT_BLOCK_OFFSET( b ) ( ( HB_FOFFSET ) ( b ) * \
( HB_FOFFSET ) pArea->uiMemoBlockSize )
@@ -4681,7 +4685,7 @@ static ERRCODE hb_fptInfo( FPTAREAP pArea, USHORT uiIndex, PHB_ITEM pItem )
}
else
{
LPDBFDATA pData = ( LPDBFDATA ) SELF_RDDNODE( pArea )->lpvCargo;
LPDBFDATA pData = FPTAREA_DATA( pArea );
char * szMFileExt;
if( pData->szMemoExt[ 0 ] )
hb_itemPutC( pItem, pData->szMemoExt );
@@ -4983,7 +4987,7 @@ static ERRCODE hb_fptRddInfo( LPRDDNODE pRDD, USHORT uiIndex, ULONG ulConnect, P
HB_TRACE(HB_TR_DEBUG, ("hb_fptRddInfo(%p, %hu, %lu, %p)", pRDD, uiIndex, ulConnect, pItem));
pData = ( LPDBFDATA ) pRDD->lpvCargo;
pData = FPTNODE_DATA( pRDD );
switch( uiIndex )
{

View File

@@ -140,6 +140,7 @@
#include "hbapilng.h"
#include "hbvm.h"
#include "hbset.h"
#include "hbstack.h"
#include "hbmath.h"
#include "hbrddntx.h"
#include "rddsys.ch"
@@ -156,7 +157,7 @@ static RDDFUNCS ntxSuper;
static USHORT s_uiRddId;
#define NTXNODE_DATA( p ) ( ( LPDBFDATA ) ( p )->lpvCargo )
#define NTXNODE_DATA( p ) ( ( LPDBFDATA ) hb_stackGetTSD( ( PHB_TSD ) ( p )->lpvCargo ) )
#define NTXAREA_DATA( p ) NTXNODE_DATA( SELF_RDDNODE( p ) )
#define hb_ntxKeyFree(K) hb_xfree(K)
@@ -6086,6 +6087,7 @@ static ERRCODE ntxOrderCreate( NTXAREAP pArea, LPDBORDERCREATEINFO pOrderInfo )
szTagName[ NTX_MAX_TAGNAME + 1 ], * szKey, * szFor = NULL;
LPNTXINDEX pIndex, * pIndexPtr;
LPTAGINFO pTag = NULL;
LPDBFDATA pData;
ERRCODE errCode;
ULONG ulRecNo;
BOOL fCompound, fTagName, fBagName, fProd, fLocked = FALSE,
@@ -6223,6 +6225,7 @@ static ERRCODE ntxOrderCreate( NTXAREAP pArea, LPDBORDERCREATEINFO pOrderInfo )
SELF_GOTO( ( AREAP ) pArea, ulRecNo );
pData = NTXAREA_DATA( pArea );
/*
* abBagName -> cBag, atomBagName -> cTag
* The following scheme implemented:
@@ -6237,7 +6240,7 @@ static ERRCODE ntxOrderCreate( NTXAREAP pArea, LPDBORDERCREATEINFO pOrderInfo )
#if defined( HB_NTX_NOMULTITAG )
fCompound = FALSE;
#else
fCompound = fTagName && NTXAREA_DATA( pArea )->fMultiTag;
fCompound = fTagName && pData->fMultiTag;
#endif
hb_ntxCreateFName( pArea, ( char * ) ( ( fBagName || fCompound ) ?
pOrderInfo->abBagName : pOrderInfo->atomBagName ),
@@ -6412,7 +6415,7 @@ static ERRCODE ntxOrderCreate( NTXAREAP pArea, LPDBORDERCREATEINFO pOrderInfo )
pTag = hb_ntxTagNew( pIndex, szTagName, fTagName,
szKey, pKeyExp, bType, (USHORT) iLen, (USHORT) iDec,
szFor, pForExp,
fAscend, pOrderInfo->fUnique, fCustom, NTXAREA_DATA( pArea )->fSortRecNo );
fAscend, pOrderInfo->fUnique, fCustom, pData->fSortRecNo );
pTag->Partial = ( pArea->lpdbOrdCondInfo && !pArea->lpdbOrdCondInfo->fAll );
if( ! pIndex->Compound )
@@ -6480,8 +6483,7 @@ static ERRCODE ntxOrderCreate( NTXAREAP pArea, LPDBORDERCREATEINFO pOrderInfo )
*pIndexPtr = pIndex;
}
if( pIndex->Production && !pArea->fHasTags &&
NTXAREA_DATA( pArea )->fStruct &&
( NTXAREA_DATA( pArea )->fStrictStruct || hb_setGetAutOpen() ) )
pData->fStruct && ( pData->fStrictStruct || hb_setGetAutOpen() ) )
{
pArea->fHasTags = TRUE;
if( !pArea->fReadonly && ( pArea->dbfHeader.bHasTags & 0x01 ) == 0 )
@@ -7481,7 +7483,7 @@ static ERRCODE ntxInit( LPRDDNODE pRDD )
if( errCode == SUCCESS )
NTXNODE_DATA( pRDD )->fMultiTag = TRUE;
#endif
return errCode;
}

View File

@@ -319,6 +319,24 @@ void * hb_stackTestTSD( PHB_TSD pTSD )
#endif
}
void hb_stackReleaseTSD( PHB_TSD pTSD )
{
HB_STACK_TLS_PRELOAD
HB_TRACE(HB_TR_DEBUG, ("hb_stackReleaseTSD(%p)", pTSD));
if( pTSD->iHandle && pTSD->iHandle <= hb_stack.iTSD &&
hb_stack.pTSD[pTSD->iHandle].value )
{
if( pTSD->pCleanFunc )
pTSD->pCleanFunc( hb_stack.pTSD[pTSD->iHandle].value );
hb_xfree( hb_stack.pTSD[pTSD->iHandle].value );
hb_stack.pTSD[pTSD->iHandle].value = NULL;
hb_stack.pTSD[pTSD->iHandle].pTSD = NULL;
pTSD->iHandle = 0;
}
}
void hb_stackInit( void )
{
HB_TRACE(HB_TR_DEBUG, ("hb_stackInit()"));