added support for nested message bundles

This commit is contained in:
Darren Ranalli 2007-12-05 03:17:41 +00:00
parent 113790f2da
commit 4b0a024743
3 changed files with 53 additions and 27 deletions

View File

@ -247,6 +247,17 @@ get_overflow_event_name() {
return _overflow_event_name;
}
////////////////////////////////////////////////////////////////////
// Function: CConnectionRepository::is_bundling_messages
// Access: Published
// Description: Returns true if repository is queueing outgoing messages
// into a message bundle
////////////////////////////////////////////////////////////////////
INLINE bool CConnectionRepository::
is_bundling_messages() const {
return _bundling_msgs > 0;
}
////////////////////////////////////////////////////////////////////
// Function: CConnectionRepository::set_simulated_disconnect
// Access: Published

View File

@ -72,7 +72,7 @@ CConnectionRepository(bool has_owner_view) :
_msg_type(0),
_has_owner_view(has_owner_view),
_handle_c_updates(true),
_bundling_msgs(false)
_bundling_msgs(0)
{
#if defined(HAVE_NET) && defined(SIMULATE_NETWORK_DELAY)
if (min_lag != 0.0 || max_lag != 0.0) {
@ -392,7 +392,7 @@ send_datagram(const Datagram &dg) {
describe_message(nout, "SEND", dg);
}
if (_bundling_msgs) {
if (is_bundling_messages()) {
bundle_msg(dg);
return false;
}
@ -441,14 +441,13 @@ start_message_bundle() {
// all updates in between must be sent from the same doId (updates
// must all affect the same DistributedObject)
// it is an error to call this again before calling sendMessageBundle
// NOTE: this is currently only implemented for setLocation and sendUpdate
// msgs
nassertv(!_bundling_msgs);
_bundling_msgs = true;
_bundle_msgs.clear();
if (get_verbose()) {
nout << "CR::SEND:BUNDLE_START" << endl;
nout << "CR::SEND:BUNDLE_START(" << _bundling_msgs << ")" << endl;
}
if (_bundling_msgs == 0) {
_bundle_msgs.clear();
}
++_bundling_msgs;
}
////////////////////////////////////////////////////////////////////
@ -460,27 +459,41 @@ void CConnectionRepository::
send_message_bundle(unsigned int channel, unsigned int sender_channel) {
nassertv(_bundling_msgs);
Datagram dg;
// add server header (see PyDatagram.addServerHeader)
dg.add_int8(1);
dg.add_uint64(channel);
dg.add_uint64(sender_channel);
dg.add_uint16(STATESERVER_BOUNCE_MESSAGE);
// add each bundled message
BundledMsgVector::const_iterator bmi;
for (bmi = _bundle_msgs.begin(); bmi != _bundle_msgs.end(); bmi++) {
dg.add_string(*bmi);
}
_bundling_msgs = false;
_bundle_msgs.clear();
--_bundling_msgs;
if (get_verbose()) {
nout << "CR::SEND:BUNDLE_FINISH" << endl;
nout << "CR::SEND:BUNDLE_FINISH(" << _bundling_msgs << ")" << endl;
}
// once _bundling_msgs flag is set to false, we can send the datagram
send_datagram(dg);
// if _bundling_msgs ref count is zero, send the bundle out
if (_bundling_msgs == 0) {
Datagram dg;
// add server header (see PyDatagram.addServerHeader)
dg.add_int8(1);
dg.add_uint64(channel);
dg.add_uint64(sender_channel);
dg.add_uint16(STATESERVER_BOUNCE_MESSAGE);
// add each bundled message
BundledMsgVector::const_iterator bmi;
for (bmi = _bundle_msgs.begin(); bmi != _bundle_msgs.end(); bmi++) {
dg.add_string(*bmi);
}
send_datagram(dg);
}
}
////////////////////////////////////////////////////////////////////
// Function: CConnectionRepository::abandon_message_bundles
// Access: Published
// Description: throw out any msgs that have been queued up for
// message bundles
////////////////////////////////////////////////////////////////////
void CConnectionRepository::
abandon_message_bundles() {
nassertv(is_bundling_messages());
_bundling_msgs = 0;
_bundle_msgs.clear();
}
////////////////////////////////////////////////////////////////////
@ -490,7 +503,7 @@ send_message_bundle(unsigned int channel, unsigned int sender_channel) {
////////////////////////////////////////////////////////////////////
void CConnectionRepository::
bundle_msg(const Datagram &dg) {
nassertv(_bundling_msgs);
nassertv(is_bundling_messages());
_bundle_msgs.push_back(dg.get_message());
}

View File

@ -124,7 +124,9 @@ PUBLISHED:
bool send_datagram(const Datagram &dg);
void start_message_bundle();
INLINE bool is_bundling_messages() const;
void send_message_bundle(unsigned int channel, unsigned int sender_channel);
void abandon_message_bundles();
void bundle_msg(const Datagram &dg);
bool consider_flush();
@ -191,7 +193,7 @@ private:
static const string _overflow_event_name;
bool _bundling_msgs;
unsigned int _bundling_msgs;
typedef std::vector< const string > BundledMsgVector;
BundledMsgVector _bundle_msgs;