TestAtomicMessages.c from redshed at Krugle
Show TestAtomicMessages.c syntax highlighted
/****************************************************************************************
TestAtomicMessages.c $Revision: 18 $
<http://rentzsch.com/atomicMessages>
Copyright © 1999-2002 Red Shed Software. All rights reserved.
by Jonathan 'Wolf' Rentzsch (jon at redshed dot net)
************************************************************************************/
#include "require.h"
#include "Align.h"
#include "AtomicMessages.h"
AtomicMessageElement*
OddFilter(
AtomicMessageElement *element,
AtomicMessageQueue *queue );
void
main()
{
DeclareAlignedVariable( AtomicMessageQueue, queue, kAtomicAlignment );
AtomicMessage message = 0xDEADBEEF;
long i, data1 = 0xDEADBEEF, data2 = 0xDEADBEEF, data3 = 0xDEADBEEF;
OSErr err;
InitializeAtomicMessageQueue( queue );
for( i = 1; i <= 10; ++i ) {
err = NewAtomicMessage( queue, i, i, i, i );
RequireNoErr( err );
}
// 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
message = PeekAtomicMessage( queue, nil, kNoAtomicMessage, nil, nil, nil );
RequireEqual( message, 1 );
message = 0xDEADBEEF;
// 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
message = PeekAtomicMessage( queue, nil, kNoAtomicMessage, &data1, nil, nil );
RequireEqual( message, 1 );
RequireEqual( data1, 1 );
message = 0xDEADBEEF;
data1 = 0xDEADBEEF;
// 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
message = PeekAtomicMessage( queue, nil, kNoAtomicMessage, nil, &data2, nil );
RequireEqual( message, 1 );
RequireEqual( data2, 1 );
message = 0xDEADBEEF;
data2 = 0xDEADBEEF;
// 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
message = PeekAtomicMessage( queue, nil, kNoAtomicMessage, nil, nil, &data3 );
RequireEqual( message, 1 );
RequireEqual( data3, 1 );
message = 0xDEADBEEF;
data3 = 0xDEADBEEF;
// 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
message = PeekAtomicMessage( queue, nil, kNoAtomicMessage, &data1, &data2, &data3 );
RequireEqual( message, 1 );
RequireEqual( data1, 1 );
RequireEqual( data2, 1 );
RequireEqual( data3, 1 );
message = 0xDEADBEEF;
data1 = 0xDEADBEEF;
data2 = 0xDEADBEEF;
data3 = 0xDEADBEEF;
// 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
message = ReceiveAtomicMessage( queue, nil, kNoAtomicMessage, &data1, &data2, &data3 );
RequireEqual( message, 1 );
RequireEqual( data1, 1 );
RequireEqual( data2, 1 );
RequireEqual( data3, 1 );
message = 0xDEADBEEF;
data1 = 0xDEADBEEF;
data2 = 0xDEADBEEF;
data3 = 0xDEADBEEF;
// 2, 3, 4, 5, 6, 7, 8, 9, 10
message = PeekAtomicMessage( queue, nil, kNoAtomicMessage, &data1, &data2, &data3 );
RequireEqual( message, 2 );
RequireEqual( data1, 2 );
RequireEqual( data2, 2 );
RequireEqual( data3, 2 );
message = 0xDEADBEEF;
data1 = 0xDEADBEEF;
data2 = 0xDEADBEEF;
data3 = 0xDEADBEEF;
// 2, 3, 4, 5, 6, 7, 8, 9, 10
message = ReceiveAtomicMessage( queue, nil, 3, &data1, &data2, &data3 );
RequireEqual( message, 3 );
RequireEqual( data1, 3 );
RequireEqual( data2, 3 );
RequireEqual( data3, 3 );
message = 0xDEADBEEF;
data1 = 0xDEADBEEF;
data2 = 0xDEADBEEF;
data3 = 0xDEADBEEF;
// 2, 4, 5, 6, 7, 8, 9, 10
message = ReceiveAtomicMessage( queue, nil, 3, &data1, &data2, &data3 );
RequireEqual( message, kNoAtomicMessage );
RequireEqual( data1, 0xDEADBEEF );
RequireEqual( data2, 0xDEADBEEF );
RequireEqual( data3, 0xDEADBEEF );
message = 0xDEADBEEF;
// 2, 4, 5, 6, 7, 8, 9, 10
message = PeekAtomicMessage( queue, OddFilter, 0, &data1, &data2, &data3 );
RequireEqual( message, 5 );
RequireEqual( data1, 5 );
RequireEqual( data2, 5 );
RequireEqual( data3, 5 );
message = 0xDEADBEEF;
data1 = 0xDEADBEEF;
data2 = 0xDEADBEEF;
data3 = 0xDEADBEEF;
// 2, 4, 5, 6, 7, 8, 9, 10
message = ReceiveAtomicMessage( queue, OddFilter, 0, &data1, &data2, &data3 );
RequireEqual( message, 5 );
RequireEqual( data1, 5 );
RequireEqual( data2, 5 );
RequireEqual( data3, 5 );
message = 0xDEADBEEF;
data1 = 0xDEADBEEF;
data2 = 0xDEADBEEF;
data3 = 0xDEADBEEF;
// 2, 4, 6, 7, 8, 9, 10
message = ReceiveAtomicMessage( queue, OddFilter, 0, &data1, &data2, &data3 );
RequireEqual( message, 7 );
RequireEqual( data1, 7 );
RequireEqual( data2, 7 );
RequireEqual( data3, 7 );
message = 0xDEADBEEF;
data1 = 0xDEADBEEF;
data2 = 0xDEADBEEF;
data3 = 0xDEADBEEF;
// 2, 4, 6, 8, 9, 10
message = ReceiveAtomicMessage( queue, OddFilter, 0, &data1, &data2, &data3 );
RequireEqual( message, 9 );
RequireEqual( data1, 9 );
RequireEqual( data2, 9 );
RequireEqual( data3, 9 );
message = 0xDEADBEEF;
data1 = 0xDEADBEEF;
data2 = 0xDEADBEEF;
data3 = 0xDEADBEEF;
// 2, 4, 6, 8, 10
message = ReceiveAtomicMessage( queue, OddFilter, 0, &data1, &data2, &data3 );
RequireEqual( message, kNoAtomicMessage );
RequireEqual( data1, 0xDEADBEEF );
RequireEqual( data2, 0xDEADBEEF );
RequireEqual( data3, 0xDEADBEEF );
message = 0xDEADBEEF;
// 2, 4, 6, 8, 10
message = ReceiveAtomicMessage( queue, nil, 10, &data1, &data2, &data3 );
RequireEqual( message, 10 );
RequireEqual( data1, 10 );
RequireEqual( data2, 10 );
RequireEqual( data3, 10 );
message = 0xDEADBEEF;
data1 = 0xDEADBEEF;
data2 = 0xDEADBEEF;
data3 = 0xDEADBEEF;
// 2, 4, 6, 8
message = ReceiveAtomicMessage( queue, nil, 6, &data1, &data2, &data3 );
RequireEqual( message, 6 );
RequireEqual( data1, 6 );
RequireEqual( data2, 6 );
RequireEqual( data3, 6 );
message = 0xDEADBEEF;
data1 = 0xDEADBEEF;
data2 = 0xDEADBEEF;
data3 = 0xDEADBEEF;
// 2, 4, 8
message = ReceiveAtomicMessage( queue, nil, kNoAtomicMessage, &data1, &data2, &data3 );
RequireEqual( message, 2 );
RequireEqual( data1, 2 );
RequireEqual( data2, 2 );
RequireEqual( data3, 2 );
message = 0xDEADBEEF;
data1 = 0xDEADBEEF;
data2 = 0xDEADBEEF;
data3 = 0xDEADBEEF;
// 4, 8
message = ReceiveAtomicMessage( queue, nil, kNoAtomicMessage, &data1, &data2, &data3 );
RequireEqual( message, 4 );
RequireEqual( data1, 4 );
RequireEqual( data2, 4 );
RequireEqual( data3, 4 );
message = 0xDEADBEEF;
data1 = 0xDEADBEEF;
data2 = 0xDEADBEEF;
data3 = 0xDEADBEEF;
// 8
message = ReceiveAtomicMessage( queue, nil, kNoAtomicMessage, &data1, &data2, &data3 );
RequireEqual( message, 8 );
RequireEqual( data1, 8 );
RequireEqual( data2, 8 );
RequireEqual( data3, 8 );
message = 0xDEADBEEF;
data1 = 0xDEADBEEF;
data2 = 0xDEADBEEF;
data3 = 0xDEADBEEF;
// (empty)
message = ReceiveAtomicMessage( queue, nil, kNoAtomicMessage, &data1, &data2, &data3 );
RequireEqual( message, kNoAtomicMessage );
RequireEqual( data1, 0xDEADBEEF );
RequireEqual( data2, 0xDEADBEEF );
RequireEqual( data3, 0xDEADBEEF );
message = 0xDEADBEEF;
// (empty)
}
AtomicMessageElement*
OddFilter(
AtomicMessageElement *element,
AtomicMessageQueue *queue )
{
RequirePtrAlign( element, kAtomicAlignment );
RequirePtrAlign( queue, kAtomicAlignment );
if( element->message % 2 != 0 )
return( kFilterFoundAtomicMessage );
else
return( kFilterNextAtomicMessage );
}
See more files for this project here