summaryrefslogtreecommitdiffstats
path: root/chromium/net/socket/tcp_socket.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/socket/tcp_socket.cc')
-rw-r--r--chromium/net/socket/tcp_socket.cc49
1 files changed, 36 insertions, 13 deletions
diff --git a/chromium/net/socket/tcp_socket.cc b/chromium/net/socket/tcp_socket.cc
index fd72f6b4640..63703627134 100644
--- a/chromium/net/socket/tcp_socket.cc
+++ b/chromium/net/socket/tcp_socket.cc
@@ -6,50 +6,73 @@
#include "base/file_util.h"
#include "base/files/file_path.h"
+#include "base/memory/ref_counted.h"
+#include "base/threading/worker_pool.h"
namespace net {
namespace {
-#if defined(OS_LINUX)
+bool g_tcp_fastopen_enabled = false;
+
+#if defined(OS_LINUX) || defined(OS_ANDROID)
+
+typedef base::RefCountedData<bool> SharedBoolean;
// Checks to see if the system supports TCP FastOpen. Notably, it requires
// kernel support. Additionally, this checks system configuration to ensure that
// it's enabled.
-bool SystemSupportsTCPFastOpen() {
+void SystemSupportsTCPFastOpen(scoped_refptr<SharedBoolean> supported) {
+ supported->data = false;
static const base::FilePath::CharType kTCPFastOpenProcFilePath[] =
"/proc/sys/net/ipv4/tcp_fastopen";
std::string system_enabled_tcp_fastopen;
- if (!base::ReadFileToString(
- base::FilePath(kTCPFastOpenProcFilePath),
- &system_enabled_tcp_fastopen)) {
- return false;
+ if (!base::ReadFileToString(base::FilePath(kTCPFastOpenProcFilePath),
+ &system_enabled_tcp_fastopen)) {
+ return;
}
// As per http://lxr.linux.no/linux+v3.7.7/include/net/tcp.h#L225
// TFO_CLIENT_ENABLE is the LSB
if (system_enabled_tcp_fastopen.empty() ||
(system_enabled_tcp_fastopen[0] & 0x1) == 0) {
- return false;
+ return;
}
- return true;
+ supported->data = true;
+}
+
+void EnableCallback(scoped_refptr<SharedBoolean> supported) {
+ g_tcp_fastopen_enabled = supported->data;
+}
+
+// This is asynchronous because it needs to do file IO, and it isn't allowed to
+// do that on the IO thread.
+void EnableFastOpenIfSupported() {
+ scoped_refptr<SharedBoolean> supported = new SharedBoolean;
+ base::WorkerPool::PostTaskAndReply(
+ FROM_HERE,
+ base::Bind(SystemSupportsTCPFastOpen, supported),
+ base::Bind(EnableCallback, supported),
+ false);
}
#else
-bool SystemSupportsTCPFastOpen() {
- return false;
+void EnableFastOpenIfSupported() {
+ g_tcp_fastopen_enabled = false;
}
#endif
-bool g_tcp_fastopen_enabled = false;
-
} // namespace
void SetTCPFastOpenEnabled(bool value) {
- g_tcp_fastopen_enabled = value && SystemSupportsTCPFastOpen();
+ if (value) {
+ EnableFastOpenIfSupported();
+ } else {
+ g_tcp_fastopen_enabled = false;
+ }
}
bool IsTCPFastOpenEnabled() {