📄 channel.c
字号:
channelCreateExit1:
return StatusCode;
}
TMStatus channelDestroy (
UInt32 ChannelHandle)
{
ChannelManagerObject* ChannelManager;
ChannelObject* Channel =
(ChannelObject*) ChannelHandle;
UInt32 NameSpaceHandle;
/* DPF(13,("tmman:channelDestroy\n" )); */
if ( objectValidate ( Channel, ChannelFourCC ) != True )
{
DPF(0,("tmman:channelDestroy:objectVaidate:FAIL\n"));
return statusInvalidHandle;
}
ChannelManager = (ChannelManagerObject* )Channel->ChannelManager;
NameSpaceHandle = Channel->NameSpaceHandle;
objectlistDelete (
&ChannelManager->List,
Channel,
Channel->ChannelNumber );
objectFree ( Channel );
namespaceDestroy ( NameSpaceHandle );
return statusSuccess;
}
TMStatus channelSend(
UInt32 ChannelHandle,
Pointer Packet )
{
ChannelPacket* MailslotPointer;
UInt32 WriteIndex, ReadIndex;
TMStatus StatusCode;
ChannelObject* Channel =
(ChannelObject*) ChannelHandle;
ChannelManagerObject* ChannelManager;
UInt32 NestedContext;
UInt32 TempValue1, TempValue2;
if ( objectValidate ( Channel, ChannelFourCC ) != True )
{
DPF(0,("tmman:channelSend:objectVaidate:FAIL\n"));
return statusInvalidHandle;
}
ChannelManager = Channel->ChannelManager;
/* ENTER CRITICAL SECITON */
critsectEnter ( ChannelManager->CriticalSectionHandle, &NestedContext );
/* sequence number inseration has to be atomic */
/*
DPF(13,("channel:Send:ToPeer:MBOX&[%x]:WR&[%x]:RD&[%x]:\n",
halAccess32( ChannelManager->HalHandle, (UInt32)ChannelManager->ToPeerMailbox ),
halAccess32( ChannelManager->HalHandle, (UInt32)&ChannelManager->ToPeerMailboxControl->WriteIndex) ,
halAccess32( ChannelManager->HalHandle, (UInt32)&ChannelManager->ToPeerMailboxControl->ReadIndex ) ));
*/
halAccessEnable( ChannelManager->HalHandle );
WriteIndex = halAccess32 ( ChannelManager->HalHandle,
ChannelManager->ToPeerMailboxControl->WriteIndex );
ReadIndex = halAccess32( ChannelManager->HalHandle,
ChannelManager->ToPeerMailboxControl->ReadIndex );
halAccessDisable( ChannelManager->HalHandle );
WriteIndex =
( WriteIndex + 1 ) % ( ChannelManager->MailboxCount );
if ( WriteIndex == ReadIndex )
{
UInt32 Idx;
/* no point processing the other channels if mailbox has no room */
DPF(0,("tmman:channelSend:FAIL\n"));
/*
DPF(13,("channel:Queue:Dump:"));
for ( Idx = 0 ; Idx < ChannelManager->MailboxCount ; Idx ++ )
{
MailslotPointer = ( ((UInt8*)ChannelManager->ToPeerMailbox) +
( Idx * ChannelManager->MailslotSize ) );
DPF(13,("[%x]", *(UInt32*)(MailslotPointer+1) ));
}
DPF(13,("\n"));
*/
StatusCode = statusChannelMailboxFullError;
/* LEAVE CRITICAL SECITON */
critsectLeave ( ChannelManager->CriticalSectionHandle, &NestedContext );
goto chnlSendExit1;
}
halAccessEnable( ChannelManager->HalHandle );
MailslotPointer =
(ChannelPacket*)( ((UInt8*)ChannelManager->ToPeerMailbox) +
( halAccess32 ( ChannelManager->HalHandle,
ChannelManager->ToPeerMailboxControl->WriteIndex ) *
ChannelManager->MailslotSize) );
MailslotPointer->ChannelID = halAccess32 ( ChannelManager->HalHandle,
Channel->ChannelNumber );
MailslotPointer->Sequence = halAccess32 ( ChannelManager->HalHandle,
TempValue1 = ChannelManager->PacketSendSeq );
halAccessDisable( ChannelManager->HalHandle );
ChannelManager->PacketSendSeq++;
/* the user should take care of endianness of packet data */
halAccessEnable(ChannelManager->HalHandle);
memCopy (
(Pointer)(MailslotPointer + 1), /* point to the packet struct in the mailslot */
(Pointer)Packet,
ChannelManager->PacketSize );
TempValue2 = *(UInt32*)(MailslotPointer+1);
halAccessDisable(ChannelManager->HalHandle);
DPF(13,("channel:Send:Packet:ID[%x]:SQ[%x]:DT[%x]:WR[%x]:RD[%x]\n",
Channel->ChannelNumber,
TempValue1,
TempValue2,
WriteIndex,
ReadIndex ));
halAccessEnable( ChannelManager->HalHandle );
ChannelManager->ToPeerMailboxControl->WriteIndex =
halAccess32 ( ChannelManager->HalHandle, WriteIndex );
ChannelManager->ToPeerMailboxControl->Command =
halAccess32( ChannelManager->HalHandle, constChannelMailboxReady );
halAccessDisable( ChannelManager->HalHandle );
vintrGenerateInterrupt ( ChannelManager->VIntrHandle );
/* LEAVE CRITICAL SECTION */
critsectLeave ( ChannelManager->CriticalSectionHandle, &NestedContext );
return statusSuccess;
chnlSendExit1:
return StatusCode;
}
void chnlVIntrHandler (
Pointer Context )
{
/* MailSlot is in Switched Endian Format */
ChannelPacket Mailslot;
UInt8 Packet[constTMManPacketSize];
ChannelPacket* MailslotPointer;
UInt32 IdxPacket;
UInt32 ReadIndex, WriteIndex, Command;
ChannelManagerObject* ChannelManager =
(ChannelManagerObject*)Context;
ChannelObject* Channel;
UInt32 NestedContext;
/*DPF(13,( "CH{"));
DPF(13,("tmman:chnlVIntrHandler:List1[%x]\n",
ChannelManager->List.Objects[1] ));
*/
for ( IdxPacket = 0 ; ; IdxPacket++ )
{
/* ENTER CRITICAL SECTION */
critsectEnter ( ChannelManager->CriticalSectionHandle, &NestedContext );
halAccessEnable(ChannelManager->HalHandle);
ReadIndex = halAccess32( ChannelManager->HalHandle,
ChannelManager->ToSelfMailboxControl->ReadIndex );
WriteIndex = halAccess32( ChannelManager->HalHandle,
ChannelManager->ToSelfMailboxControl->WriteIndex );
halAccessDisable(ChannelManager->HalHandle);
if ( ReadIndex == WriteIndex )
{
critsectLeave ( ChannelManager->CriticalSectionHandle, &NestedContext );
break;
}
/* get the pointer to the mailslot data structure from the shared mailbox */
MailslotPointer = (ChannelPacket*)( ((UInt8*)ChannelManager->ToSelfMailbox) +
(ReadIndex * ChannelManager->MailslotSize) );
halAccessEnable(ChannelManager->HalHandle);
Mailslot.ChannelID =
halAccess32( ChannelManager->HalHandle, MailslotPointer->ChannelID );
Mailslot.Sequence =
halAccess32( ChannelManager->HalHandle, MailslotPointer->Sequence );
halAccessDisable(ChannelManager->HalHandle);
/* the user should take care of endianness of packet data */
halAccessEnable(ChannelManager->HalHandle);
memCopy (
(Pointer)&Packet,
(Pointer)(MailslotPointer + 1),
ChannelManager->PacketSize );
halAccessDisable(ChannelManager->HalHandle);
DPF(13,("channel:Recv:Packet:ID[%x]:SQ[%x]:DT[%x]:WR[%x]:RD[%x]\n",
Mailslot.ChannelID,
Mailslot.Sequence,
*(UInt32*)(Packet),
WriteIndex,
ReadIndex ));
ReadIndex = ( ReadIndex + 1 ) % ( ChannelManager->MailboxCount );
halAccessEnable(ChannelManager->HalHandle);
ChannelManager->ToSelfMailboxControl->ReadIndex =
halAccess32( ChannelManager->HalHandle, ReadIndex );
halAccessDisable(ChannelManager->HalHandle);
/* LEAVE CRITICAL SECTION */
critsectLeave ( ChannelManager->CriticalSectionHandle, &NestedContext );
Channel = (ChannelObject* )objectlistGetObject (
&ChannelManager->List,
Mailslot.ChannelID );
if ( ! Channel )
{
DPF(0,("tmman:chnlVIntrHandler:Invalid Channel[%x]:FAIL\n",
Mailslot.ChannelID ));
/*
for ( Idx = 0 ; Idx < ChannelManager->List.Count ; Idx ++ )
{
DPF(0,("tmman:chnlVIntrHandler:ChannelList#[%x]:[%x]:FAIL\n",
Idx, ChannelManager->List.Objects[Idx] ));
}
while(1);
*/
/*
we have received a packet for a channel that has not
yet been opened
*/
continue;
}
Channel->Handler (
Mailslot.ChannelID,
(Pointer)&Packet,
Channel->Context );
}
/* ENTER CRITICAL SECION */
critsectEnter ( ChannelManager->CriticalSectionHandle, &NestedContext );
halAccessEnable(ChannelManager->HalHandle);
Command = halAccess32( ChannelManager->HalHandle,
ChannelManager->ToSelfMailboxControl->Command );
halAccessDisable(ChannelManager->HalHandle);
switch ( Command )
{
case constChannelHandlerReady :
halAccessEnable(ChannelManager->HalHandle);
ReadIndex = halAccess32 ( ChannelManager->HalHandle,
ChannelManager->ToPeerMailboxControl->ReadIndex );
WriteIndex = halAccess32 ( ChannelManager->HalHandle,
ChannelManager->ToPeerMailboxControl->WriteIndex );
halAccessDisable(ChannelManager->HalHandle);
if ( ReadIndex != WriteIndex )
{
halAccessEnable(ChannelManager->HalHandle);
ChannelManager->ToPeerMailboxControl->Command =
halAccess32 ( ChannelManager->HalHandle,
constChannelMailboxReady );
halAccessDisable(ChannelManager->HalHandle);
vintrGenerateInterrupt ( ChannelManager->VIntrHandle );
}
break;
case constChannelMailboxReady :
halAccessEnable(ChannelManager->HalHandle);
if ( ReadIndex == WriteIndex )
{
ChannelManager->ToPeerMailboxControl->Command =
halAccess32 ( ChannelManager->HalHandle,
constChannelHandlerReady );
}
else
{
ChannelManager->ToPeerMailboxControl->Command =
halAccess32 ( ChannelManager->HalHandle,
constChannelMailboxReady );
}
halAccessDisable(ChannelManager->HalHandle);
vintrGenerateInterrupt ( ChannelManager->VIntrHandle );
break;
default :
break;
}
/* LEAVE CRITICAL SECITON */
critsectLeave ( ChannelManager->CriticalSectionHandle, &NestedContext );
/* DPF(13,("}CH")); */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -