Fix SQLitePersistentCookieStore's getDbThread() to be threadsafe
This is an updated version of https://android-git.corp.google.com/g/#/c/141899,
which was rolled out, with the lock now static and moved to file scope to match
Chromium style.
Bug: 5244039
Change-Id: Ic6a6e949b2adc8cf433e6468c1f84ed449af09bc
diff --git a/chrome/browser/net/sqlite_persistent_cookie_store.cc b/chrome/browser/net/sqlite_persistent_cookie_store.cc
index af9e753..57f646e 100644
--- a/chrome/browser/net/sqlite_persistent_cookie_store.cc
+++ b/chrome/browser/net/sqlite_persistent_cookie_store.cc
@@ -12,6 +12,9 @@
#include "base/basictypes.h"
#include "base/file_path.h"
#include "base/file_util.h"
+#ifdef ANDROID
+#include "base/lazy_instance.h"
+#endif
#include "base/logging.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
@@ -26,26 +29,37 @@
#include "googleurl/src/gurl.h"
#ifdef ANDROID
-base::Thread* getDbThread()
-{
- static base::Thread* dbThread = NULL;
- if (dbThread && dbThread->IsRunning())
- return dbThread;
+namespace {
- if (!dbThread)
- dbThread = new base::Thread("db");
+// This class is used by CookieMonster, which is threadsafe, so this class must
+// be threadsafe too.
+base::LazyInstance<base::Lock> db_thread_lock(base::LINKER_INITIALIZED);
- if (!dbThread)
+base::Thread* getDbThread() {
+ base::AutoLock lock(*db_thread_lock.Pointer());
+
+ // FIXME: We should probably be using LazyInstance here.
+ static base::Thread* db_thread = NULL;
+
+ if (db_thread && db_thread->IsRunning())
+ return db_thread;
+
+ if (!db_thread)
+ db_thread = new base::Thread("db");
+
+ if (!db_thread)
return NULL;
base::Thread::Options options;
options.message_loop_type = MessageLoop::TYPE_DEFAULT;
- if (!dbThread->StartWithOptions(options)) {
- delete dbThread;
- dbThread = NULL;
+ if (!db_thread->StartWithOptions(options)) {
+ delete db_thread;
+ db_thread = NULL;
}
- return dbThread;
+ return db_thread;
}
+
+} // namespace
#endif
using base::Time;