📄 bf_util.c
字号:
psMappingEntry->eAppDataAreaId = psLastEntry->eAppDataAreaId;
psMappingEntry->iAppDataAreaOffset = psLastEntry->iAppDataAreaOffset;
psMappingEntry->iMaxMappingSize = psLastEntry->iMaxMappingSize;
psMappingEntry->iStatusBit = psLastEntry->iStatusBit;
psMappingEntry->iStatusStyle = psLastEntry->iStatusStyle;
psMappingEntry->iConfiguredUsers = psLastEntry->iConfiguredUsers;
psMappingEntry->iActiveUsers = psLastEntry->iActiveUsers;
psMappingEntry->iTransportId = psLastEntry->iTransportId;
psMappingEntry->iActiveEntry = psLastEntry->iActiveEntry;
psMappingEntry->iActiveSubList = psLastEntry->iActiveSubList;
/*
** Note the movement of the main list entry in the list indexed
** by transport id.
*/
if( psMappingEntry->iTransportId != 0 )
{
bf_s.aiMappingByTransport[ psMappingEntry->iTransportId ] = iMappingEntry;
}
}
GS_ExitCritical();
/*
** Debug aid. Clean out the end entry.
*/
Cleanup:
psLastEntry = &bf_s.asMappingEntries[ bf_s.iMappingEntries ];
psLastEntry->iClass = 0;
psLastEntry->iInstance = 0;
psLastEntry->fCon = FALSE;
psLastEntry->eAppDataAreaId = AD_NO_APP_DATA_AREA;
psLastEntry->iAppDataAreaOffset = 0;
psLastEntry->iMaxMappingSize = 0;
psLastEntry->iStatusBit = AB_NO_CONN_STATUS_BIT;
psLastEntry->iStatusStyle = 0;
psLastEntry->iConfiguredUsers = 0;
psLastEntry->iActiveUsers = 0;
psLastEntry->iTransportId = 0;
psLastEntry->iActiveEntry = BF_NO_MAPPING;
psLastEntry->iActiveSubList = 0;
} /* end of bf_DeleteMapping() */
/*---------------------------------------------------------------------------
** bf_FindMapping()
**---------------------------------------------------------------------------
*/
UINT16 bf_FindMapping( UINT16 iClass, UINT16 iInstance, BOOL fCon )
{
UINT16 iMappingEntry;
volatile bf_MappingEntryType *psMappingEntry;
/*
** If the class # is 0, don't even bother looking.
*/
if( iClass == 0 )
{
return( BF_NO_MAPPING );
}
/*
** Scan the unordered mapping entry array for a match on
** class, instance & direction.
*/
psMappingEntry = &bf_s.asMappingEntries[ 0 ];
iMappingEntry = 0;
while( iMappingEntry < bf_s.iMappingEntries )
{
if( ( psMappingEntry->iClass == iClass ) &&
( psMappingEntry->iInstance == iInstance ) &&
( psMappingEntry->fCon == fCon ) )
{
return( iMappingEntry );
}
++psMappingEntry;
++iMappingEntry;
}
return( BF_NO_MAPPING );
} /* end of bf_FindMapping() */
/*---------------------------------------------------------------------------
** bf_InquireMappings()
**---------------------------------------------------------------------------
*/
void bf_InquireMappings( BF_InquireTrrblType *psTrrbl )
{
UINT16 iEntry;
volatile bf_MappingEntryType *psEntry;
/*
** Fill in enough to say there are no mappings in case we don't find one.
*/
psTrrbl->sPro.eAppDataAreaId = AD_NO_APP_DATA_AREA;
psTrrbl->sCon.eAppDataAreaId = AD_NO_APP_DATA_AREA;
/*
** Find the producer mapping entry if it exists.
*/
iEntry = bf_FindMapping( psTrrbl->sPro.iClass, psTrrbl->sPro.iInstance, FALSE );
if( iEntry != BF_NO_MAPPING )
{
/*
** Pull out the details.
*/
psEntry = &bf_s.asMappingEntries[ iEntry ];
if( psEntry->iActiveEntry != BF_NO_MAPPING )
{
psTrrbl->sPro.iResyncSize = bf_s.asActiveEntries[ psEntry->iActiveEntry ].iResyncSize;
psTrrbl->sPro.iResyncRate = 1;
}
else
{
psTrrbl->sPro.iResyncSize = 0;
psTrrbl->sPro.iResyncRate = 0;
}
psTrrbl->sPro.iStatusBit = psEntry->iStatusBit;
psTrrbl->sPro.iStatusStyle = psEntry->iStatusStyle;
psTrrbl->sPro.eAppDataAreaId = psEntry->eAppDataAreaId;
psTrrbl->sPro.iAppDataAreaOffset = psEntry->iAppDataAreaOffset;
psTrrbl->sPro.iMaxMappingSize = psEntry->iMaxMappingSize;
psTrrbl->sPro.iTransportId = psEntry->iTransportId;
/*
** Reserve or unreserve a copy if this is a reservation request.
*/
if( psTrrbl->eRequest == TREQ_RESERVE_MAPPINGS )
{
psEntry->iActiveUsers++;
}
}
/*
** Find the consumer mapping entry if it exists.
*/
iEntry = bf_FindMapping( psTrrbl->sCon.iClass, psTrrbl->sCon.iInstance, TRUE );
if( iEntry != BF_NO_MAPPING )
{
/*
** Pull out the details.
*/
psEntry = &bf_s.asMappingEntries[ iEntry ];
if( psEntry->iActiveEntry != BF_NO_MAPPING )
{
psTrrbl->sCon.iResyncSize = bf_s.asActiveEntries[ psEntry->iActiveEntry ].iResyncSize;
psTrrbl->sCon.iResyncRate = 1;
}
else
{
psTrrbl->sCon.iResyncSize = 0;
psTrrbl->sCon.iResyncRate = 0;
}
psTrrbl->sCon.iStatusBit = psEntry->iStatusBit;
psTrrbl->sCon.iStatusStyle = psEntry->iStatusStyle;
psTrrbl->sCon.eAppDataAreaId = psEntry->eAppDataAreaId;
psTrrbl->sCon.iAppDataAreaOffset = psEntry->iAppDataAreaOffset;
psTrrbl->sCon.iMaxMappingSize = psEntry->iMaxMappingSize;
psTrrbl->sCon.iTransportId = psEntry->iTransportId;
/*
** Reserve a copy if this is a reservation request.
*/
if( psTrrbl->eRequest == TREQ_RESERVE_MAPPINGS )
{
psEntry->iActiveUsers++;
}
}
} /* end of bf_InquireMappings() */
/*---------------------------------------------------------------------------
** bf_MoveActiveEntry()
**---------------------------------------------------------------------------
*/
void bf_MoveActiveEntry( UINT16 iDest, UINT16 iSrc )
{
volatile BF_ActiveEntryType *psDest;
volatile BF_ActiveEntryType *psSrc;
/*
** Copy the data.
*/
psSrc = &bf_s.asActiveEntries[ iSrc ];
psDest = &bf_s.asActiveEntries[ iDest ];
psDest->pSource = psSrc->pSource;
psDest->pDestination = psSrc->pDestination;
psDest->iResyncSize = psSrc->iResyncSize;
psDest->iTranBufOffset = psSrc->iTranBufOffset;
psDest->pAddStatus = psSrc->pAddStatus;
psDest->iTransportId = psSrc->iTransportId;
psDest->iPort = psSrc->iPort;
/*
** Make the pointer in the main entry point to the new active list entry.
*/
bf_s.asMappingEntries[ bf_s.aiMappingByTransport[ psSrc->iTransportId ] ].iActiveEntry = iDest;
/*
** Mark the original as dead. (For debug use only.)
*/
psSrc->iTransportId = 0;
} /* end of bf_MoveActiveEntry() */
/*---------------------------------------------------------------------------
** bf_RegisterAppDataArea()
**---------------------------------------------------------------------------
*/
void bf_RegisterAppDataArea( BF_RegisterTrrblType *pTrrbl )
{
UINT16 i;
volatile bf_AppDataAreaType *psAppDataArea;
volatile bf_ActiveSubListType *psActiveSubList;
/*
** Initialize the app mem area entry.
*/
psAppDataArea = &bf_s.asAppDataAreas[ pTrrbl->eAppDataAreaId ];
psAppDataArea->pBaseAddress = pTrrbl->pBaseAddress;
psAppDataArea->iSize = pTrrbl->iSize;
psAppDataArea->xMNotifyQueue = pTrrbl->xMNotifyQueue;
psAppDataArea->iMNotifyBitMsg = pTrrbl->iMNotifyBitMsg;
psAppDataArea->xMNotifySemaphore = pTrrbl->xMNotifySemaphore;
psAppDataArea->xSNotifyQueue = pTrrbl->xSNotifyQueue;
psAppDataArea->iSNotifyBitMsg = pTrrbl->iSNotifyBitMsg;
psAppDataArea->xSNotifySemaphore = pTrrbl->xSNotifySemaphore;
psAppDataArea->lCpuTimePerMessage = pTrrbl->lCpuTimePerMessage;
psAppDataArea->lCpuTimePerEntry = pTrrbl->lCpuTimePerEntry;
psAppDataArea->lCpuTimePerByte = pTrrbl->lCpuTimePerByte;
psAppDataArea->lCpuTimeMaxPerSecArea = pTrrbl->lCpuTimeMaxPerSecArea;
bf_s.lCpuTimeMaxPerSecSystem = pTrrbl->lCpuTimeMaxPerSecSystem;
/*
** Initialize the active entry sub-lists.
*/
psAppDataArea->iNextSubList = 0;
psActiveSubList = &psAppDataArea->asActiveSubList[ 0 ];
for( i = 0; i < BF_NUM_SUB_LISTS; i++ )
{
psActiveSubList->lCpuTimeAreaSubList = 0;
psActiveSubList->iActiveEntry1 = 0;
psActiveSubList->iActiveEntries = 0;
++psActiveSubList;
}
} /* end of bf_RegisterAppDataArea() */
/*---------------------------------------------------------------------------
** bf_Task()
**---------------------------------------------------------------------------
*/
TASKRETURN bf_Task( TASKPARAM )
{
bf_upsTrrblType upsTrrbl;
/*
** Process buffer fragment manager tribbles for eternity...
** Note that cases that end in "break" get their tribbles returned,
** while cases that end in "continue" do not.
*/
while( 1 )
{
upsTrrbl.Generic = GS_TakeTrrbl( BF_xQid );
switch( upsTrrbl.Generic->eRequest )
{
case TREQ_ADD_MAPPING:
bf_AddMapping( upsTrrbl.Add );
break;
case TREQ_DELETE_MAPPING:
bf_DeleteMapping( upsTrrbl.Delete );
break;
case TREQ_INQUIRE_MAPPINGS:
case TREQ_RESERVE_MAPPINGS:
bf_InquireMappings( upsTrrbl.Inquire );
break;
case TREQ_ACTIVATE_MAPPING:
bf_ActivateMapping( upsTrrbl.Activate );
break;
case TREQ_DEACTIVATE_MAPPING:
bf_DeactivateMapping( upsTrrbl.Deactivate );
break;
case TREQ_ACCESS_MAPPED_DATA:
bf_AccessMapping( upsTrrbl.Access );
continue;
case TREQ_REGISTER:
bf_RegisterAppDataArea( upsTrrbl.Register );
break;
default:
GS_LogEvent( GS_UNSUPPORTED_TRIBBLE_REQUEST, upsTrrbl.Generic->eRequest, NULL, FATAL );
break;
}
/*
** Return the request tribble back to the sender.
*/
GS_ReturnTrrbl( upsTrrbl.Generic );
} /* end of while( 1 ) */
} /* end of bf_Task() */
#endif /* #ifdef BUFFER_FRAGMENT_MAPPER */
/****************************************************************************
*****************************************************************************
**
** End of BF_UTIL.C
**
*****************************************************************************
****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -