Update talk to 55821645.

TEST=try bots
R=mallinath@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/3139004

git-svn-id: http://webrtc.googlecode.com/svn/trunk@5053 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/talk/base/base64.cc b/talk/base/base64.cc
index 7765f10..79b045e 100644
--- a/talk/base/base64.cc
+++ b/talk/base/base64.cc
@@ -20,7 +20,6 @@
 
 #include "talk/base/common.h"
 
-using std::string;
 using std::vector;
 
 namespace talk_base {
@@ -96,7 +95,8 @@
   return true;
 }
 
-void Base64::EncodeFromArray(const void* data, size_t len, string* result) {
+void Base64::EncodeFromArray(const void* data, size_t len,
+                             std::string* result) {
   ASSERT(NULL != result);
   result->clear();
   result->resize(((len + 2) / 3) * 4);
@@ -190,8 +190,9 @@
 }
 
 bool Base64::DecodeFromArray(const char* data, size_t len, DecodeFlags flags,
-                             string* result, size_t* data_used) {
-  return DecodeFromArrayTemplate<string>(data, len, flags, result, data_used);
+                             std::string* result, size_t* data_used) {
+  return DecodeFromArrayTemplate<std::string>(
+      data, len, flags, result, data_used);
 }
 
 bool Base64::DecodeFromArray(const char* data, size_t len, DecodeFlags flags,
diff --git a/talk/base/logging.h b/talk/base/logging.h
index b563302..49e126b 100644
--- a/talk/base/logging.h
+++ b/talk/base/logging.h
@@ -312,8 +312,10 @@
 // The _F version prefixes the message with the current function name.
 #if (defined(__GNUC__) && defined(_DEBUG)) || defined(WANT_PRETTY_LOG_F)
 #define LOG_F(sev) LOG(sev) << __PRETTY_FUNCTION__ << ": "
+#define LOG_T_F(sev) LOG(sev) << this << ": " << __PRETTY_FUNCTION__ << ": "
 #else
 #define LOG_F(sev) LOG(sev) << __FUNCTION__ << ": "
+#define LOG_T_F(sev) LOG(sev) << this << ": " << __FUNCTION__ << ": "
 #endif
 
 #define LOG_CHECK_LEVEL(sev) \
@@ -331,7 +333,6 @@
         .stream()
 
 #define LOG_T(sev) LOG(sev) << this << ": "
-#define LOG_T_F(level) LOG_F(level) << this << ": "
 
 #else  // !LOGGING
 
@@ -354,7 +355,7 @@
       .stream()
 
 #define LOG_T(sev) LOG(sev) << this << ": "
-#define LOG_T_F(level) LOG_F(level) << this << " "
+#define LOG_T_F(sev) LOG(sev) << this << ": " << __FUNCTION__ <<
 #endif  // !LOGGING
 
 #define LOG_ERRNO_EX(sev, err) \
diff --git a/talk/base/physicalsocketserver.cc b/talk/base/physicalsocketserver.cc
index 891330a..58a22fa 100644
--- a/talk/base/physicalsocketserver.cc
+++ b/talk/base/physicalsocketserver.cc
@@ -466,6 +466,10 @@
     ASSERT((0 <= value) && (value <= 65536));
     *mtu = value;
     return 0;
+#elif defined(__native_client__)
+    // Most socket operations, including this, will fail in NaCl's sandbox.
+    error_ = EACCES;
+    return -1;
 #endif
   }
 
diff --git a/talk/base/profiler.cc b/talk/base/profiler.cc
index 68bcfe4..4c2aac4 100644
--- a/talk/base/profiler.cc
+++ b/talk/base/profiler.cc
@@ -71,8 +71,7 @@
   ++start_count_;
 }
 
-void ProfilerEvent::Stop() {
-  uint64 stop_time = TimeNanos();
+void ProfilerEvent::Stop(uint64 stop_time) {
   --start_count_;
   ASSERT(start_count_ >= 0);
   if (start_count_ == 0) {
@@ -94,6 +93,10 @@
   }
 }
 
+void ProfilerEvent::Stop() {
+  Stop(TimeNanos());
+}
+
 double ProfilerEvent::standard_deviation() const {
     if (event_count_ <= 1) return 0.0;
     return sqrt(sum_of_squared_differences_ / (event_count_ - 1.0));
@@ -105,11 +108,29 @@
 }
 
 void Profiler::StartEvent(const std::string& event_name) {
-  events_[event_name].Start();
+  lock_.LockShared();
+  EventMap::iterator it = events_.find(event_name);
+  bool needs_insert = (it == events_.end());
+  lock_.UnlockShared();
+
+  if (needs_insert) {
+    // Need an exclusive lock to modify the map.
+    ExclusiveScope scope(&lock_);
+    it = events_.insert(
+        EventMap::value_type(event_name, ProfilerEvent())).first;
+  }
+
+  it->second.Start();
 }
 
 void Profiler::StopEvent(const std::string& event_name) {
-  events_[event_name].Stop();
+  // Get the time ASAP, then wait for the lock.
+  uint64 stop_time = TimeNanos();
+  SharedScope scope(&lock_);
+  EventMap::iterator it = events_.find(event_name);
+  if (it != events_.end()) {
+    it->second.Stop(stop_time);
+  }
 }
 
 void Profiler::ReportToLog(const char* file, int line,
@@ -118,6 +139,9 @@
   if (!LogMessage::Loggable(severity_to_use)) {
     return;
   }
+
+  SharedScope scope(&lock_);
+
   { // Output first line.
     LogMessage msg(file, line, severity_to_use);
     msg.stream() << "=== Profile report ";
@@ -126,8 +150,8 @@
     }
     msg.stream() << "===";
   }
-  typedef std::map<std::string, ProfilerEvent>::const_iterator iterator;
-  for (iterator it = events_.begin(); it != events_.end(); ++it) {
+  for (EventMap::const_iterator it = events_.begin();
+       it != events_.end(); ++it) {
     if (event_prefix.empty() || it->first.find(event_prefix) == 0) {
       LogMessage(file, line, severity_to_use).stream()
           << it->first << " " << it->second;
@@ -143,15 +167,17 @@
 }
 
 const ProfilerEvent* Profiler::GetEvent(const std::string& event_name) const {
-  std::map<std::string, ProfilerEvent>::const_iterator it =
+  SharedScope scope(&lock_);
+  EventMap::const_iterator it =
       events_.find(event_name);
   return (it == events_.end()) ? NULL : &it->second;
 }
 
 bool Profiler::Clear() {
+  ExclusiveScope scope(&lock_);
   bool result = true;
   // Clear all events that aren't started.
-  std::map<std::string, ProfilerEvent>::iterator it = events_.begin();
+  EventMap::iterator it = events_.begin();
   while (it != events_.end()) {
     if (it->second.is_started()) {
       ++it;  // Can't clear started events.
diff --git a/talk/base/profiler.h b/talk/base/profiler.h
index 91ad6a5..90c5c72 100644
--- a/talk/base/profiler.h
+++ b/talk/base/profiler.h
@@ -37,7 +37,7 @@
 //   }
 // Another example:
 //   void StartAsyncProcess() {
-//     PROFILE_START("My event");
+//     PROFILE_START("My async event");
 //     DoSomethingAsyncAndThenCall(&Callback);
 //   }
 //   void Callback() {
@@ -54,6 +54,7 @@
 #include "talk/base/basictypes.h"
 #include "talk/base/common.h"
 #include "talk/base/logging.h"
+#include "talk/base/sharedexclusivelock.h"
 
 // Profiling could be switched via a build flag, but for now, it's always on.
 #define ENABLE_PROFILING
@@ -105,6 +106,7 @@
   ProfilerEvent();
   void Start();
   void Stop();
+  void Stop(uint64 stop_time);
   double standard_deviation() const;
   double total_time() const { return total_time_; }
   double mean() const { return mean_; }
@@ -142,7 +144,9 @@
  private:
   Profiler() {}
 
-  std::map<std::string, ProfilerEvent> events_;
+  typedef std::map<std::string, ProfilerEvent> EventMap;
+  EventMap events_;
+  mutable SharedExclusiveLock lock_;
 
   DISALLOW_COPY_AND_ASSIGN(Profiler);
 };