2015-09-15 14:58 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)

* include/hbvmpub.h
  * src/vm/hvm.c
    + added support for hb_vmAtInit(), hb_vmAtExit() and hb_vmAtQuit()
      functions for dynamically loaded libraries
      This modification should also fix issue #33
This commit is contained in:
Przemysław Czerpak
2015-09-15 14:58:03 +02:00
parent 7a89939039
commit 010421f70e
3 changed files with 54 additions and 8 deletions

View File

@@ -10,6 +10,13 @@
* Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment
*/
2015-09-15 14:58 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
* include/hbvmpub.h
* src/vm/hvm.c
+ added support for hb_vmAtInit(), hb_vmAtExit() and hb_vmAtQuit()
functions for dynamically loaded libraries
This modification should also fix issue #33
2015-09-14 19:30 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
* src/rtl/hbproces.c
* use pipes instead of temporary files in OS2 builds of hb_fsProcessRun()

View File

@@ -219,12 +219,13 @@ typedef HB_CARGO_FUNC( ( * PHB_CARGO_FUNC ) );
typedef void * ( * PHB_ALLOCUPDT_FUNC )( void *, int );
typedef void (*HB_INIT_FUNC)(void *);
typedef void ( * HB_INIT_FUNC )( void * );
/* List of functions used by hb_vmAtInit()/hb_vmAtExit() */
typedef struct _HB_FUNC_LIST
{
HB_INIT_FUNC pFunc;
void * cargo;
void * hDynLib;
struct _HB_FUNC_LIST * pNext;
} HB_FUNC_LIST, * PHB_FUNC_LIST;

View File

@@ -326,17 +326,46 @@ static void hb_vmAddModuleFunction( PHB_FUNC_LIST * pLstPtr, HB_INIT_FUNC pFunc,
pLst->pFunc = pFunc;
pLst->cargo = cargo;
pLst->hDynLib = s_hDynLibID;
HB_ATINIT_LOCK();
pLst->pNext = *pLstPtr;
*pLstPtr = pLst;
HB_ATINIT_UNLOCK();
}
static void hb_vmDoModuleFunctions( PHB_FUNC_LIST pLst )
static void hb_vmDoModuleFunctions( PHB_FUNC_LIST * pLstPtr )
{
while( *pLstPtr )
{
PHB_FUNC_LIST pLst = *pLstPtr;
*pLstPtr = pLst->pNext;
pLst->pFunc( pLst->cargo );
hb_xfree( pLst );
}
}
static void hb_vmDoModuleLibFunctions( PHB_FUNC_LIST * pLstPtr, void * hDynLib )
{
while( *pLstPtr )
{
PHB_FUNC_LIST pLst = *pLstPtr;
if( pLst->hDynLib == hDynLib )
{
*pLstPtr = pLst->pNext;
pLst->pFunc( pLst->cargo );
hb_xfree( pLst );
}
else
pLstPtr = &pLst->pNext;
}
}
static void hb_vmDoModuleSetLibID( PHB_FUNC_LIST pLst, void * hDynLib, void * hNewDynLib )
{
while( pLst )
{
pLst->pFunc( pLst->cargo );
if( pLst->hDynLib == hDynLib )
pLst->hDynLib = hNewDynLib;
pLst = pLst->pNext;
}
}
@@ -382,17 +411,17 @@ void hb_vmAtQuit( HB_INIT_FUNC pFunc, void * cargo )
static void hb_vmDoModuleInitFunctions( void )
{
hb_vmDoModuleFunctions( s_InitFunctions );
hb_vmDoModuleFunctions( &s_InitFunctions );
}
static void hb_vmDoModuleExitFunctions( void )
{
hb_vmDoModuleFunctions( s_ExitFunctions );
hb_vmDoModuleFunctions( &s_ExitFunctions );
}
static void hb_vmDoModuleQuitFunctions( void )
{
hb_vmDoModuleFunctions( s_QuitFunctions );
hb_vmDoModuleFunctions( &s_QuitFunctions );
}
@@ -7811,6 +7840,14 @@ void hb_vmInitSymbolGroup( void * hNewDynLib, int argc, const char * argv[] )
pLastSymbols = pLastSymbols->pNext;
}
/* library symbols are modified beforeinit functions
execution intentionally because init functions may
load new modules [druzus] */
hb_vmDoModuleSetLibID( s_InitFunctions, hDynLib, hNewDynLib );
hb_vmDoModuleSetLibID( s_ExitFunctions, hDynLib, hNewDynLib );
hb_vmDoModuleSetLibID( s_QuitFunctions, hDynLib, hNewDynLib );
hb_vmDoModuleLibFunctions( &s_InitFunctions, hNewDynLib );
if( fFound )
{
HB_BOOL fClipInit = HB_TRUE;
@@ -7889,15 +7926,16 @@ void hb_vmExitSymbolGroup( void * hDynLib )
pLastSymbols = pLastSymbols->pNext;
}
hb_vmDoModuleLibFunctions( &s_ExitFunctions, hDynLib );
hb_vmDoModuleLibFunctions( &s_QuitFunctions, hDynLib );
if( fFound )
{
pLastSymbols = s_pSymbols;
while( pLastSymbols )
{
if( pLastSymbols->hDynLib == hDynLib )
{
hb_vmFreeSymbols( pLastSymbols );
}
pLastSymbols = pLastSymbols->pNext;
}
}