Index: base/nss_util.cc |
diff --git a/base/nss_util.cc b/base/nss_util.cc |
index 7043b8dc192ff9804f2dc8a66df0bc5139d80dd6..56368f5a22bfa1c534da952f57921442360a5f54 100644 |
--- a/base/nss_util.cc |
+++ b/base/nss_util.cc |
@@ -18,6 +18,11 @@ |
#include "base/singleton.h" |
#include "base/string_util.h" |
+#if defined(USE_NSS) |
+#include "base/lock.h" |
+#include "base/scoped_ptr.h" |
+#endif // defined(USE_NSS) |
wtc
2010/06/21 22:40:53
Two spaces before the comment.
davidben
2010/06/22 02:54:56
Done.
|
+ |
// On some platforms, we use NSS for SSL only -- we don't use NSS for crypto |
// or certificate verification, and we don't use the NSS certificate and key |
// databases. |
@@ -168,6 +173,11 @@ class NSSInitSingleton { |
PK11_FreeSlot(slot); |
} |
+ // TODO(davidben): When https://bugzilla.mozilla.org/show_bug.cgi?id=564011 |
+ // is fixed, we will no longer need the lock. We should detect this and not |
+ // initialize a Lock here. |
+ write_lock_.reset(new Lock()); |
+ |
root_ = InitDefaultRootCerts(); |
#endif // defined(USE_NSS_FOR_SSL_ONLY) |
} |
@@ -219,10 +229,19 @@ class NSSInitSingleton { |
return PK11_GetInternalKeySlot(); |
} |
+#if defined(USE_NSS) |
+ Lock* write_lock() { |
+ return write_lock_.get(); |
+ } |
+#endif // defined(USE_NSS) |
+ |
private: |
PK11SlotInfo* real_db_slot_; // Overrides internal key slot if non-NULL. |
SECMODModule *root_; |
bool chromeos_user_logged_in_; |
+#if defined(USE_NSS) |
+ scoped_ptr<Lock> write_lock_; |
+#endif // defined(USE_NSS) |
}; |
} // namespace |
@@ -237,6 +256,25 @@ void EnsureNSSInit() { |
Singleton<NSSInitSingleton>::get(); |
} |
+#if defined(USE_NSS) |
+Lock* GetNSSWriteLock() { |
+ return Singleton<NSSInitSingleton>::get()->write_lock(); |
+} |
+ |
+AutoNSSWriteLock::AutoNSSWriteLock() : lock_(GetNSSWriteLock()) { |
+ // May be NULL if the lock is not needed in our version of NSS. |
+ if (lock_) |
+ lock_->Acquire(); |
+} |
+ |
+AutoNSSWriteLock::~AutoNSSWriteLock() { |
+ if (lock_) { |
+ lock_->AssertAcquired(); |
+ lock_->Release(); |
+ } |
+} |
+#endif // defined(USE_NSS) |
+ |
#if defined(OS_CHROMEOS) |
void OpenPersistentNSSDB() { |
Singleton<NSSInitSingleton>::get()->OpenPersistentNSSDB(); |