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