Added support for large field values (up to 4 GB), async and direct I/O on Linux and Solaris, and performed major code cleanup.
git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@213 0109f412-320b-0410-ab79-c3e0c5ffbbe6
This commit is contained in:
@@ -115,7 +115,7 @@ FSTATIC void flmCleanup( void);
|
||||
FSTATIC void flmUnlinkFileFromBucket(
|
||||
FFILE * pFile);
|
||||
|
||||
RCODE flmMonitor(
|
||||
RCODE flmSystemMonitor(
|
||||
F_Thread * pThread);
|
||||
|
||||
FSTATIC RCODE flmRegisterHttpCallback(
|
||||
@@ -602,17 +602,16 @@ FSTATIC void flmUnlockSysData( void)
|
||||
#endif
|
||||
}
|
||||
|
||||
/*API~***********************************************************************
|
||||
/****************************************************************************
|
||||
Desc : Startup FLAIM.
|
||||
Notes: This routine may be called multiple times. However, if that is done
|
||||
FlmShutdown() should be called for each time this is called
|
||||
successfully. This routine does not handle race conditions on
|
||||
platforms that do not support atomic increment.
|
||||
*END************************************************************************/
|
||||
****************************************************************************/
|
||||
FLMEXP RCODE FLMAPI FlmStartup( void)
|
||||
{
|
||||
RCODE rc = FERR_OK;
|
||||
FLMINT iEventCategory;
|
||||
FLMUINT uiCacheBytes;
|
||||
#ifdef FLM_USE_NICI
|
||||
int iHandle;
|
||||
@@ -710,13 +709,10 @@ FLMEXP RCODE FLMAPI FlmStartup( void)
|
||||
gv_FlmSysData.uiMaxStratifyTime = DEFAULT_MAX_STRATIFY_TIME;
|
||||
|
||||
// Initialize the event categories to have no mutex.
|
||||
|
||||
for (iEventCategory = 0;
|
||||
iEventCategory < F_MAX_EVENT_CATEGORIES;
|
||||
iEventCategory++)
|
||||
{
|
||||
gv_FlmSysData.EventHdrs [iEventCategory].hMutex = F_MUTEX_NULL;
|
||||
}
|
||||
|
||||
gv_FlmSysData.UpdateEvents.hMutex = F_MUTEX_NULL;
|
||||
gv_FlmSysData.LockEvents.hMutex = F_MUTEX_NULL;
|
||||
gv_FlmSysData.SizeEvents.hMutex = F_MUTEX_NULL;
|
||||
|
||||
// Memory initialization should be first.
|
||||
|
||||
@@ -958,22 +954,29 @@ FLMEXP RCODE FLMAPI FlmStartup( void)
|
||||
|
||||
// Set up mutexes for the event table.
|
||||
|
||||
for (iEventCategory = 0;
|
||||
iEventCategory < F_MAX_EVENT_CATEGORIES;
|
||||
iEventCategory++)
|
||||
if (RC_BAD( rc = f_mutexCreate(
|
||||
&gv_FlmSysData.UpdateEvents.hMutex)))
|
||||
{
|
||||
if (RC_BAD( rc = f_mutexCreate(
|
||||
&gv_FlmSysData.EventHdrs [iEventCategory].hMutex)))
|
||||
{
|
||||
goto Exit;
|
||||
}
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
|
||||
if (RC_BAD( rc = f_mutexCreate(
|
||||
&gv_FlmSysData.LockEvents.hMutex)))
|
||||
{
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if (RC_BAD( rc = f_mutexCreate(
|
||||
&gv_FlmSysData.SizeEvents.hMutex)))
|
||||
{
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
// Start the monitor thread - ALWAYS DO LAST. EVERYTHING MUST BE
|
||||
// SETUP PROPERLY BEFORE STARTING THIS THREAD.
|
||||
|
||||
if (RC_BAD( rc = f_threadCreate( &gv_FlmSysData.pMonitorThrd,
|
||||
flmMonitor, "DB Monitor")))
|
||||
flmSystemMonitor, "FLAIM System Monitor")))
|
||||
{
|
||||
goto Exit;
|
||||
}
|
||||
@@ -982,9 +985,9 @@ FLMEXP RCODE FLMAPI FlmStartup( void)
|
||||
iHandle = f_getpid();
|
||||
|
||||
// Initialize NICI
|
||||
|
||||
if (CCS_Init(&iHandle))
|
||||
{
|
||||
// Failure.
|
||||
rc = RC_SET( FERR_NICI_INIT_FAILED);
|
||||
goto Exit;
|
||||
}
|
||||
@@ -1047,10 +1050,7 @@ DONT_PREALLOCATE:
|
||||
// Log a message indicating that we couldn't pre-allocate
|
||||
// the cache
|
||||
|
||||
flmLogMessage(
|
||||
FLM_DEBUG_MESSAGE,
|
||||
FLM_YELLOW,
|
||||
FLM_BLACK,
|
||||
flmLogMessage( FLM_DEBUG_MESSAGE, FLM_YELLOW, FLM_BLACK,
|
||||
"WARNING: Couldn't pre-allocate cache.");
|
||||
|
||||
goto DONT_PREALLOCATE;
|
||||
@@ -1089,9 +1089,9 @@ Exit:
|
||||
return( rc);
|
||||
}
|
||||
|
||||
/*API~***********************************************************************
|
||||
/****************************************************************************
|
||||
Desc : Configures how memory will be dynamically regulated.
|
||||
*END************************************************************************/
|
||||
****************************************************************************/
|
||||
FLMEXP RCODE FLMAPI FlmSetDynamicMemoryLimit(
|
||||
FLMUINT uiCacheAdjustPercent,
|
||||
FLMUINT uiCacheAdjustMin,
|
||||
@@ -1131,9 +1131,9 @@ FLMEXP RCODE FLMAPI FlmSetDynamicMemoryLimit(
|
||||
#endif
|
||||
}
|
||||
|
||||
/*API~***********************************************************************
|
||||
/****************************************************************************
|
||||
Desc : Sets a hard memory limit for cache.
|
||||
*END************************************************************************/
|
||||
****************************************************************************/
|
||||
FLMEXP RCODE FLMAPI FlmSetHardMemoryLimit(
|
||||
FLMUINT uiPercent,
|
||||
FLMBOOL bPercentOfAvail,
|
||||
@@ -1174,9 +1174,9 @@ FLMEXP RCODE FLMAPI FlmSetHardMemoryLimit(
|
||||
return( rc);
|
||||
}
|
||||
|
||||
/*API~***********************************************************************
|
||||
/****************************************************************************
|
||||
Desc : Returns information about memory usage.
|
||||
*END************************************************************************/
|
||||
****************************************************************************/
|
||||
FLMEXP void FLMAPI FlmGetMemoryInfo(
|
||||
FLM_MEM_INFO * pMemInfo)
|
||||
{
|
||||
@@ -1506,10 +1506,9 @@ Exit:
|
||||
return( rc);
|
||||
}
|
||||
|
||||
|
||||
/*API~***********************************************************************
|
||||
/****************************************************************************
|
||||
Desc: Configures share attributes.
|
||||
*END************************************************************************/
|
||||
****************************************************************************/
|
||||
FLMEXP RCODE FLMAPI FlmConfig(
|
||||
eFlmConfigTypes eConfigType,
|
||||
void * Value1,
|
||||
@@ -1798,56 +1797,54 @@ FLMEXP RCODE FLMAPI FlmConfig(
|
||||
break;
|
||||
|
||||
case FLM_ASSIGN_HTTP_SYMS:
|
||||
//Note: before you attempt this, you had better have loaded the
|
||||
//necessary shared library...
|
||||
if ( gv_FlmSysData.HttpConfigParms.fnReg ||
|
||||
gv_FlmSysData.HttpConfigParms.fnDereg ||
|
||||
gv_FlmSysData.HttpConfigParms.fnReqPath ||
|
||||
gv_FlmSysData.HttpConfigParms.fnReqQuery ||
|
||||
gv_FlmSysData.HttpConfigParms.fnReqHdrValue ||
|
||||
gv_FlmSysData.HttpConfigParms.fnSetHdrValue ||
|
||||
gv_FlmSysData.HttpConfigParms.fnPrintf ||
|
||||
gv_FlmSysData.HttpConfigParms.fnEmit ||
|
||||
gv_FlmSysData.HttpConfigParms.fnSetNoCache ||
|
||||
gv_FlmSysData.HttpConfigParms.fnSendHeader ||
|
||||
gv_FlmSysData.HttpConfigParms.fnSetIOMode ||
|
||||
gv_FlmSysData.HttpConfigParms.fnSendBuffer ||
|
||||
gv_FlmSysData.HttpConfigParms.fnAcquireSession ||
|
||||
gv_FlmSysData.HttpConfigParms.fnReleaseSession ||
|
||||
gv_FlmSysData.HttpConfigParms.fnAcquireUser ||
|
||||
gv_FlmSysData.HttpConfigParms.fnReleaseUser ||
|
||||
gv_FlmSysData.HttpConfigParms.fnSetSessionValue ||
|
||||
gv_FlmSysData.HttpConfigParms.fnGetSessionValue ||
|
||||
gv_FlmSysData.HttpConfigParms.fnGetGblValue ||
|
||||
gv_FlmSysData.HttpConfigParms.fnSetGblValue ||
|
||||
gv_FlmSysData.HttpConfigParms.fnRecvBuffer )
|
||||
if( gv_FlmSysData.HttpConfigParms.fnReg ||
|
||||
gv_FlmSysData.HttpConfigParms.fnDereg ||
|
||||
gv_FlmSysData.HttpConfigParms.fnReqPath ||
|
||||
gv_FlmSysData.HttpConfigParms.fnReqQuery ||
|
||||
gv_FlmSysData.HttpConfigParms.fnReqHdrValue ||
|
||||
gv_FlmSysData.HttpConfigParms.fnSetHdrValue ||
|
||||
gv_FlmSysData.HttpConfigParms.fnPrintf ||
|
||||
gv_FlmSysData.HttpConfigParms.fnEmit ||
|
||||
gv_FlmSysData.HttpConfigParms.fnSetNoCache ||
|
||||
gv_FlmSysData.HttpConfigParms.fnSendHeader ||
|
||||
gv_FlmSysData.HttpConfigParms.fnSetIOMode ||
|
||||
gv_FlmSysData.HttpConfigParms.fnSendBuffer ||
|
||||
gv_FlmSysData.HttpConfigParms.fnAcquireSession ||
|
||||
gv_FlmSysData.HttpConfigParms.fnReleaseSession ||
|
||||
gv_FlmSysData.HttpConfigParms.fnAcquireUser ||
|
||||
gv_FlmSysData.HttpConfigParms.fnReleaseUser ||
|
||||
gv_FlmSysData.HttpConfigParms.fnSetSessionValue ||
|
||||
gv_FlmSysData.HttpConfigParms.fnGetSessionValue ||
|
||||
gv_FlmSysData.HttpConfigParms.fnGetGblValue ||
|
||||
gv_FlmSysData.HttpConfigParms.fnSetGblValue ||
|
||||
gv_FlmSysData.HttpConfigParms.fnRecvBuffer)
|
||||
{
|
||||
rc = RC_SET( FERR_HTTP_SYMS_EXIST);
|
||||
goto Exit;
|
||||
}
|
||||
else
|
||||
{
|
||||
gv_FlmSysData.HttpConfigParms.fnReg = ((HTTPCONFIGPARAMS *)Value1)->fnReg;
|
||||
gv_FlmSysData.HttpConfigParms.fnDereg = ((HTTPCONFIGPARAMS *)Value1)->fnDereg;
|
||||
gv_FlmSysData.HttpConfigParms.fnReqPath = ((HTTPCONFIGPARAMS *)Value1)->fnReqPath;
|
||||
gv_FlmSysData.HttpConfigParms.fnReqQuery = ((HTTPCONFIGPARAMS *)Value1)->fnReqQuery;
|
||||
gv_FlmSysData.HttpConfigParms.fnReqHdrValue = ((HTTPCONFIGPARAMS *)Value1)->fnReqHdrValue;
|
||||
gv_FlmSysData.HttpConfigParms.fnSetHdrValue = ((HTTPCONFIGPARAMS *)Value1)->fnSetHdrValue;
|
||||
gv_FlmSysData.HttpConfigParms.fnPrintf = ((HTTPCONFIGPARAMS *)Value1)->fnPrintf;
|
||||
gv_FlmSysData.HttpConfigParms.fnEmit = ((HTTPCONFIGPARAMS *)Value1)->fnEmit;
|
||||
gv_FlmSysData.HttpConfigParms.fnSetNoCache = ((HTTPCONFIGPARAMS *)Value1)->fnSetNoCache;
|
||||
gv_FlmSysData.HttpConfigParms.fnSendHeader = ((HTTPCONFIGPARAMS *)Value1)->fnSendHeader;
|
||||
gv_FlmSysData.HttpConfigParms.fnSetIOMode = ((HTTPCONFIGPARAMS *)Value1)->fnSetIOMode;
|
||||
gv_FlmSysData.HttpConfigParms.fnSendBuffer = ((HTTPCONFIGPARAMS *)Value1)->fnSendBuffer;
|
||||
gv_FlmSysData.HttpConfigParms.fnAcquireSession = ((HTTPCONFIGPARAMS *)Value1)->fnAcquireSession;
|
||||
gv_FlmSysData.HttpConfigParms.fnReleaseSession = ((HTTPCONFIGPARAMS *)Value1)->fnReleaseSession;
|
||||
gv_FlmSysData.HttpConfigParms.fnAcquireUser = ((HTTPCONFIGPARAMS *)Value1)->fnAcquireUser;
|
||||
gv_FlmSysData.HttpConfigParms.fnReleaseUser = ((HTTPCONFIGPARAMS *)Value1)->fnReleaseUser;
|
||||
gv_FlmSysData.HttpConfigParms.fnReg = ((HTTPCONFIGPARAMS *)Value1)->fnReg;
|
||||
gv_FlmSysData.HttpConfigParms.fnDereg = ((HTTPCONFIGPARAMS *)Value1)->fnDereg;
|
||||
gv_FlmSysData.HttpConfigParms.fnReqPath = ((HTTPCONFIGPARAMS *)Value1)->fnReqPath;
|
||||
gv_FlmSysData.HttpConfigParms.fnReqQuery = ((HTTPCONFIGPARAMS *)Value1)->fnReqQuery;
|
||||
gv_FlmSysData.HttpConfigParms.fnReqHdrValue = ((HTTPCONFIGPARAMS *)Value1)->fnReqHdrValue;
|
||||
gv_FlmSysData.HttpConfigParms.fnSetHdrValue = ((HTTPCONFIGPARAMS *)Value1)->fnSetHdrValue;
|
||||
gv_FlmSysData.HttpConfigParms.fnPrintf = ((HTTPCONFIGPARAMS *)Value1)->fnPrintf;
|
||||
gv_FlmSysData.HttpConfigParms.fnEmit = ((HTTPCONFIGPARAMS *)Value1)->fnEmit;
|
||||
gv_FlmSysData.HttpConfigParms.fnSetNoCache = ((HTTPCONFIGPARAMS *)Value1)->fnSetNoCache;
|
||||
gv_FlmSysData.HttpConfigParms.fnSendHeader = ((HTTPCONFIGPARAMS *)Value1)->fnSendHeader;
|
||||
gv_FlmSysData.HttpConfigParms.fnSetIOMode = ((HTTPCONFIGPARAMS *)Value1)->fnSetIOMode;
|
||||
gv_FlmSysData.HttpConfigParms.fnSendBuffer = ((HTTPCONFIGPARAMS *)Value1)->fnSendBuffer;
|
||||
gv_FlmSysData.HttpConfigParms.fnAcquireSession = ((HTTPCONFIGPARAMS *)Value1)->fnAcquireSession;
|
||||
gv_FlmSysData.HttpConfigParms.fnReleaseSession = ((HTTPCONFIGPARAMS *)Value1)->fnReleaseSession;
|
||||
gv_FlmSysData.HttpConfigParms.fnAcquireUser = ((HTTPCONFIGPARAMS *)Value1)->fnAcquireUser;
|
||||
gv_FlmSysData.HttpConfigParms.fnReleaseUser = ((HTTPCONFIGPARAMS *)Value1)->fnReleaseUser;
|
||||
gv_FlmSysData.HttpConfigParms.fnSetSessionValue = ((HTTPCONFIGPARAMS *)Value1)->fnSetSessionValue;
|
||||
gv_FlmSysData.HttpConfigParms.fnGetSessionValue = ((HTTPCONFIGPARAMS *)Value1)->fnGetSessionValue;
|
||||
gv_FlmSysData.HttpConfigParms.fnGetGblValue = ((HTTPCONFIGPARAMS *)Value1)->fnGetGblValue;
|
||||
gv_FlmSysData.HttpConfigParms.fnSetGblValue = ((HTTPCONFIGPARAMS *)Value1)->fnSetGblValue;
|
||||
gv_FlmSysData.HttpConfigParms.fnRecvBuffer = ((HTTPCONFIGPARAMS *)Value1)->fnRecvBuffer;
|
||||
gv_FlmSysData.HttpConfigParms.fnGetGblValue = ((HTTPCONFIGPARAMS *)Value1)->fnGetGblValue;
|
||||
gv_FlmSysData.HttpConfigParms.fnSetGblValue = ((HTTPCONFIGPARAMS *)Value1)->fnSetGblValue;
|
||||
gv_FlmSysData.HttpConfigParms.fnRecvBuffer = ((HTTPCONFIGPARAMS *)Value1)->fnRecvBuffer;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1868,28 +1865,27 @@ FLMEXP RCODE FLMAPI FlmConfig(
|
||||
break;
|
||||
|
||||
case FLM_UNASSIGN_HTTP_SYMS:
|
||||
gv_FlmSysData.HttpConfigParms.fnReg = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnDereg = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnReqPath = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnReqQuery = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnReqHdrValue = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnSetHdrValue = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnPrintf = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnEmit = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnSetNoCache = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnSendHeader = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnSetIOMode = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnSendBuffer = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnAcquireSession = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnReleaseSession = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnAcquireUser = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnReleaseUser = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnSetSessionValue = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnGetSessionValue = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnGetGblValue = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnSetGblValue = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnRecvBuffer = NULL;
|
||||
|
||||
gv_FlmSysData.HttpConfigParms.fnReg = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnDereg = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnReqPath = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnReqQuery = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnReqHdrValue = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnSetHdrValue = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnPrintf = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnEmit = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnSetNoCache = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnSendHeader = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnSetIOMode = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnSendBuffer = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnAcquireSession = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnReleaseSession = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnAcquireUser = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnReleaseUser = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnSetSessionValue = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnGetSessionValue = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnGetGblValue = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnSetGblValue = NULL;
|
||||
gv_FlmSysData.HttpConfigParms.fnRecvBuffer = NULL;
|
||||
break;
|
||||
|
||||
case FLM_KILL_DB_HANDLES:
|
||||
@@ -1991,9 +1987,9 @@ Exit:
|
||||
return( rc);
|
||||
}
|
||||
|
||||
/*API~***********************************************************************
|
||||
/****************************************************************************
|
||||
Desc : Gets configured shared attributes.
|
||||
*END************************************************************************/
|
||||
****************************************************************************/
|
||||
FLMEXP RCODE FLMAPI FlmGetConfig(
|
||||
eFlmConfigTypes eConfigType,
|
||||
void * Value1
|
||||
@@ -2153,9 +2149,9 @@ FLMEXP RCODE FLMAPI FlmGetConfig(
|
||||
return( rc);
|
||||
}
|
||||
|
||||
/*API~***********************************************************************
|
||||
/****************************************************************************
|
||||
Desc:
|
||||
*END************************************************************************/
|
||||
****************************************************************************/
|
||||
FLMEXP RCODE FLMAPI FlmGetThreadInfo(
|
||||
POOL * pPool,
|
||||
F_THREAD_INFO ** ppThreadInfo,
|
||||
@@ -2163,7 +2159,7 @@ FLMEXP RCODE FLMAPI FlmGetThreadInfo(
|
||||
const char * pszUrl)
|
||||
{
|
||||
RCODE rc = FERR_OK;
|
||||
CS_CONTEXT_p pCSContext = NULL;
|
||||
CS_CONTEXT * pCSContext = NULL;
|
||||
|
||||
if( pszUrl)
|
||||
{
|
||||
@@ -2466,6 +2462,15 @@ void flmFreeFile(
|
||||
pFile->pCPThrd->Release();
|
||||
pFile->pCPThrd = NULL;
|
||||
}
|
||||
|
||||
// Shutdown the monitor thread
|
||||
|
||||
if( pFile->pMonitorThrd)
|
||||
{
|
||||
pFile->pMonitorThrd->stopThread();
|
||||
pFile->pMonitorThrd->Release();
|
||||
pFile->pMonitorThrd = NULL;
|
||||
}
|
||||
|
||||
f_mutexLock( gv_FlmSysData.hShareMutex);
|
||||
|
||||
@@ -2612,7 +2617,7 @@ void flmFreeFile(
|
||||
{
|
||||
f_free( &pFile->pszDbPassword);
|
||||
}
|
||||
|
||||
|
||||
// Free the FFILE
|
||||
|
||||
f_free( &pFile);
|
||||
@@ -2666,7 +2671,6 @@ Desc : Cleans up - assumes that the spin lock has already been
|
||||
FSTATIC void flmCleanup( void)
|
||||
{
|
||||
FLMUINT uiCnt;
|
||||
FLMINT iEventCategory;
|
||||
|
||||
// NOTE: We are checking and decrementing a global variable here.
|
||||
// However, on platforms that properly support atomic exchange,
|
||||
@@ -2863,26 +2867,44 @@ FSTATIC void flmCleanup( void)
|
||||
f_mutexDestroy( &gv_FlmSysData.HttpConfigParms.hMutex);
|
||||
}
|
||||
|
||||
|
||||
// Free up callbacks that have been registered for events.
|
||||
|
||||
for (iEventCategory = 0;
|
||||
iEventCategory < F_MAX_EVENT_CATEGORIES;
|
||||
iEventCategory++)
|
||||
if (gv_FlmSysData.UpdateEvents.hMutex != F_MUTEX_NULL)
|
||||
{
|
||||
if (gv_FlmSysData.EventHdrs [iEventCategory].hMutex != F_MUTEX_NULL)
|
||||
while (gv_FlmSysData.UpdateEvents.pEventCBList)
|
||||
{
|
||||
while (gv_FlmSysData.EventHdrs [iEventCategory].pEventCBList)
|
||||
{
|
||||
flmFreeEvent(
|
||||
gv_FlmSysData.EventHdrs [iEventCategory].pEventCBList,
|
||||
gv_FlmSysData.EventHdrs [iEventCategory].hMutex,
|
||||
&gv_FlmSysData.EventHdrs [iEventCategory].pEventCBList);
|
||||
}
|
||||
f_mutexDestroy( &gv_FlmSysData.EventHdrs [iEventCategory].hMutex);
|
||||
flmFreeEvent(
|
||||
gv_FlmSysData.UpdateEvents.pEventCBList,
|
||||
gv_FlmSysData.UpdateEvents.hMutex,
|
||||
&gv_FlmSysData.UpdateEvents.pEventCBList);
|
||||
}
|
||||
f_mutexDestroy( &gv_FlmSysData.UpdateEvents.hMutex);
|
||||
}
|
||||
|
||||
if (gv_FlmSysData.LockEvents.hMutex != F_MUTEX_NULL)
|
||||
{
|
||||
while (gv_FlmSysData.LockEvents.pEventCBList)
|
||||
{
|
||||
flmFreeEvent(
|
||||
gv_FlmSysData.LockEvents.pEventCBList,
|
||||
gv_FlmSysData.LockEvents.hMutex,
|
||||
&gv_FlmSysData.LockEvents.pEventCBList);
|
||||
}
|
||||
f_mutexDestroy( &gv_FlmSysData.LockEvents.hMutex);
|
||||
}
|
||||
|
||||
if (gv_FlmSysData.SizeEvents.hMutex != F_MUTEX_NULL)
|
||||
{
|
||||
while (gv_FlmSysData.SizeEvents.pEventCBList)
|
||||
{
|
||||
flmFreeEvent(
|
||||
gv_FlmSysData.SizeEvents.pEventCBList,
|
||||
gv_FlmSysData.SizeEvents.hMutex,
|
||||
&gv_FlmSysData.SizeEvents.pEventCBList);
|
||||
}
|
||||
f_mutexDestroy( &gv_FlmSysData.SizeEvents.hMutex);
|
||||
}
|
||||
|
||||
// Free (release) FLAIM's File Shared File System Object.
|
||||
|
||||
if (gv_FlmSysData.pFileSystem)
|
||||
@@ -2959,13 +2981,13 @@ FSTATIC void flmCleanup( void)
|
||||
#endif
|
||||
}
|
||||
|
||||
/*API~***********************************************************************
|
||||
/****************************************************************************
|
||||
Desc : Shuts down FLAIM.
|
||||
Notes: Allows itself to be called multiple times and even before FlmStartup
|
||||
is called, or even if FlmStartup fails. Warning: May not handle
|
||||
race conditions very well on platforms that do not support atomic
|
||||
exchange.
|
||||
*END************************************************************************/
|
||||
****************************************************************************/
|
||||
FLMEXP void FLMAPI FlmShutdown( void)
|
||||
{
|
||||
flmLockSysData();
|
||||
@@ -3483,7 +3505,7 @@ Desc: This routine functions as a thread. It monitors open files and
|
||||
frees up files which have been closed longer than the maximum
|
||||
close time.
|
||||
****************************************************************************/
|
||||
RCODE flmMonitor(
|
||||
RCODE flmSystemMonitor(
|
||||
F_Thread * pThread)
|
||||
{
|
||||
FLMUINT uiLastUnusedCleanupTime = 0;
|
||||
@@ -3601,9 +3623,9 @@ RCODE flmMonitor(
|
||||
return( FERR_OK);
|
||||
}
|
||||
|
||||
/*API~***********************************************************************
|
||||
/****************************************************************************
|
||||
Desc : Registers a callback function to receive events.
|
||||
*END************************************************************************/
|
||||
****************************************************************************/
|
||||
FLMEXP RCODE FLMAPI FlmRegisterForEvent(
|
||||
FEventCategory eCategory,
|
||||
FEVENT_CB fnEventCB,
|
||||
@@ -3615,14 +3637,6 @@ FLMEXP RCODE FLMAPI FlmRegisterForEvent(
|
||||
|
||||
*phEventRV = HFEVENT_NULL;
|
||||
|
||||
// Make sure it is a legal event category to register for.
|
||||
|
||||
if (eCategory >= F_MAX_EVENT_CATEGORIES)
|
||||
{
|
||||
rc = RC_SET( FERR_NOT_IMPLEMENTED);
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
// Allocate an event structure
|
||||
|
||||
if (RC_BAD( rc = f_calloc( (FLMUINT)(sizeof( FEVENT)), &pEvent)))
|
||||
@@ -3637,26 +3651,68 @@ FLMEXP RCODE FLMAPI FlmRegisterForEvent(
|
||||
pEvent->eCategory = eCategory;
|
||||
pEvent->fnEventCB = fnEventCB;
|
||||
pEvent->pvAppData = pvAppData;
|
||||
// pEvent->pPrev = NULL; // done by flmAlloc above.
|
||||
|
||||
// Mutex should be locked to link into list.
|
||||
|
||||
f_mutexLock( gv_FlmSysData.EventHdrs [eCategory].hMutex);
|
||||
if ((pEvent->pNext =
|
||||
gv_FlmSysData.EventHdrs [eCategory].pEventCBList) != NULL)
|
||||
|
||||
switch( eCategory)
|
||||
{
|
||||
pEvent->pNext->pPrev = pEvent;
|
||||
case F_EVENT_UPDATES:
|
||||
{
|
||||
f_mutexLock( gv_FlmSysData.UpdateEvents.hMutex);
|
||||
if ((pEvent->pNext =
|
||||
gv_FlmSysData.UpdateEvents.pEventCBList) != NULL)
|
||||
{
|
||||
pEvent->pNext->pPrev = pEvent;
|
||||
}
|
||||
|
||||
gv_FlmSysData.UpdateEvents.pEventCBList = pEvent;
|
||||
f_mutexUnlock( gv_FlmSysData.UpdateEvents.hMutex);
|
||||
break;
|
||||
}
|
||||
|
||||
case F_EVENT_LOCKS:
|
||||
{
|
||||
f_mutexLock( gv_FlmSysData.LockEvents.hMutex);
|
||||
if ((pEvent->pNext =
|
||||
gv_FlmSysData.LockEvents.pEventCBList) != NULL)
|
||||
{
|
||||
pEvent->pNext->pPrev = pEvent;
|
||||
}
|
||||
|
||||
gv_FlmSysData.LockEvents.pEventCBList = pEvent;
|
||||
f_mutexUnlock( gv_FlmSysData.LockEvents.hMutex);
|
||||
break;
|
||||
}
|
||||
|
||||
case F_EVENT_SIZE:
|
||||
{
|
||||
f_mutexLock( gv_FlmSysData.SizeEvents.hMutex);
|
||||
if ((pEvent->pNext =
|
||||
gv_FlmSysData.SizeEvents.pEventCBList) != NULL)
|
||||
{
|
||||
pEvent->pNext->pPrev = pEvent;
|
||||
}
|
||||
|
||||
gv_FlmSysData.SizeEvents.pEventCBList = pEvent;
|
||||
f_mutexUnlock( gv_FlmSysData.SizeEvents.hMutex);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
rc = RC_SET_AND_ASSERT( FERR_NOT_IMPLEMENTED);
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
gv_FlmSysData.EventHdrs [eCategory].pEventCBList = pEvent;
|
||||
f_mutexUnlock( gv_FlmSysData.EventHdrs [eCategory].hMutex);
|
||||
|
||||
Exit:
|
||||
|
||||
return( rc);
|
||||
}
|
||||
|
||||
/*API~***********************************************************************
|
||||
/****************************************************************************
|
||||
Desc : Deregisters a callback function that was registered to receive events.
|
||||
*END************************************************************************/
|
||||
****************************************************************************/
|
||||
FLMEXP void FLMAPI FlmDeregisterForEvent(
|
||||
HFEVENT * phEventRV)
|
||||
{
|
||||
@@ -3664,12 +3720,38 @@ FLMEXP void FLMAPI FlmDeregisterForEvent(
|
||||
{
|
||||
FEVENT * pEvent = (FEVENT *)(*phEventRV);
|
||||
|
||||
if (pEvent->eCategory < F_MAX_EVENT_CATEGORIES)
|
||||
switch( pEvent->eCategory)
|
||||
{
|
||||
flmFreeEvent( pEvent,
|
||||
gv_FlmSysData.EventHdrs [pEvent->eCategory].hMutex,
|
||||
&gv_FlmSysData.EventHdrs [pEvent->eCategory].pEventCBList);
|
||||
case F_EVENT_UPDATES:
|
||||
{
|
||||
flmFreeEvent( pEvent,
|
||||
gv_FlmSysData.UpdateEvents.hMutex,
|
||||
&gv_FlmSysData.UpdateEvents.pEventCBList);
|
||||
break;
|
||||
}
|
||||
|
||||
case F_EVENT_LOCKS:
|
||||
{
|
||||
flmFreeEvent( pEvent,
|
||||
gv_FlmSysData.LockEvents.hMutex,
|
||||
&gv_FlmSysData.LockEvents.pEventCBList);
|
||||
break;
|
||||
}
|
||||
|
||||
case F_EVENT_SIZE:
|
||||
{
|
||||
flmFreeEvent( pEvent,
|
||||
gv_FlmSysData.SizeEvents.hMutex,
|
||||
&gv_FlmSysData.SizeEvents.pEventCBList);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
flmAssert( 0);
|
||||
}
|
||||
}
|
||||
|
||||
*phEventRV = HFEVENT_NULL;
|
||||
}
|
||||
}
|
||||
@@ -3686,16 +3768,58 @@ void flmDoEventCallback(
|
||||
{
|
||||
FEVENT * pEvent;
|
||||
|
||||
f_mutexLock( gv_FlmSysData.EventHdrs [eCategory].hMutex);
|
||||
pEvent = gv_FlmSysData.EventHdrs [eCategory].pEventCBList;
|
||||
while (pEvent)
|
||||
switch( eCategory)
|
||||
{
|
||||
(*pEvent->fnEventCB)( eEventType, pEvent->pvAppData,
|
||||
pvEventData1,
|
||||
pvEventData2);
|
||||
pEvent = pEvent->pNext;
|
||||
case F_EVENT_UPDATES:
|
||||
{
|
||||
f_mutexLock( gv_FlmSysData.UpdateEvents.hMutex);
|
||||
pEvent = gv_FlmSysData.UpdateEvents.pEventCBList;
|
||||
while (pEvent)
|
||||
{
|
||||
(*pEvent->fnEventCB)( eEventType, pEvent->pvAppData,
|
||||
pvEventData1,
|
||||
pvEventData2);
|
||||
pEvent = pEvent->pNext;
|
||||
}
|
||||
f_mutexUnlock( gv_FlmSysData.UpdateEvents.hMutex);
|
||||
break;
|
||||
}
|
||||
|
||||
case F_EVENT_LOCKS:
|
||||
{
|
||||
f_mutexLock( gv_FlmSysData.LockEvents.hMutex);
|
||||
pEvent = gv_FlmSysData.LockEvents.pEventCBList;
|
||||
while (pEvent)
|
||||
{
|
||||
(*pEvent->fnEventCB)( eEventType, pEvent->pvAppData,
|
||||
pvEventData1,
|
||||
pvEventData2);
|
||||
pEvent = pEvent->pNext;
|
||||
}
|
||||
f_mutexUnlock( gv_FlmSysData.LockEvents.hMutex);
|
||||
break;
|
||||
}
|
||||
|
||||
case F_EVENT_SIZE:
|
||||
{
|
||||
f_mutexLock( gv_FlmSysData.SizeEvents.hMutex);
|
||||
pEvent = gv_FlmSysData.SizeEvents.pEventCBList;
|
||||
while (pEvent)
|
||||
{
|
||||
(*pEvent->fnEventCB)( eEventType, pEvent->pvAppData,
|
||||
pvEventData1,
|
||||
pvEventData2);
|
||||
pEvent = pEvent->pNext;
|
||||
}
|
||||
f_mutexUnlock( gv_FlmSysData.SizeEvents.hMutex);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
flmAssert( 0);
|
||||
}
|
||||
}
|
||||
f_mutexUnlock( gv_FlmSysData.EventHdrs [eCategory].hMutex);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@@ -5238,8 +5362,7 @@ Exit:
|
||||
Desc: Deletes (releases) and F_CCS objected referenced in the ITT table.
|
||||
*****************************************************************************/
|
||||
void flmDeleteCCSRefs(
|
||||
FDICT * pDict
|
||||
)
|
||||
FDICT * pDict)
|
||||
{
|
||||
FLMUINT uiLoop;
|
||||
F_CCS * pCcs = NULL;
|
||||
|
||||
Reference in New Issue
Block a user