/// \file
/// \brief Tests multiple readers and writers on the same instance of RakPeer. Define _RAKNET_THREADSAFE in RakNetDefines.h before running this.
///
/// This file is part of RakNet Copyright 2003 Kevin Jenkins.
///
/// Usage of RakNet is subject to the appropriate license agreement.
/// Creative Commons Licensees are subject to the
/// license found at
/// http://creativecommons.org/licenses/by-nc/2.5/
/// Single application licensees are subject to the license found at
/// http://www.rakkarsoft.com/SingleApplicationLicense.html
/// Custom license users are subject to the terms therein.
/// GPL license users are subject to the GNU General Public
/// License as published by the Free
/// Software Foundation; either version 2 of the License, or (at your
/// option) any later version.
#include "RakPeerInterface.h"
#include "RakNetworkFactory.h"
#include "GetTime.h"
#include "RakNetStatistics.h"
#include "PacketEnumerations.h"
#include <conio.h>
#include <stdio.h> // Printf
#include <windows.h> // Sleep
#include <process.h>
RakPeerInterface *peer1, *peer2;
bool endThreads;
unsigned __stdcall ProducerThread( LPVOID arguments )
{
char i = *((char *) arguments);
char out[2];
out[0]=ID_USER_PACKET_ENUM;
out[1]=i;
while (endThreads==false)
{
// printf("Thread %i writing...\n", i);
if (i&1)
peer1->Send(out, 2, HIGH_PRIORITY, RELIABLE_ORDERED, 0, UNASSIGNED_PLAYER_ID, true);
else
peer2->Send(out, 2, HIGH_PRIORITY, RELIABLE_ORDERED, 0, UNASSIGNED_PLAYER_ID, true);
// printf("Thread %i done writing\n", i);
Sleep(0);
}
return 1;
}
unsigned __stdcall ConsumerThread( LPVOID arguments )
{
char i = *((char *) arguments);
Packet *p;
while (endThreads==false)
{
// printf("Thread %i reading...\n", i);
if (i&1)
p=peer1->Receive();
else
p=peer2->Receive();
// printf("Thread %i done reading...\n", i);
if (p)
{
if (p->data[0]==ID_USER_PACKET_ENUM)
printf("Got data from thread %i\n", p->data[1]);
peer1->DeallocatePacket(p);
}
Sleep(0);
}
return 1;
}
void main(void)
{
peer1=RakNetworkFactory::GetRakPeerInterface();
peer2=RakNetworkFactory::GetRakPeerInterface();
peer1->SetMaximumIncomingConnections(1);
peer2->SetMaximumIncomingConnections(1);
peer1->Initialize(1,1234,0,0);
peer2->Initialize(1,1235,0,0);
peer1->Connect("127.0.0.1", 1235, 0, 0);
peer2->Connect("127.0.0.1", 1234, 0, 0);
Sleep(500);
printf("Tests multiple threads sharing the same instance of RakPeer\n");
printf("Difficulty: Beginner\n\n");
printf("Don't forget to define _RAKNET_THREADSAFE in RakNetDefines.h for this test!\n");
endThreads=false;
unsigned threadId;
unsigned i;
char count[20];
printf("Starting threads\n");
for (i=0; i< 10; i++)
{
count[i]=i;
_beginthreadex( NULL, 0, ProducerThread, count+i, 0, &threadId );
}
for (; i < 20; i++)
{
count[i]=i;
_beginthreadex( NULL, 0, ConsumerThread, count+i, 0, &threadId );
}
printf("Running test\n");
RakNetTime endTime = 60 * 1000 + RakNet::GetTime();
while (RakNet::GetTime() < endTime)
{
Sleep(0);
}
endThreads=true;
printf("Test done!\n");
RakNetworkFactory::DestroyRakPeerInterface(peer1);
RakNetworkFactory::DestroyRakPeerInterface(peer2);
}
syntax highlighted by Code2HTML, v. 0.9.1