Author: suokko
Date: Wed Jun 11 22:58:26 2008
New Revision: 27106

URL: http://svn.gna.org/viewcvs/wesnoth?rev=27106&view=rev
Log:
Added runtime configuration for system sendfile support

Modified:
    trunk/src/campaign_server/campaign_server.cpp
    trunk/src/network_worker.cpp
    trunk/src/network_worker.hpp

Modified: trunk/src/campaign_server/campaign_server.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/campaign_server/campaign_server.cpp?rev=27106&r1=27105&r2=27106&view=diff
==============================================================================
--- trunk/src/campaign_server/campaign_server.cpp (original)
+++ trunk/src/campaign_server/campaign_server.cpp Wed Jun 11 22:58:26 2008
@@ -16,6 +16,7 @@
 #include "filesystem.hpp"
 #include "log.hpp"
 #include "network.hpp"
+#include "network_worker.hpp"
 #include "util.hpp"
 #include "scoped_resource.hpp"
 #include "serialization/binary_wml.hpp"
@@ -133,6 +134,9 @@
        {
                scoped_istream stream = istream_file(file_);
                read(cfg_, *stream);
+               bool network_use_system_sendfile = 
utils::string_bool(cfg_["network_use_system_sendfile"],false);
+               
network_worker_pool::set_use_system_sendfile(network_use_system_sendfile);
+               cfg_["network_use_system_sendfile"] = 
(network_use_system_sendfile?"yes":"no");
                /** Seems like compression level above 6 is waste of cpu cycle 
*/
                compress_level_ = 
lexical_cast_default<int>(cfg_["compress_level"],6);
                cfg_["compress_level"] = 
lexical_cast<std::string>(compress_level_);

Modified: trunk/src/network_worker.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/network_worker.cpp?rev=27106&r1=27105&r2=27106&view=diff
==============================================================================
--- trunk/src/network_worker.cpp (original)
+++ trunk/src/network_worker.cpp Wed Jun 11 22:58:26 2008
@@ -172,6 +172,7 @@
 std::map<Uint32,threading::thread*> threads[NUM_SHARDS];
 std::vector<Uint32> to_clear[NUM_SHARDS];
 int system_send_buffer_size = 0;
+bool network_use_system_sendfile = false;
 
 int receive_bytes(TCPsocket s, char* buf, size_t nbytes)
 {
@@ -410,35 +411,80 @@
        size_t upto = 0;
        size_t filesize = file_size(buf->config_error);
 #ifdef USE_SENDFILE
-       std::vector<char> buffer;
-       buffer.reserve(4);
-       SDLNet_Write32(filesize,&buffer[0]);
-       int socket = reinterpret_cast<_TCPsocket*>(buf->sock)->channel;
-       int in_file = open(buf->config_error.c_str(),O_NOATIME | O_RDONLY);
-       int cock = 1;
-       int poll_res;
-       struct pollfd fd = {socket, POLLOUT, 0 };
-       setsockopt(socket, IPPROTO_TCP, TCP_CORK, &cock, sizeof(cock));;
-       do {
-               poll_res = poll(&fd, 1, 600000);
-       } while(poll_res == -1 && errno == EINTR);
-
-       SOCKET_STATE result;
-       if (poll_res > 0)
-               result = send_buffer(buf->sock, buffer, 4);
-       else
-               result = SOCKET_ERRORED;
-       
-       
-       if (result != SOCKET_READY)
+       // implements linux sendfile support
+       if (network_use_system_sendfile)
        {
+               std::vector<char> buffer;
+               buffer.reserve(4);
+               SDLNet_Write32(filesize,&buffer[0]);
+               int socket = reinterpret_cast<_TCPsocket*>(buf->sock)->channel;
+               int in_file = open(buf->config_error.c_str(),O_NOATIME | 
O_RDONLY);
+               int cock = 1;
+               int poll_res;
+               struct pollfd fd = {socket, POLLOUT, 0 };
+               setsockopt(socket, IPPROTO_TCP, TCP_CORK, &cock, sizeof(cock));;
+               do {
+                       poll_res = poll(&fd, 1, 600000);
+               } while(poll_res == -1 && errno == EINTR);
+
+               SOCKET_STATE result;
+               if (poll_res > 0)
+                       result = send_buffer(buf->sock, buffer, 4);
+               else
+                       result = SOCKET_ERRORED;
+
+
+               if (result != SOCKET_READY)
+               {
+                       close(in_file);
+                       cock = 0;
+                       setsockopt(socket, IPPROTO_TCP, TCP_CORK, &cock, 
sizeof(cock));
+                       return result;
+               }
+               result = SOCKET_READY;
+
+               while (true)
+               {
+
+                       do {
+                               poll_res = poll(&fd, 1, 600000);
+                       } while(poll_res == -1 && errno == EINTR);
+
+                       if (poll_res <= 0 )
+                       {
+                               result = SOCKET_ERRORED;
+                               break;
+                       }
+
+
+                       int bytes = ::sendfile(socket, in_file, 0, filesize);
+
+                       if (bytes == -1)
+                       {
+                               if (errno == EAGAIN)
+                                       continue;
+                               result = SOCKET_ERRORED;
+                               break;
+                       }
+                       upto += bytes;
+
+
+                       if (upto == filesize)
+                       {
+                               buf->raw_buffer.push_back(0);
+                               result = send_buffer(buf->sock, 
buf->raw_buffer, 1);
+                               break;
+                       }
+               }
+
                close(in_file);
                cock = 0;
                setsockopt(socket, IPPROTO_TCP, TCP_CORK, &cock, sizeof(cock));
                return result;
        }
-       result = SOCKET_READY;
-#else
+#endif
+       // default sendfile implementation 
+       // if no system implementation is enabled
        int send_size = 0;
        SDLNet_Write32(filesize,&buf->raw_buffer[0]);
        scoped_istream file_stream = istream_file(buf->config_error);
@@ -448,41 +494,8 @@
        {
                return result;
        }
-#endif
        while (true)
        {
-#ifdef USE_SENDFILE
-
-               do {
-                       poll_res = poll(&fd, 1, 600000);
-               } while(poll_res == -1 && errno == EINTR);
-
-               if (poll_res <= 0 )
-               {
-                       result = SOCKET_ERRORED;
-                       break;
-               }
-
-
-               int bytes = ::sendfile(socket, in_file, 0, filesize);
-
-               if (bytes == -1)
-               {
-                       if (errno == EAGAIN)
-                               continue;
-                       result = SOCKET_ERRORED;
-                       break;
-               }
-               upto += bytes;
-
-
-               if (upto == filesize)
-               {
-                       buf->raw_buffer.push_back(0);
-                       result = send_buffer(buf->sock, buf->raw_buffer, 1);
-                       break;
-               }
-#else
                // read data
                file_stream->read(&buf->raw_buffer[0], buf->raw_buffer.size());
                send_size = file_stream->gcount();
@@ -500,13 +513,7 @@
                        break;
                }
 
-#endif
-       }
-#ifdef USE_SENDFILE
-       close(in_file);
-       cock = 0;
-       setsockopt(socket, IPPROTO_TCP, TCP_CORK, &cock, sizeof(cock));
-#endif
+       }
        return result;
 }
 
@@ -814,6 +821,11 @@
        raw_data_only = true;
 }
 
+void set_use_system_sendfile(bool use)
+{
+       network_use_system_sendfile = use;
+}
+
 void receive_data(TCPsocket sock)
 {
        {

Modified: trunk/src/network_worker.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/network_worker.hpp?rev=27106&r1=27105&r2=27106&view=diff
==============================================================================
--- trunk/src/network_worker.hpp (original)
+++ trunk/src/network_worker.hpp Wed Jun 11 22:58:26 2008
@@ -46,6 +46,7 @@
 network::pending_statistics get_pending_stats();
 
 void set_raw_data_only();
+void set_use_system_sendfile(bool);
 
 //! Function to asynchronously received data to the given socket.
 void receive_data(TCPsocket sock);


_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits

Reply via email to