[Orxonox-commit 2792] r7495 - in code/trunk/src: libraries/network libraries/network/packet orxonox/worldentities
scheusso at orxonox.net
scheusso at orxonox.net
Tue Sep 28 21:48:32 CEST 2010
Author: scheusso
Date: 2010-09-28 21:48:32 +0200 (Tue, 28 Sep 2010)
New Revision: 7495
Modified:
code/trunk/src/libraries/network/Client.cc
code/trunk/src/libraries/network/FunctionCall.cc
code/trunk/src/libraries/network/FunctionCall.h
code/trunk/src/libraries/network/FunctionCallManager.cc
code/trunk/src/libraries/network/FunctionCallManager.h
code/trunk/src/libraries/network/NetworkFunction.h
code/trunk/src/libraries/network/packet/FunctionCalls.cc
code/trunk/src/orxonox/worldentities/ControllableEntity.cc
Log:
buffering incoming function calls for non-existing objects works now
Modified: code/trunk/src/libraries/network/Client.cc
===================================================================
--- code/trunk/src/libraries/network/Client.cc 2010-09-28 15:31:59 UTC (rev 7494)
+++ code/trunk/src/libraries/network/Client.cc 2010-09-28 19:48:32 UTC (rev 7495)
@@ -174,6 +174,7 @@
Connection::processQueue();
if(gamestate->processGamestates())
{
+ FunctionCallManager::processBufferedFunctionCalls();
if(!isSynched_)
isSynched_=true;
}
Modified: code/trunk/src/libraries/network/FunctionCall.cc
===================================================================
--- code/trunk/src/libraries/network/FunctionCall.cc 2010-09-28 15:31:59 UTC (rev 7494)
+++ code/trunk/src/libraries/network/FunctionCall.cc 2010-09-28 19:48:32 UTC (rev 7495)
@@ -79,22 +79,28 @@
switch(this->nrOfArguments_)
{
case 0:
- fct->call(this->objectID_);
+ if( !fct->call(this->objectID_) )
+ return false;
break;
case 1:
- fct->call(this->objectID_, this->arguments_[0]);
+ if( !fct->call(this->objectID_, this->arguments_[0]) )
+ return false;
break;
case 2:
- fct->call(this->objectID_, this->arguments_[0], this->arguments_[1]);
+ if( !fct->call(this->objectID_, this->arguments_[0], this->arguments_[1]) )
+ return false;
break;
case 3:
- fct->call(this->objectID_, this->arguments_[0], this->arguments_[1], this->arguments_[2]);
+ if( !fct->call(this->objectID_, this->arguments_[0], this->arguments_[1], this->arguments_[2]) )
+ return false;
break;
case 4:
- fct->call(this->objectID_, this->arguments_[0], this->arguments_[1], this->arguments_[2], this->arguments_[3]);
+ if( !fct->call(this->objectID_, this->arguments_[0], this->arguments_[1], this->arguments_[2], this->arguments_[3]) )
+ return false;
break;
case 5:
- fct->call(this->objectID_, this->arguments_[0], this->arguments_[1], this->arguments_[2], this->arguments_[3], this->arguments_[4]);
+ if( !fct->call(this->objectID_, this->arguments_[0], this->arguments_[1], this->arguments_[2], this->arguments_[3], this->arguments_[4]) )
+ return false;
break;
default:
assert(0);
Modified: code/trunk/src/libraries/network/FunctionCall.h
===================================================================
--- code/trunk/src/libraries/network/FunctionCall.h 2010-09-28 15:31:59 UTC (rev 7494)
+++ code/trunk/src/libraries/network/FunctionCall.h 2010-09-28 19:48:32 UTC (rev 7495)
@@ -31,6 +31,7 @@
#include "network/NetworkPrereqs.h"
#include "util/UtilPrereqs.h"
+#include "util/MultiType.h"
#include <cassert>
#include <vector>
Modified: code/trunk/src/libraries/network/FunctionCallManager.cc
===================================================================
--- code/trunk/src/libraries/network/FunctionCallManager.cc 2010-09-28 15:31:59 UTC (rev 7494)
+++ code/trunk/src/libraries/network/FunctionCallManager.cc 2010-09-28 19:48:32 UTC (rev 7495)
@@ -28,66 +28,68 @@
#include "FunctionCallManager.h"
#include "packet/FunctionCalls.h"
+#include "core/GameMode.h"
namespace orxonox {
-std::map<uint32_t, packet::FunctionCalls*> FunctionCallManager::clientMap_;
+std::map<uint32_t, packet::FunctionCalls*> FunctionCallManager::sClientMap_;
+std::vector<FunctionCall> FunctionCallManager::sIncomingFunctionCallBuffer_;
// Static calls
void FunctionCallManager::addCallStatic(uint32_t functionID, uint32_t clientID)
{
- if(clientMap_.find(clientID)==clientMap_.end())
+ if(sClientMap_.find(clientID)==sClientMap_.end())
{
- FunctionCallManager::clientMap_[clientID] = new packet::FunctionCalls;
- FunctionCallManager::clientMap_[clientID]->setClientID(clientID);
+ FunctionCallManager::sClientMap_[clientID] = new packet::FunctionCalls;
+ FunctionCallManager::sClientMap_[clientID]->setClientID(clientID);
}
- FunctionCallManager::clientMap_[clientID]->addCallStatic(functionID);
+ FunctionCallManager::sClientMap_[clientID]->addCallStatic(functionID);
}
void FunctionCallManager::addCallStatic(uint32_t functionID, uint32_t clientID, const MultiType& mt1)
{
- if(clientMap_.find(clientID)==clientMap_.end())
+ if(sClientMap_.find(clientID)==sClientMap_.end())
{
- FunctionCallManager::clientMap_[clientID] = new packet::FunctionCalls;
- FunctionCallManager::clientMap_[clientID]->setClientID(clientID);
+ FunctionCallManager::sClientMap_[clientID] = new packet::FunctionCalls;
+ FunctionCallManager::sClientMap_[clientID]->setClientID(clientID);
}
- FunctionCallManager:: clientMap_[clientID]->addCallStatic(functionID, &mt1);
+ FunctionCallManager:: sClientMap_[clientID]->addCallStatic(functionID, &mt1);
}
void FunctionCallManager::addCallStatic(uint32_t functionID, uint32_t clientID, const MultiType& mt1, const MultiType& mt2)
{
- if(clientMap_.find(clientID)==clientMap_.end())
+ if(sClientMap_.find(clientID)==sClientMap_.end())
{
- FunctionCallManager::clientMap_[clientID] = new packet::FunctionCalls;
- FunctionCallManager::clientMap_[clientID]->setClientID(clientID);
+ FunctionCallManager::sClientMap_[clientID] = new packet::FunctionCalls;
+ FunctionCallManager::sClientMap_[clientID]->setClientID(clientID);
}
- FunctionCallManager:: clientMap_[clientID]->addCallStatic(functionID, &mt1, &mt2);
+ FunctionCallManager:: sClientMap_[clientID]->addCallStatic(functionID, &mt1, &mt2);
}
void FunctionCallManager::addCallStatic(uint32_t functionID, uint32_t clientID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3)
{
- if(clientMap_.find(clientID)==clientMap_.end())
+ if(sClientMap_.find(clientID)==sClientMap_.end())
{
- FunctionCallManager::clientMap_[clientID] = new packet::FunctionCalls;
- FunctionCallManager::clientMap_[clientID]->setClientID(clientID);
+ FunctionCallManager::sClientMap_[clientID] = new packet::FunctionCalls;
+ FunctionCallManager::sClientMap_[clientID]->setClientID(clientID);
}
- FunctionCallManager:: clientMap_[clientID]->addCallStatic(functionID, &mt1, &mt2, &mt3);
+ FunctionCallManager:: sClientMap_[clientID]->addCallStatic(functionID, &mt1, &mt2, &mt3);
}
void FunctionCallManager::addCallStatic(uint32_t functionID, uint32_t clientID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3, const MultiType& mt4)
{
- if(clientMap_.find(clientID)==clientMap_.end())
+ if(sClientMap_.find(clientID)==sClientMap_.end())
{
- FunctionCallManager::clientMap_[clientID] = new packet::FunctionCalls;
- FunctionCallManager::clientMap_[clientID]->setClientID(clientID);
+ FunctionCallManager::sClientMap_[clientID] = new packet::FunctionCalls;
+ FunctionCallManager::sClientMap_[clientID]->setClientID(clientID);
}
- FunctionCallManager:: clientMap_[clientID]->addCallStatic(functionID, &mt1, &mt2, &mt3, &mt4);
+ FunctionCallManager:: sClientMap_[clientID]->addCallStatic(functionID, &mt1, &mt2, &mt3, &mt4);
}
void FunctionCallManager::addCallStatic(uint32_t functionID, uint32_t clientID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3, const MultiType& mt4, const MultiType& mt5)
{
- if(clientMap_.find(clientID)==clientMap_.end())
+ if(sClientMap_.find(clientID)==sClientMap_.end())
{
- FunctionCallManager::clientMap_[clientID] = new packet::FunctionCalls;
- FunctionCallManager::clientMap_[clientID]->setClientID(clientID);
+ FunctionCallManager::sClientMap_[clientID] = new packet::FunctionCalls;
+ FunctionCallManager::sClientMap_[clientID]->setClientID(clientID);
}
- FunctionCallManager:: clientMap_[clientID]->addCallStatic(functionID, &mt1, &mt2, &mt3, &mt4, &mt5);
+ FunctionCallManager:: sClientMap_[clientID]->addCallStatic(functionID, &mt1, &mt2, &mt3, &mt4, &mt5);
}
@@ -95,57 +97,57 @@
void FunctionCallManager::addCallMember(uint32_t functionID, uint32_t objectID, uint32_t clientID)
{
- if(clientMap_.find(clientID)==clientMap_.end())
+ if(sClientMap_.find(clientID)==sClientMap_.end())
{
- FunctionCallManager::clientMap_[clientID] = new packet::FunctionCalls;
- FunctionCallManager::clientMap_[clientID]->setClientID(clientID);
+ FunctionCallManager::sClientMap_[clientID] = new packet::FunctionCalls;
+ FunctionCallManager::sClientMap_[clientID]->setClientID(clientID);
}
- FunctionCallManager::clientMap_[clientID]->addCallMember(functionID, objectID);
+ FunctionCallManager::sClientMap_[clientID]->addCallMember(functionID, objectID);
}
void FunctionCallManager::addCallMember(uint32_t functionID, uint32_t objectID, uint32_t clientID, const MultiType& mt1)
{
- if(clientMap_.find(clientID)==clientMap_.end())
+ if(sClientMap_.find(clientID)==sClientMap_.end())
{
- FunctionCallManager::clientMap_[clientID] = new packet::FunctionCalls;
- FunctionCallManager::clientMap_[clientID]->setClientID(clientID);
+ FunctionCallManager::sClientMap_[clientID] = new packet::FunctionCalls;
+ FunctionCallManager::sClientMap_[clientID]->setClientID(clientID);
}
- FunctionCallManager::clientMap_[clientID]->addCallMember(functionID, objectID, &mt1);
+ FunctionCallManager::sClientMap_[clientID]->addCallMember(functionID, objectID, &mt1);
}
void FunctionCallManager::addCallMember(uint32_t functionID, uint32_t objectID, uint32_t clientID, const MultiType& mt1, const MultiType& mt2)
{
- if(clientMap_.find(clientID)==clientMap_.end())
+ if(sClientMap_.find(clientID)==sClientMap_.end())
{
- FunctionCallManager::clientMap_[clientID] = new packet::FunctionCalls;
- FunctionCallManager::clientMap_[clientID]->setClientID(clientID);
+ FunctionCallManager::sClientMap_[clientID] = new packet::FunctionCalls;
+ FunctionCallManager::sClientMap_[clientID]->setClientID(clientID);
}
- FunctionCallManager::clientMap_[clientID]->addCallMember(functionID, objectID, &mt1, &mt2);
+ FunctionCallManager::sClientMap_[clientID]->addCallMember(functionID, objectID, &mt1, &mt2);
}
void FunctionCallManager::addCallMember(uint32_t functionID, uint32_t objectID, uint32_t clientID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3)
{
- if(clientMap_.find(clientID)==clientMap_.end())
+ if(sClientMap_.find(clientID)==sClientMap_.end())
{
- FunctionCallManager::clientMap_[clientID] = new packet::FunctionCalls;
- FunctionCallManager::clientMap_[clientID]->setClientID(clientID);
+ FunctionCallManager::sClientMap_[clientID] = new packet::FunctionCalls;
+ FunctionCallManager::sClientMap_[clientID]->setClientID(clientID);
}
- FunctionCallManager::clientMap_[clientID]->addCallMember(functionID, objectID, &mt1, &mt2, &mt3);
+ FunctionCallManager::sClientMap_[clientID]->addCallMember(functionID, objectID, &mt1, &mt2, &mt3);
}
void FunctionCallManager::addCallMember(uint32_t functionID, uint32_t objectID, uint32_t clientID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3, const MultiType& mt4)
{
- if(clientMap_.find(clientID)==clientMap_.end())
+ if(sClientMap_.find(clientID)==sClientMap_.end())
{
- FunctionCallManager::clientMap_[clientID] = new packet::FunctionCalls;
- FunctionCallManager::clientMap_[clientID]->setClientID(clientID);
+ FunctionCallManager::sClientMap_[clientID] = new packet::FunctionCalls;
+ FunctionCallManager::sClientMap_[clientID]->setClientID(clientID);
}
- FunctionCallManager::clientMap_[clientID]->addCallMember(functionID, objectID, &mt1, &mt2, &mt3, &mt4);
+ FunctionCallManager::sClientMap_[clientID]->addCallMember(functionID, objectID, &mt1, &mt2, &mt3, &mt4);
}
void FunctionCallManager::addCallMember(uint32_t functionID, uint32_t objectID, uint32_t clientID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3, const MultiType& mt4, const MultiType& mt5)
{
- if(clientMap_.find(clientID)==clientMap_.end())
+ if(sClientMap_.find(clientID)==sClientMap_.end())
{
- FunctionCallManager::clientMap_[clientID] = new packet::FunctionCalls;
- FunctionCallManager::clientMap_[clientID]->setClientID(clientID);
+ FunctionCallManager::sClientMap_[clientID] = new packet::FunctionCalls;
+ FunctionCallManager::sClientMap_[clientID]->setClientID(clientID);
}
- FunctionCallManager::clientMap_[clientID]->addCallMember(functionID, objectID, &mt1, &mt2, &mt3, &mt4, &mt5);
+ FunctionCallManager::sClientMap_[clientID]->addCallMember(functionID, objectID, &mt1, &mt2, &mt3, &mt4, &mt5);
}
// Send calls
@@ -153,13 +155,31 @@
void FunctionCallManager::sendCalls()
{
std::map<uint32_t, packet::FunctionCalls*>::iterator it;
- for (it = FunctionCallManager::clientMap_.begin(); it != FunctionCallManager::clientMap_.end(); it++ )
+ for (it = FunctionCallManager::sClientMap_.begin(); it != FunctionCallManager::sClientMap_.end(); ++it )
{
- assert(!FunctionCallManager::clientMap_.empty());
+ assert(!FunctionCallManager::sClientMap_.empty());
it->second->send();
}
- FunctionCallManager::clientMap_.clear();
+ FunctionCallManager::sClientMap_.clear();
}
+void FunctionCallManager::bufferIncomingFunctionCall(const orxonox::FunctionCall& fctCall)
+{
+ if( !GameMode::isMaster() )
+ FunctionCallManager::sIncomingFunctionCallBuffer_.push_back( fctCall );
+}
+void FunctionCallManager::processBufferedFunctionCalls()
+{
+ std::vector<FunctionCall>::iterator it = FunctionCallManager::sIncomingFunctionCallBuffer_.begin();
+ while( it!=FunctionCallManager::sIncomingFunctionCallBuffer_.end() )
+ {
+ if( it->execute() )
+ FunctionCallManager::sIncomingFunctionCallBuffer_.erase(it);
+ else
+ ++it;
+ }
+}
+
+
} //namespace orxonox
Modified: code/trunk/src/libraries/network/FunctionCallManager.h
===================================================================
--- code/trunk/src/libraries/network/FunctionCallManager.h 2010-09-28 15:31:59 UTC (rev 7494)
+++ code/trunk/src/libraries/network/FunctionCallManager.h 2010-09-28 19:48:32 UTC (rev 7495)
@@ -32,7 +32,9 @@
#include "NetworkPrereqs.h"
#include <map>
+#include <vector>
#include "util/UtilPrereqs.h"
+#include "FunctionCall.h"
namespace orxonox {
/**
@@ -57,8 +59,12 @@
static void addCallMember(uint32_t functionID, uint32_t objectID, uint32_t clientID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3, const MultiType& mt4, const MultiType& mt5);
static void sendCalls();
+
+ static void bufferIncomingFunctionCall( const FunctionCall& fctCall );
+ static void processBufferedFunctionCalls();
- static std::map<uint32_t, packet::FunctionCalls*> clientMap_;
+ static std::map<uint32_t, packet::FunctionCalls*> sClientMap_;
+ static std::vector<FunctionCall> sIncomingFunctionCallBuffer_;
protected:
FunctionCallManager();
~FunctionCallManager();
Modified: code/trunk/src/libraries/network/NetworkFunction.h
===================================================================
--- code/trunk/src/libraries/network/NetworkFunction.h 2010-09-28 15:31:59 UTC (rev 7494)
+++ code/trunk/src/libraries/network/NetworkFunction.h 2010-09-28 19:48:32 UTC (rev 7495)
@@ -138,12 +138,12 @@
static NetworkMemberFunctionBase* getFunction( const NetworkFunctionPointer& p ){ assert( functorMap_.find(p) != functorMap_.end() ); return functorMap_[p]; }
//
- virtual void call(uint32_t objectID)=0;
- virtual void call(uint32_t objectID, const MultiType& mt1)=0;
- virtual void call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2)=0;
- virtual void call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3)=0;
- virtual void call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3, const MultiType& mt4)=0;
- virtual void call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3, const MultiType& mt4, const MultiType& mt5)=0;
+ virtual bool call(uint32_t objectID)=0;
+ virtual bool call(uint32_t objectID, const MultiType& mt1)=0;
+ virtual bool call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2)=0;
+ virtual bool call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3)=0;
+ virtual bool call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3, const MultiType& mt4)=0;
+ virtual bool call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3, const MultiType& mt4, const MultiType& mt5)=0;
private:
static std::map<NetworkFunctionPointer, NetworkMemberFunctionBase*> functorMap_;
@@ -155,35 +155,65 @@
public:
NetworkMemberFunction(const FunctorMemberPtr<T>& functor, const std::string& name, const NetworkFunctionPointer& p);
- inline void call(uint32_t objectID)
+ inline bool call(uint32_t objectID)
{
if ( Synchronisable::getSynchronisable(objectID)!=0 )
+ {
(*this->functor_)(orxonox_cast<T*>(Synchronisable::getSynchronisable(objectID)));
+ return true;
+ }
+ else
+ return false;
}
- inline void call(uint32_t objectID, const MultiType& mt1)
+ inline bool call(uint32_t objectID, const MultiType& mt1)
{
if ( Synchronisable::getSynchronisable(objectID)!=0 )
+ {
(*this->functor_)(orxonox_cast<T*>(Synchronisable::getSynchronisable(objectID)), mt1);
+ return true;
+ }
+ else
+ return false;
}
- inline void call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2)
+ inline bool call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2)
{
if ( Synchronisable::getSynchronisable(objectID)!=0 )
+ {
(*this->functor_)(orxonox_cast<T*>(Synchronisable::getSynchronisable(objectID)), mt1, mt2);
+ return true;
+ }
+ else
+ return false;
}
- inline void call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3)
+ inline bool call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3)
{
if ( Synchronisable::getSynchronisable(objectID)!=0 )
+ {
(*this->functor_)(orxonox_cast<T*>(Synchronisable::getSynchronisable(objectID)), mt1, mt2, mt3);
+ return true;
+ }
+ else
+ return false;
}
- inline void call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3, const MultiType& mt4)
+ inline bool call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3, const MultiType& mt4)
{
if ( Synchronisable::getSynchronisable(objectID)!=0 )
+ {
(*this->functor_)(orxonox_cast<T*>(Synchronisable::getSynchronisable(objectID)), mt1, mt2, mt3, mt4);
+ return true;
+ }
+ else
+ return false;
}
- inline void call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3, const MultiType& mt4, const MultiType& mt5)
+ inline bool call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3, const MultiType& mt4, const MultiType& mt5)
{
if ( Synchronisable::getSynchronisable(objectID)!=0 )
+ {
(*this->functor_)(orxonox_cast<T*>(Synchronisable::getSynchronisable(objectID)), mt1, mt2, mt3, mt4, mt5);
+ return true;
+ }
+ else
+ return false;
}
private:
Modified: code/trunk/src/libraries/network/packet/FunctionCalls.cc
===================================================================
--- code/trunk/src/libraries/network/packet/FunctionCalls.cc 2010-09-28 15:31:59 UTC (rev 7494)
+++ code/trunk/src/libraries/network/packet/FunctionCalls.cc 2010-09-28 19:48:32 UTC (rev 7495)
@@ -30,6 +30,7 @@
#include <cassert>
#include "network/FunctionCall.h"
+#include "network/FunctionCallManager.h"
namespace orxonox {
namespace packet {
@@ -65,7 +66,8 @@
{
FunctionCall fctCall;
fctCall.loadData(temp);
- fctCall.execute();
+ if( !fctCall.execute() )
+ FunctionCallManager::bufferIncomingFunctionCall( fctCall );
}
delete this;
Modified: code/trunk/src/orxonox/worldentities/ControllableEntity.cc
===================================================================
--- code/trunk/src/orxonox/worldentities/ControllableEntity.cc 2010-09-28 15:31:59 UTC (rev 7494)
+++ code/trunk/src/orxonox/worldentities/ControllableEntity.cc 2010-09-28 19:48:32 UTC (rev 7495)
@@ -86,6 +86,9 @@
this->setConfigValues();
this->setPriority( Priority::VeryHigh );
this->registerVariables();
+ COUT(0) << "CE creator" << endl;
+ if( GameMode::isMaster() )
+ callMemberNetworkFunction(ControllableEntity, fire, this->getObjectID(), 1, 0);
}
ControllableEntity::~ControllableEntity()
@@ -240,6 +243,7 @@
void ControllableEntity::fire(unsigned int firemode)
{
+ COUT(0) << "fire........." << endl;
if(GameMode::isMaster())
{
this->fired(firemode);
More information about the Orxonox-commit
mailing list