wesnoth-cvs-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Wesnoth-cvs-commits] wesnoth/src network.cpp network_worker.cpp


From: David White
Subject: [Wesnoth-cvs-commits] wesnoth/src network.cpp network_worker.cpp
Date: Sun, 20 Mar 2005 20:33:37 -0500

CVSROOT:        /cvsroot/wesnoth
Module name:    wesnoth
Branch:         
Changes by:     David White <address@hidden>    05/03/21 01:33:36

Modified files:
        src            : network.cpp network_worker.cpp 

Log message:
        fixed network crashes

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/src/network.cpp.diff?tr1=1.55&tr2=1.56&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/src/network_worker.cpp.diff?tr1=1.22&tr2=1.23&r1=text&r2=text

Patches:
Index: wesnoth/src/network.cpp
diff -u wesnoth/src/network.cpp:1.55 wesnoth/src/network.cpp:1.56
--- wesnoth/src/network.cpp:1.55        Thu Mar 10 20:59:20 2005
+++ wesnoth/src/network.cpp     Mon Mar 21 01:33:36 2005
@@ -1,12 +1,12 @@
 #include "global.hpp"
-
+
+#include "serialization/binary_wml.hpp"
 #include "config.hpp"
 #include "log.hpp"
 #include "network.hpp"
 #include "network_worker.hpp"
 #include "util.hpp"
 #include "wassert.hpp"
-#include "serialization/binary_wml.hpp"
 
 #include "SDL_net.h"
 
@@ -101,6 +101,7 @@
 }
 
 SDLNet_SocketSet socket_set = 0;
+std::set<network::connection> waiting_sockets;
 typedef std::vector<network::connection> sockets_list;
 sockets_list sockets;
 
@@ -184,6 +185,7 @@
                worker_pool_man = NULL;
                SDLNet_FreeSocketSet(socket_set);
                socket_set = 0;
+               waiting_sockets.clear();
                SDLNet_Quit();
        }
 }
@@ -270,7 +272,9 @@
                throw network::error("Could not add socket to socket set");
        }
 
-       sockets.push_back(connect);
+       waiting_sockets.insert(connect);
+
+       sockets.push_back(connect);
        wassert(schemas.count(connect) == 0);
        
schemas.insert(std::pair<network::connection,schema_pair>(connect,schema_pair()));
 
@@ -349,6 +353,7 @@
                        throw network::error("Could not add socket to socket 
set");
                }
 
+
                const connection connect = create_connection(sock,"",0);
 
                //send back their connection number
@@ -359,7 +364,8 @@
                        throw network::error("Could not send initial 
handshake");
                }
 
-               sockets.push_back(connect);
+               waiting_sockets.insert(connect);
+               sockets.push_back(connect);
                wassert(schemas.count(connect) == 0);
                
schemas.insert(std::pair<network::connection,schema_pair>(connect,schema_pair()));
                return connect;
@@ -398,6 +404,7 @@
 
                const TCPsocket sock = get_socket(s);
 
+               waiting_sockets.erase(s);
                SDLNet_TCP_DelSocket(socket_set,sock);
                SDLNet_TCP_Close(sock);
 
@@ -459,7 +466,7 @@
 
        const int res = SDLNet_CheckSockets(socket_set,0);
 
-       for(sockets_list::const_iterator i = sockets.begin(); res != 0 && i != 
sockets.end(); ++i) {
+       for(std::set<network::connection>::iterator i = 
waiting_sockets.begin(); res != 0 && i != waiting_sockets.end(); ) {
                connection_details& details = get_connection_details(*i);
                const TCPsocket sock = details.sock;
                if(SDLNet_SocketReady(sock)) {
@@ -479,8 +486,11 @@
                                continue;
                        }
 
-                       network_worker_pool::receive_data(sock);
+                       waiting_sockets.erase(i++);
                        SDLNet_TCP_DelSocket(socket_set,sock);
+                       network_worker_pool::receive_data(sock);
+               } else {
+                       ++i;
                }
        }
 
@@ -502,13 +512,15 @@
        }
 
        if(result == 0) {
+               assert(false);
                return result;
        }
+       waiting_sockets.insert(result);
 
        const schema_map::iterator schema = schemas.find(result);
        wassert(schema != schemas.end());
 
-       read_compressed(cfg, std::string(buf.begin(), buf.end()), 
schema->second.incoming);
+       
read_compressed(cfg,std::string(buf.begin(),buf.end()),schema->second.incoming);
 
        return result;
 }
@@ -556,7 +568,7 @@
        const schema_map::iterator schema = schemas.find(connection_num);
        wassert(schema != schemas.end());
 
-       const std::string& value = write_compressed(cfg, 
schema->second.outgoing);
+       const std::string& value = 
write_compressed(cfg,schema->second.outgoing);
 
 //     std::cerr << "--- SEND DATA to " << ((int)connection_num) << ": '"
 //               << cfg.write() << "'\n--- END SEND DATA\n";
Index: wesnoth/src/network_worker.cpp
diff -u wesnoth/src/network_worker.cpp:1.22 wesnoth/src/network_worker.cpp:1.23
--- wesnoth/src/network_worker.cpp:1.22 Sun Mar 13 10:32:21 2005
+++ wesnoth/src/network_worker.cpp      Mon Mar 21 01:33:36 2005
@@ -107,7 +107,7 @@
                                for(; itor != itor_end; ++itor) {
                                        socket_state_map::iterator lock_it = 
sockets_locked.find((*itor)->sock);
                                        wassert(lock_it != 
sockets_locked.end());
-                                       if(lock_it->second == SOCKET_READY) {
+                                       if(lock_it->second == SOCKET_READY) {
                                                lock_it->second = SOCKET_LOCKED;
                                                sent_buf = *itor;
                                                sock = sent_buf->sock;
@@ -121,7 +121,7 @@
                                        for(; itor != itor_end; ++itor) {
                                                socket_state_map::iterator 
lock_it = sockets_locked.find(*itor);
                                                wassert(lock_it != 
sockets_locked.end());
-                                               if(lock_it->second == 
SOCKET_READY) {
+                                               if(lock_it->second == 
SOCKET_READY) {
                                                        lock_it->second = 
SOCKET_LOCKED;
                                                        sock = *itor;
                                                        
pending_receives.erase(itor);
@@ -213,7 +213,6 @@
                {
                        const threading::lock lock(*global_mutex);
                        managed = false;
-                       sockets_locked.clear();
                        socket_errors = 0;
                }
                cond->notify_all();
@@ -229,7 +228,9 @@
                delete global_mutex;
                delete cond;
                global_mutex = NULL;
-               cond = NULL;
+               cond = NULL;
+
+               sockets_locked.clear();
 
                LOG_NW << "exiting manager::~manager()\n";
        }
@@ -362,4 +363,4 @@
        return current_transfer_stats;
 }
 
-}
+}
\ No newline at end of file




reply via email to

[Prev in Thread] Current Thread [Next in Thread]