summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsatorux@chromium.org <satorux@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-24 05:27:02 +0000
committersatorux@chromium.org <satorux@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-24 05:27:02 +0000
commit0cd6c7f64f4c531a3f8f778a1acd75b94fc0f1fe (patch)
treee1272ba8a20fd6d5d5b898b64f7aeb86fa7d0817
parented67d0e65ee4b453f69ee14d95e813365555afb2 (diff)
downloadchromium_src-0cd6c7f64f4c531a3f8f778a1acd75b94fc0f1fe.zip
chromium_src-0cd6c7f64f4c531a3f8f778a1acd75b94fc0f1fe.tar.gz
chromium_src-0cd6c7f64f4c531a3f8f778a1acd75b94fc0f1fe.tar.bz2
google_apis: Make EventLogger thread-safe
Along the way, remove the parameter from the constructor so that the class can be created using base::LazyInstance. BUG=233448 TEST=none Review URL: https://codereview.chromium.org/14046044 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@196047 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/chromeos/drive/drive_prefetcher_unittest.cc3
-rw-r--r--chrome/browser/chromeos/drive/drive_system_service.cc4
-rw-r--r--chrome/browser/google_apis/event_logger.cc19
-rw-r--r--chrome/browser/google_apis/event_logger.h24
-rw-r--r--chrome/browser/google_apis/event_logger_unittest.cc35
-rw-r--r--chrome/browser/ui/webui/chromeos/drive_internals_ui.cc4
6 files changed, 58 insertions, 31 deletions
diff --git a/chrome/browser/chromeos/drive/drive_prefetcher_unittest.cc b/chrome/browser/chromeos/drive/drive_prefetcher_unittest.cc
index a7911cb..c0e4ad3 100644
--- a/chrome/browser/chromeos/drive/drive_prefetcher_unittest.cc
+++ b/chrome/browser/chromeos/drive/drive_prefetcher_unittest.cc
@@ -137,8 +137,7 @@ const char* kAllRegularFiles[] = {
class DrivePrefetcherTest : public testing::Test {
public:
DrivePrefetcherTest()
- : dummy_event_logger_(0),
- ui_thread_(content::BrowserThread::UI, &message_loop_) {}
+ : ui_thread_(content::BrowserThread::UI, &message_loop_) {}
virtual void SetUp() OVERRIDE {
mock_file_system_.reset(new StrictMock<MockDriveFileSystem>);
diff --git a/chrome/browser/chromeos/drive/drive_system_service.cc b/chrome/browser/chromeos/drive/drive_system_service.cc
index 46dbf9c..3f06d0d 100644
--- a/chrome/browser/chromeos/drive/drive_system_service.cc
+++ b/chrome/browser/chromeos/drive/drive_system_service.cc
@@ -47,8 +47,6 @@ using content::BrowserThread;
namespace drive {
namespace {
-static const size_t kEventLogHistorySize = 100;
-
// The sync invalidation object ID for Google Drive.
const char kDriveInvalidationObjectId[] = "CHANGELOG";
@@ -113,7 +111,7 @@ DriveSystemService::DriveSystemService(
blocking_task_runner_ = blocking_pool->GetSequencedTaskRunner(
blocking_pool->GetSequenceToken());
- event_logger_.reset(new google_apis::EventLogger(kEventLogHistorySize));
+ event_logger_.reset(new google_apis::EventLogger);
if (test_drive_service) {
drive_service_.reset(test_drive_service);
} else if (google_apis::util::IsDriveV2ApiEnabled()) {
diff --git a/chrome/browser/google_apis/event_logger.cc b/chrome/browser/google_apis/event_logger.cc
index d00801f..c90a710 100644
--- a/chrome/browser/google_apis/event_logger.cc
+++ b/chrome/browser/google_apis/event_logger.cc
@@ -14,8 +14,8 @@ EventLogger::Event::Event(int id, const std::string& what)
what(what) {
}
-EventLogger::EventLogger(size_t history_size)
- : history_size_(history_size),
+EventLogger::EventLogger()
+ : history_size_(kDefaultHistorySize),
next_event_id_(0) {
}
@@ -30,10 +30,25 @@ void EventLogger::Log(const char* format, ...) {
base::StringAppendV(&what, format, args);
va_end(args);
+ base::AutoLock auto_lock(lock_);
history_.push_back(Event(next_event_id_, what));
++next_event_id_;
if (history_.size() > history_size_)
history_.pop_front();
}
+void EventLogger::SetHistorySize(size_t history_size) {
+ base::AutoLock auto_lock(lock_);
+ history_.clear();
+ history_size_ = history_size;
+}
+
+std::vector<EventLogger::Event> EventLogger::GetHistory() {
+ base::AutoLock auto_lock(lock_);
+ std::vector<Event> output;
+ output.assign(history_.begin(), history_.end());
+ return output;
+}
+
+
} // namespace google_apis
diff --git a/chrome/browser/google_apis/event_logger.h b/chrome/browser/google_apis/event_logger.h
index 1826ecd..251fddf 100644
--- a/chrome/browser/google_apis/event_logger.h
+++ b/chrome/browser/google_apis/event_logger.h
@@ -8,13 +8,18 @@
#include <stdarg.h> // va_list
#include <deque>
#include <string>
+#include <vector>
#include "base/basictypes.h"
#include "base/compiler_specific.h"
+#include "base/synchronization/lock.h"
#include "base/time.h"
namespace google_apis {
+// The default history size used by EventLogger.
+const int kDefaultHistorySize = 100;
+
// EventLogger is used to collect and expose text messages for diagnosing
// behaviors of Google APIs stuff. For instance, the collected messages are
// exposed to chrome:drive-internals.
@@ -28,22 +33,29 @@ class EventLogger {
std::string what; // What happened.
};
- // Creates an event logger that keeps the latest |history_size| events.
- explicit EventLogger(size_t history_size);
+ // Creates an event logger that keeps the latest kDefaultHistorySize events.
+ EventLogger();
~EventLogger();
// Logs a message using printf format.
+ // Can be called from any thread as long as the object is alive.
// Note that PRINTF_FORMAT should be (2, 3) instead of (1, 2) as this is a
// C++ member function.
void Log(const char* format, ...) PRINTF_FORMAT(2, 3);
+ // Sets the history size. The existing history is cleared.
+ // Can be called from any thread as long as the object is alive.
+ void SetHistorySize(size_t history_size);
+
// Gets the list of latest events (the oldest event comes first).
- const std::deque<Event>& history() const { return history_; }
+ // Can be called from any thread as long as the object is alive.
+ std::vector<Event> GetHistory();
private:
- std::deque<Event> history_;
- const size_t history_size_;
- int next_event_id_;
+ std::deque<Event> history_; // guarded by lock_.
+ size_t history_size_; // guarded by lock_.
+ int next_event_id_; // guarded by lock_.
+ base::Lock lock_;
DISALLOW_COPY_AND_ASSIGN(EventLogger);
};
diff --git a/chrome/browser/google_apis/event_logger_unittest.cc b/chrome/browser/google_apis/event_logger_unittest.cc
index 2fa5d74..e4c5308 100644
--- a/chrome/browser/google_apis/event_logger_unittest.cc
+++ b/chrome/browser/google_apis/event_logger_unittest.cc
@@ -9,32 +9,35 @@
namespace google_apis {
TEST(EventLoggerTest, BasicLogging) {
- EventLogger logger(3); // At most 3 events are kept.
- EXPECT_EQ(0U, logger.history().size());
+ EventLogger logger;
+ logger.SetHistorySize(3); // At most 3 events are kept.
+ EXPECT_EQ(0U, logger.GetHistory().size());
logger.Log("first");
logger.Log("%dnd", 2);
logger.Log("third");
// Events are recorded in the chronological order with sequential IDs.
- ASSERT_EQ(3U, logger.history().size());
- EXPECT_EQ(0, logger.history()[0].id);
- EXPECT_EQ("first", logger.history()[0].what);
- EXPECT_EQ(1, logger.history()[1].id);
- EXPECT_EQ("2nd", logger.history()[1].what);
- EXPECT_EQ(2, logger.history()[2].id);
- EXPECT_EQ("third", logger.history()[2].what);
+ std::vector<EventLogger::Event> history = logger.GetHistory();
+ ASSERT_EQ(3U, history.size());
+ EXPECT_EQ(0, history[0].id);
+ EXPECT_EQ("first", history[0].what);
+ EXPECT_EQ(1, history[1].id);
+ EXPECT_EQ("2nd", history[1].what);
+ EXPECT_EQ(2, history[2].id);
+ EXPECT_EQ("third", history[2].what);
logger.Log("fourth");
// It does not log events beyond the specified.
- ASSERT_EQ(3U, logger.history().size());
+ history = logger.GetHistory();
+ ASSERT_EQ(3U, history.size());
// The oldest events is pushed out.
- EXPECT_EQ(1, logger.history()[0].id);
- EXPECT_EQ("2nd", logger.history()[0].what);
- EXPECT_EQ(2, logger.history()[1].id);
- EXPECT_EQ("third", logger.history()[1].what);
- EXPECT_EQ(3, logger.history()[2].id);
- EXPECT_EQ("fourth", logger.history()[2].what);
+ EXPECT_EQ(1, history[0].id);
+ EXPECT_EQ("2nd", history[0].what);
+ EXPECT_EQ(2, history[1].id);
+ EXPECT_EQ("third", history[1].what);
+ EXPECT_EQ(3, history[2].id);
+ EXPECT_EQ("fourth", history[2].what);
}
} // namespace google_apis
diff --git a/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc b/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc
index 6b4b10b..ca8f920 100644
--- a/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc
@@ -631,8 +631,8 @@ void DriveInternalsWebUIHandler::UpdateCacheContentsSection(
void DriveInternalsWebUIHandler::UpdateEventLogSection(
google_apis::EventLogger* event_logger) {
- const std::deque<google_apis::EventLogger::Event>& log =
- event_logger->history();
+ const std::vector<google_apis::EventLogger::Event> log =
+ event_logger->GetHistory();
base::ListValue list;
for (size_t i = 0; i < log.size(); ++i) {