Classes | Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes

ReadyEvent Class Reference
[ReadyEvent]

Peer to peer synchronized ready and unready events. More...

#include <ReadyEvent.h>

Inherits PluginInterface2.

Collaboration diagram for ReadyEvent:
Collaboration graph
[legend]

List of all members.

Classes

struct  ReadyEventNode
struct  RemoteSystem

Public Member Functions

 ReadyEvent ()
virtual ~ReadyEvent ()
bool SetEvent (int eventId, bool isReady)
bool ForceCompletion (int eventId)
bool DeleteEvent (int eventId)
bool IsEventSet (int eventId)
bool IsEventCompletionProcessing (int eventId) const
bool IsEventCompleted (int eventId) const
bool HasEvent (int eventId)
unsigned GetEventListSize (void) const
int GetEventAtIndex (unsigned index) const
bool AddToWaitList (int eventId, SystemAddress address)
bool RemoveFromWaitList (int eventId, SystemAddress address)
bool IsInWaitList (int eventId, SystemAddress address)
unsigned GetRemoteWaitListSize (int eventId) const
SystemAddress GetFromWaitListAtIndex (int eventId, unsigned index) const
ReadyEventSystemStatus GetReadyStatus (int eventId, SystemAddress address)
void SetSendChannel (unsigned char newChannel)

Static Public Member Functions

static int RemoteSystemCompBySystemAddress (const SystemAddress &key, const RemoteSystem &data)
static int ReadyEventNodeComp (const int &key, ReadyEvent::ReadyEventNode *const &data)

Protected Member Functions

virtual PluginReceiveResult OnReceive (Packet *packet)
virtual void OnClosedConnection (SystemAddress systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason)
virtual void OnRakPeerShutdown (void)
 Called when RakPeer is shutdown.
void Clear (void)
void SendReadyStateQuery (unsigned eventId, SystemAddress address)
void SendReadyUpdate (unsigned eventIndex, unsigned systemIndex, bool forceIfNotDefault)
void BroadcastReadyUpdate (unsigned eventIndex, bool forceIfNotDefault)
void RemoveFromAllLists (SystemAddress address)
void OnReadyEventQuery (Packet *packet)
void PushCompletionPacket (unsigned eventId)
bool AddToWaitListInternal (unsigned eventIndex, SystemAddress address)
void OnReadyEventForceAllSet (Packet *packet)
void OnReadyEventPacketUpdate (Packet *packet)
void UpdateReadyStatus (unsigned eventIndex)
bool IsEventCompletedByIndex (unsigned eventIndex) const
unsigned CreateNewEvent (int eventId, bool isReady)
bool SetEventByIndex (int eventIndex, bool isReady)

Protected Attributes

DataStructures::OrderedList
< int, ReadyEventNode
*, ReadyEvent::ReadyEventNodeComp > 
readyEventNodeList
unsigned char channel

Detailed Description

Peer to peer synchronized ready and unready events.

For peer to peer networks in a fully connected mesh.
Solves the problem of how to tell if all peers, relative to all other peers, are in a certain ready state.
For example, if A is connected to B and C, A may see that B and C are ready, but does not know if B is ready to C, or vice-versa.
This plugin uses two stages to solve that problem, first, everyone I know about is ready. Second, everyone I know about is ready to everyone they know about.
The user will get ID_READY_EVENT_SET and ID_READY_EVENT_UNSET as the signal flag is set or unset
The user will get ID_READY_EVENT_ALL_SET when all systems are done waiting for all other systems, in which case the event is considered complete, and no longer tracked.

See also:
FullyConnectedMesh2

Definition at line 52 of file ReadyEvent.h.


Constructor & Destructor Documentation

ReadyEvent::ReadyEvent (  ) 

Definition at line 35 of file ReadyEvent.cpp.

ReadyEvent::~ReadyEvent (  )  [virtual]

Definition at line 40 of file ReadyEvent.cpp.

Here is the call graph for this function:


Member Function Documentation

bool ReadyEvent::AddToWaitList ( int  eventId,
SystemAddress  address 
)

Adds a system to wait for to signal an event before considering the event complete and returning ID_READY_EVENT_ALL_SET. As we add systems, if this event was previously set to true with SetEvent, these systems will get ID_READY_EVENT_SET. As these systems disconnect (directly or indirectly through the router) they are removed.

Note:
If the event completion process has already started, you cannot add more systems, as this would cause the completion process to fail
Parameters:
[in] eventId A user-defined number previously passed to SetEvent that has not yet completed
[in] addressArray An address to wait for event replies from. Pass UNASSIGNED_SYSTEM_ADDRESS for all currently connected systems. Until all systems in this list have called SetEvent with this ID and true, and have this system in the list, we won't get ID_READY_EVENT_COMPLETE
Returns:
True on success, false on unknown eventId (this should be considered an error), or if the completion process has already started.

Definition at line 148 of file ReadyEvent.cpp.

Here is the call graph for this function:

bool ReadyEvent::AddToWaitListInternal ( unsigned  eventIndex,
SystemAddress  address 
) [protected]

Definition at line 296 of file ReadyEvent.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

void ReadyEvent::BroadcastReadyUpdate ( unsigned  eventIndex,
bool  forceIfNotDefault 
) [protected]

Definition at line 508 of file ReadyEvent.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

void ReadyEvent::Clear ( void   )  [protected]

Definition at line 431 of file ReadyEvent.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

unsigned ReadyEvent::CreateNewEvent ( int  eventId,
bool  isReady 
) [protected]

Definition at line 441 of file ReadyEvent.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

bool ReadyEvent::DeleteEvent ( int  eventId  ) 

Deletes an event. We will no longer wait for this event, and any systems that we know have set the event will be forgotten. Call this to clear memory when events are completed and you know you will never need them again.

Parameters:
[in] eventId A user-defined identifier
Returns:
True on success. False (failure) on unknown eventId

Definition at line 78 of file ReadyEvent.cpp.

Here is the call graph for this function:

bool ReadyEvent::ForceCompletion ( int  eventId  ) 

When systems can call SetEvent() with isReady==false, it is possible for one system to return true from IsEventCompleted() while the other systems return false This can occur if a system SetEvent() with isReady==false while the completion message is still being transmitted. If your game has the situation where some action should be taken on all systems when IsEventCompleted() is true for any system, then call ForceCompletion() when the action begins. This will force all systems to return true from IsEventCompleted().

Parameters:
[in] eventId A user-defined identifier to immediately set as completed

Definition at line 61 of file ReadyEvent.cpp.

Here is the call graph for this function:

int ReadyEvent::GetEventAtIndex ( unsigned  index  )  const

Returns the event ID stored at a particular index. EventIDs are stored sorted from least to greatest.

Parameters:
[in] index Index into the array, from 0 to GetEventListSize()
Returns:
The event ID stored at a particular index

Definition at line 143 of file ReadyEvent.cpp.

unsigned ReadyEvent::GetEventListSize ( void   )  const

Returns the total number of events stored in the system.

Returns:
The total number of events stored in the system.

Definition at line 138 of file ReadyEvent.cpp.

Here is the call graph for this function:

SystemAddress ReadyEvent::GetFromWaitListAtIndex ( int  eventId,
unsigned  index 
) const

Returns the system address of a system at a particular index, for this event.

Parameters:
[in] eventId A user-defined identifier
[in] index Index into the array, from 0 to GetWaitListSize()
Returns:
The system address of a system at a particular index, for this event.

Definition at line 236 of file ReadyEvent.cpp.

Here is the call graph for this function:

ReadyEventSystemStatus ReadyEvent::GetReadyStatus ( int  eventId,
SystemAddress  address 
)

For a remote system, find out what their ready status is (waiting, signaled, complete).

Parameters:
[in] eventId A user-defined identifier
[in] address Which system we are checking up on
Returns:
The status of this system, for this particular event.
See also:
ReadyEventSystemStatus

Definition at line 246 of file ReadyEvent.cpp.

Here is the call graph for this function:

unsigned ReadyEvent::GetRemoteWaitListSize ( int  eventId  )  const

Returns the total number of systems we are waiting on for this event. Does not include yourself

Parameters:
[in] eventId A user-defined identifier
Returns:
The total number of systems we are waiting on for this event.

Definition at line 225 of file ReadyEvent.cpp.

Here is the call graph for this function:

bool ReadyEvent::HasEvent ( int  eventId  ) 

Returns if this is a known event. Events may be known even if we never ourselves referenced them with SetEvent, because other systems created them via ID_READY_EVENT_SET.

Parameters:
[in] eventId A user-defined identifier
Returns:
true if we have this event, false otherwise

Definition at line 133 of file ReadyEvent.cpp.

Here is the call graph for this function:

bool ReadyEvent::IsEventCompleted ( int  eventId  )  const

Returns if the wait list is a subset of the completion list. Call this after all systems you want to wait for have been added with AddToWaitList If you are waiting for a specific number of systems (such as players later connecting), also check GetRemoteWaitListSize(eventId) to be equal to 1 less than the total number of participants.

Parameters:
[in] eventId A user-defined identifier
Returns:
True on completion. False (failure) on unknown eventId, or the set is not completed.

Definition at line 122 of file ReadyEvent.cpp.

Here is the call graph for this function:

bool ReadyEvent::IsEventCompletedByIndex ( unsigned  eventIndex  )  const [protected]

Definition at line 417 of file ReadyEvent.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

bool ReadyEvent::IsEventCompletionProcessing ( int  eventId  )  const

Returns if the event is about to be ready and we are negotiating the final packets. This will usually only be true for a very short time, after which IsEventCompleted should return true. While this is true you cannot add to the wait list, or SetEvent() isReady to false anymore.

Parameters:
[in] eventId A user-defined identifier
Returns:
True if any other system has completed processing. Will always be true if IsEventCompleted() is true

Definition at line 100 of file ReadyEvent.cpp.

Here is the call graph for this function:

bool ReadyEvent::IsEventSet ( int  eventId  ) 

Returns what was passed to SetEvent()

Returns:
The value of isReady passed to SetEvent(). Also returns false on unknown event.

Definition at line 90 of file ReadyEvent.cpp.

Here is the call graph for this function:

bool ReadyEvent::IsInWaitList ( int  eventId,
SystemAddress  address 
)

Returns if a particular system is waiting on a particular event.

Parameters:
[in] eventId A user-defined identifier
[in] The address of the system we are checking up on
Returns:
True if this system is waiting on this event, false otherwise.

Definition at line 214 of file ReadyEvent.cpp.

Here is the call graph for this function:

void ReadyEvent::OnClosedConnection ( SystemAddress  systemAddress,
RakNetGUID  rakNetGUID,
PI2_LostConnectionReason  lostConnectionReason 
) [protected, virtual]

Called when a connection is dropped because the user called RakPeer::CloseConnection() for a particular system

Parameters:
[in] systemAddress The system whose connection was closed
[in] rakNetGuid The guid of the specified system
[in] lostConnectionReason How the connection was closed: manually, connection lost, or notification of disconnection

Reimplemented from PluginInterface2.

Definition at line 378 of file ReadyEvent.cpp.

Here is the call graph for this function:

void ReadyEvent::OnRakPeerShutdown ( void   )  [protected, virtual]

Called when RakPeer is shutdown.

Reimplemented from PluginInterface2.

Definition at line 386 of file ReadyEvent.cpp.

Here is the call graph for this function:

void ReadyEvent::OnReadyEventForceAllSet ( Packet packet  )  [protected]

Definition at line 314 of file ReadyEvent.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

void ReadyEvent::OnReadyEventPacketUpdate ( Packet packet  )  [protected]

Definition at line 332 of file ReadyEvent.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

void ReadyEvent::OnReadyEventQuery ( Packet packet  )  [protected]

Definition at line 362 of file ReadyEvent.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

PluginReceiveResult ReadyEvent::OnReceive ( Packet packet  )  [protected, virtual]

OnReceive is called for every packet.

Parameters:
[in] packet the packet that is being returned to the user
Returns:
True to allow the game and other plugins to get this message, false to absorb it

Reimplemented from PluginInterface2.

Definition at line 270 of file ReadyEvent.cpp.

Here is the call graph for this function:

void ReadyEvent::PushCompletionPacket ( unsigned  eventId  )  [protected]

Definition at line 543 of file ReadyEvent.cpp.

Here is the caller graph for this function:

int ReadyEvent::ReadyEventNodeComp ( const int &  key,
ReadyEvent::ReadyEventNode *const &  data 
) [static]

Definition at line 24 of file ReadyEvent.cpp.

int ReadyEvent::RemoteSystemCompBySystemAddress ( const SystemAddress key,
const RemoteSystem data 
) [static]

Definition at line 14 of file ReadyEvent.cpp.

void ReadyEvent::RemoveFromAllLists ( SystemAddress  address  )  [protected]

Definition at line 524 of file ReadyEvent.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

bool ReadyEvent::RemoveFromWaitList ( int  eventId,
SystemAddress  address 
)

Removes systems from the wait list, which should have been previously added with AddToWaitList

Note:
Systems that directly or indirectly disconnect from us are automatically removed from the wait list
Parameters:
[in] address The system to remove from the wait list. Pass UNASSIGNED_SYSTEM_ADDRESS for all currently connected systems.
Returns:
True on success, false on unknown eventId (this should be considered an error)

Definition at line 181 of file ReadyEvent.cpp.

Here is the call graph for this function:

void ReadyEvent::SendReadyStateQuery ( unsigned  eventId,
SystemAddress  address 
) [protected]

Definition at line 517 of file ReadyEvent.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

void ReadyEvent::SendReadyUpdate ( unsigned  eventIndex,
unsigned  systemIndex,
bool  forceIfNotDefault 
) [protected]

Definition at line 492 of file ReadyEvent.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

bool ReadyEvent::SetEvent ( int  eventId,
bool  isReady 
)

Sets or updates the initial ready state for our local system. If eventId is an unknown event the event is created. If eventId was previously used and you want to reuse it, call DeleteEvent first, or else you will keep the same event signals from before Systems previously or later added through AddToWaitList() with the same eventId when isReady=true will get ID_READY_EVENT_SET Systems previously added through AddToWaitList with the same eventId will get ID_READY_EVENT_UNSET For both ID_READY_EVENT_SET and ID_READY_EVENT_UNSET, eventId is encoded in bytes 1 through 1+sizeof(int)

Parameters:
[in] eventId A user-defined identifier to wait on. This can be a sequence counter, an event identifier, or anything else you want.
[in] isReady True to signal we are ready to proceed with this event, false to unsignal
Returns:
True on success. False (failure) on unknown eventId

Definition at line 46 of file ReadyEvent.cpp.

Here is the call graph for this function:

bool ReadyEvent::SetEventByIndex ( int  eventIndex,
bool  isReady 
) [protected]

Definition at line 391 of file ReadyEvent.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:

void ReadyEvent::SetSendChannel ( unsigned char  newChannel  ) 

This channel will be used for all RakPeer::Send calls

Parameters:
[in] newChannel The channel to use for internal RakPeer::Send calls from this system. Defaults to 0.

Definition at line 266 of file ReadyEvent.cpp.

void ReadyEvent::UpdateReadyStatus ( unsigned  eventIndex  )  [protected]

Definition at line 451 of file ReadyEvent.cpp.

Here is the call graph for this function:

Here is the caller graph for this function:


Member Data Documentation

unsigned char ReadyEvent::channel [protected]

Definition at line 221 of file ReadyEvent.h.

DataStructures::OrderedList<int, ReadyEventNode*, ReadyEvent::ReadyEventNodeComp> ReadyEvent::readyEventNodeList [protected]

Definition at line 220 of file ReadyEvent.h.


The documentation for this class was generated from the following files: