diff --git a/source/src/client.cpp b/source/src/client.cpp index 407a47d9..77404ecb 100644 --- a/source/src/client.cpp +++ b/source/src/client.cpp @@ -415,12 +415,13 @@ void gets2c() // get updates from the server case ENET_EVENT_TYPE_RECEIVE: { - extern packetqueue pkglogger; - pkglogger.queue(*event.packet); + extern packetqueue pktlogger; + pktlogger.queue(event.packet); if(discmillis) conoutf("attempting to disconnect..."); else servertoclient(event.channelID, event.packet->data, (int)event.packet->dataLength); - enet_packet_destroy(event.packet); + // destroyed in logger + //enet_packet_destroy(event.packet); break; } diff --git a/source/src/clients2c.cpp b/source/src/clients2c.cpp index c25dd443..aee77dca 100644 --- a/source/src/clients2c.cpp +++ b/source/src/clients2c.cpp @@ -10,14 +10,14 @@ VARP(networkdebug, 0, 0, 1); extern bool c2sinit, senditemstoserver, watchingdemo; extern string clientpassword; -packetqueue pkglogger(8); +packetqueue pktlogger; void neterr(const char *s) { conoutf("\f3illegal network message (%s)", s); // might indicate a client/server communication bug, create error report - pkglogger.flushtolog("packetlog.txt"); + pktlogger.flushtolog("packetlog.txt"); conoutf("\f3wrote a network error report to packetlog.txt, please post this file to the bugtracker now!"); disconnect(); diff --git a/source/src/packetqueue.cpp b/source/src/packetqueue.cpp index f9091205..6b21f350 100644 --- a/source/src/packetqueue.cpp +++ b/source/src/packetqueue.cpp @@ -3,9 +3,8 @@ #include "pch.h" #include "cube.h" -packetqueue::packetqueue(size_t size) +packetqueue::packetqueue() { - queuesize = size; } packetqueue::~packetqueue() @@ -14,42 +13,38 @@ packetqueue::~packetqueue() } // adds packet to log buffer -void packetqueue::queue(ENetPacket &p) +void packetqueue::queue(ENetPacket *p) { - // add to back - pqueue.push(p); - // drop oldest packet to fit size - if(pqueue.size() > queuesize) pqueue.pop(); + if(packets.length() >= packets.maxsize()) enet_packet_destroy(packets.remove()); + packets.add(p); } // writes all currently queued packets to disk and clears the queue -bool packetqueue::flushtolog(char *logfile ) +bool packetqueue::flushtolog(const char *logfile) { - if(pqueue.empty()) return false; + if(packets.empty()) return false; FILE *f = NULL; if(logfile && logfile[0]) f = openfile(logfile, "w"); if(!f) return false; - + // header - fprintf(f, "AC PACKET LOG %11d\n\n", now_utc); + fprintf(f, "AC PACKET LOG %11u\n\n", (uint)now_utc); // serialize each packet - while(!pqueue.empty()) + loopv(packets) { - ENetPacket packet = pqueue.front(); - + ENetPacket *p = packets[i]; + fputs("ENET PACKET\n", f); - fprintf(f, "flags == %d\n", packet.flags); - fprintf(f, "referenceCount == %d\n", packet.referenceCount); - fprintf(f, "dataLength == %d\n", packet.dataLength); + fprintf(f, "flags == %d\n", p->flags); + fprintf(f, "referenceCount == %d\n", p->referenceCount); + fprintf(f, "dataLength == %d\n", p->dataLength); fputs("data == \n", f); // print whole buffer char-wise - loopi(packet.dataLength) + loopj(p->dataLength) { - fprintf(f, "%16d\n", packet.data[i]); + fprintf(f, "%16d\n", p->data[j]); } - - pqueue.pop(); } fclose(f); @@ -60,6 +55,7 @@ bool packetqueue::flushtolog(char *logfile ) // clear queue void packetqueue::clear() { - while(!pqueue.empty()) pqueue.pop(); + loopv(packets) enet_packet_destroy(packets[i]); + packets.clear(); } diff --git a/source/src/pch.h b/source/src/pch.h index 8c508420..8408eabb 100644 --- a/source/src/pch.h +++ b/source/src/pch.h @@ -16,7 +16,6 @@ #include #include #include -#include #include #include #include diff --git a/source/src/protos.h b/source/src/protos.h index 18ba4c89..3156a6cb 100644 --- a/source/src/protos.h +++ b/source/src/protos.h @@ -208,17 +208,14 @@ extern serverinfo *getconnectedserverinfo(); extern void pingservers(); extern void updatefrommaster(int force); -class packetqueue +struct packetqueue { - size_t queuesize; - std::queue pqueue; + ringbuf packets; -public: - - packetqueue(size_t size); + packetqueue(); ~packetqueue(); - void queue(ENetPacket &p); - bool flushtolog(char *logfile); + void queue(ENetPacket *p); + bool flushtolog(const char *logfile); void clear(); }; diff --git a/source/src/tools.h b/source/src/tools.h index 3d2f4994..a697b3fd 100644 --- a/source/src/tools.h +++ b/source/src/tools.h @@ -499,6 +499,62 @@ template struct hashtable } }; +template struct ringbuf +{ + int index, len; + T data[SIZE]; + + ringbuf() { clear(); } + + void clear() + { + index = len = 0; + } + + bool empty() const { return !len; } + + int maxsize() const { return SIZE; } + int length() const { return len; } + + T &remove() + { + int start = index - len; + if(start < 0) start += SIZE; + len--; + return data[start]; + } + + T &add(const T &e) + { + T &t = data[index]; + t = e; + index++; + if(index>=SIZE) index = 0; + if(len= SIZE) i -= SIZE; + return data[i]; + } + + const T &operator[](int i) const + { + int start = index - len; + if(start < 0) start += SIZE; + i += start; + if(i >= SIZE) i -= SIZE; + return data[i]; + } +}; + #define itoa(s, i) sprintf(s, "%d", i) #define ftoa(s, f) sprintf(s, (f) == int(f) ? "%.1f" : "%.7g", f)