# HG changeset patch # User terom # Date 1227564569 0 # Node ID 91e3f3806b318439e791c2dd20cc7c4efe81866e # Parent 5cb116dc07590f25e5602e53dce483862955a5c2 set UDP sockets as nonblocking diff -r 5cb116dc0759 -r 91e3f3806b31 src/proto2/NetworkUDP.cc --- a/src/proto2/NetworkUDP.cc Mon Nov 24 22:05:19 2008 +0000 +++ b/src/proto2/NetworkUDP.cc Mon Nov 24 22:09:29 2008 +0000 @@ -11,6 +11,9 @@ // connect signal slots.connect(socket.sig_read_triggered(), this, &NetworkUDP::on_recv); + + // nonblocking + socket.set_nonblocking(true); } NetworkUDP::NetworkUDP (const NetworkAddress &bind_addr) : @@ -21,6 +24,9 @@ // connect signal slots.connect(socket.sig_read_triggered(), this, &NetworkUDP::on_recv); + + // nonblocking + socket.set_nonblocking(true); } void NetworkUDP::on_recv (void) { @@ -28,22 +34,26 @@ NetworkPacket pkt; NetworkAddress src; - // attempt to recv - try { - ret = socket.recv(pkt.get_buf(), pkt.get_buf_size(), src); + // receieve as many packets as possible + do { + // attempt to recv a packet + try { + ret = socket.recv(pkt.get_buf(), pkt.get_buf_size(), src); - } catch (CL_Error &e) { - if (errno == EAGAIN) - return; - else - throw; - } - - // set packet data size - pkt.set_data_size(ret); + } catch (CL_Error &e) { + if (errno == EAGAIN) + return; + else + throw; + } + + // set packet data size + pkt.set_data_size(ret); - // handle packet - _sig_packet(pkt, src); + // handle packet + _sig_packet(pkt, src); + + } while (true); } bool NetworkUDP::sendto (const NetworkPacket &packet, const NetworkAddress &dst) { diff -r 5cb116dc0759 -r 91e3f3806b31 src/proto2/Physics.cc --- a/src/proto2/Physics.cc Mon Nov 24 22:05:19 2008 +0000 +++ b/src/proto2/Physics.cc Mon Nov 24 22:09:29 2008 +0000 @@ -8,7 +8,7 @@ #include PhysicsWorld::PhysicsWorld (Vector gravity, Vector dimensions) - : tick_timer(PHYSICS_TICK_MS), gravity(gravity), dimensions(dimensions), terrain(dimensions.x, std::vector(dimensions.y, DIRT)) { + : tick_timer(PHYSICS_TICK_MS), tick_counter(0), gravity(gravity), dimensions(dimensions), terrain(dimensions.x, std::vector(dimensions.y, DIRT)) { generateTerrain(1337); @@ -26,6 +26,12 @@ for (std::vector::iterator i = objects.begin(); i != objects.end(); i++) { (*i)->tick(); } + + tick_counter++; +} + +uint32_t PhysicsWorld::getTick (void) { + return tick_counter; } PhysicsObject::PhysicsObject (PhysicsWorld &world, float mass, Vector position, Vector velocity) diff -r 5cb116dc0759 -r 91e3f3806b31 src/proto2/Physics.hh --- a/src/proto2/Physics.hh Mon Nov 24 22:05:19 2008 +0000 +++ b/src/proto2/Physics.hh Mon Nov 24 22:09:29 2008 +0000 @@ -26,6 +26,8 @@ private: CL_Timer tick_timer; + + uint32_t tick_counter; protected: std::vector objects; @@ -45,6 +47,8 @@ void addObject (PhysicsObject *object); void tick (void); + uint32_t getTick (void); + void generateTerrain (int seed); bool collided (Vector oldPos, Vector newPos);