14 TASSERT( a_iMaxItems > 0,
"Max items is less than zero" );
15 TASSERT( a_iItemSize > 0,
"Item size is less than zero" );
17 m_iItemSize = a_iItemSize;
18 m_iMaxItems = a_iMaxItems;
19 m_pDataPopCursor = a_pBuffer;
20 m_pDataPushCursor = a_pBuffer;
21 m_pDataBegin = a_pBuffer;
22 m_pDataEnd = a_pBuffer + ( a_iMaxItems * a_iItemSize );
25 bResult = m_Semaphore1.Create( m_iMaxItems, m_iMaxItems );
26 TASSERT( bResult !=
TFALSE,
"Unable to create semaphore for TGenericFifo" );
27 bResult = m_Semaphore2.Create( 0, m_iMaxItems );
28 TASSERT( bResult !=
TFALSE,
"Unable to create semaphore for TGenericFifo" );
30 InitializeCriticalSection( &m_CriticalSection );
45 if ( !bResult )
return TFALSE;
47 EnterCriticalSection( &m_CriticalSection );
50 Toshi::TUtil::MemCopy( m_pDataPushCursor, a_pItem, m_iItemSize );
51 m_pDataPushCursor += m_iItemSize;
53 if ( m_pDataPushCursor == m_pDataEnd )
56 m_pDataPushCursor = m_pDataBegin;
59 LeaveCriticalSection( &m_CriticalSection );
61 bResult = m_Semaphore2.Signal();
62 TASSERT( bResult !=
TFALSE,
"TSemaphore::Signal returned TFALSE" );
70 if ( !bResult )
return TFALSE;
72 EnterCriticalSection( &m_CriticalSection );
76 m_pDataPopCursor += m_iItemSize;
78 if ( m_pDataPopCursor == m_pDataEnd )
81 m_pDataPopCursor = m_pDataBegin;
84 LeaveCriticalSection( &m_CriticalSection );
86 bResult = m_Semaphore1.Signal();
87 TASSERT( bResult !=
TFALSE,
"TSemaphore::Signal returned TFALSE" );