diff options
author | Tink Team <tink-dev@google.com> | 2023-08-11 10:56:47 -0700 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2023-08-11 10:58:07 -0700 |
commit | da383f80954eab3ce21585e48842fbb0b0ccaeb5 (patch) | |
tree | 933a2a3d302edc6b213371ebd8231a25ea1b5957 | |
parent | f94909260bfdc9e5643f83bda19726afc8ae6be6 (diff) | |
download | tink-da383f80954eab3ce21585e48842fbb0b0ccaeb5.tar.gz |
Use reader/writer locks to reduce contention for key parsing and serialization.
PiperOrigin-RevId: 556014241
-rw-r--r-- | cc/internal/mutable_serialization_registry.cc | 12 | ||||
-rw-r--r-- | cc/internal/mutable_serialization_registry.h | 8 |
2 files changed, 11 insertions, 9 deletions
diff --git a/cc/internal/mutable_serialization_registry.cc b/cc/internal/mutable_serialization_registry.cc index 250d026a7..88277a368 100644 --- a/cc/internal/mutable_serialization_registry.cc +++ b/cc/internal/mutable_serialization_registry.cc @@ -48,7 +48,7 @@ MutableSerializationRegistry& MutableSerializationRegistry::GlobalInstance() { util::Status MutableSerializationRegistry::RegisterParametersParser( ParametersParser* parser) { - absl::MutexLock lock(®istry_mutex_); + absl::WriterMutexLock lock(®istry_mutex_); SerializationRegistry::Builder builder(registry_); util::Status status = builder.RegisterParametersParser(parser); if (!status.ok()) return status; @@ -58,7 +58,7 @@ util::Status MutableSerializationRegistry::RegisterParametersParser( util::Status MutableSerializationRegistry::RegisterParametersSerializer( ParametersSerializer* serializer) { - absl::MutexLock lock(®istry_mutex_); + absl::WriterMutexLock lock(®istry_mutex_); SerializationRegistry::Builder builder(registry_); util::Status status = builder.RegisterParametersSerializer(serializer); if (!status.ok()) return status; @@ -68,7 +68,7 @@ util::Status MutableSerializationRegistry::RegisterParametersSerializer( util::Status MutableSerializationRegistry::RegisterKeyParser( KeyParser* parser) { - absl::MutexLock lock(®istry_mutex_); + absl::WriterMutexLock lock(®istry_mutex_); SerializationRegistry::Builder builder(registry_); util::Status status = builder.RegisterKeyParser(parser); if (!status.ok()) return status; @@ -78,7 +78,7 @@ util::Status MutableSerializationRegistry::RegisterKeyParser( util::Status MutableSerializationRegistry::RegisterKeySerializer( KeySerializer* serializer) { - absl::MutexLock lock(®istry_mutex_); + absl::WriterMutexLock lock(®istry_mutex_); SerializationRegistry::Builder builder(registry_); util::Status status = builder.RegisterKeySerializer(serializer); if (!status.ok()) return status; @@ -89,14 +89,14 @@ util::Status MutableSerializationRegistry::RegisterKeySerializer( util::StatusOr<std::unique_ptr<Parameters>> MutableSerializationRegistry::ParseParameters( const Serialization& serialization) { - absl::MutexLock lock(®istry_mutex_); + absl::ReaderMutexLock lock(®istry_mutex_); return registry_.ParseParameters(serialization); } util::StatusOr<std::unique_ptr<Key>> MutableSerializationRegistry::ParseKey( const Serialization& serialization, absl::optional<SecretKeyAccessToken> token) { - absl::MutexLock lock(®istry_mutex_); + absl::ReaderMutexLock lock(®istry_mutex_); return registry_.ParseKey(serialization, token); } diff --git a/cc/internal/mutable_serialization_registry.h b/cc/internal/mutable_serialization_registry.h index a9914dda5..ac235bb59 100644 --- a/cc/internal/mutable_serialization_registry.h +++ b/cc/internal/mutable_serialization_registry.h @@ -75,7 +75,7 @@ class MutableSerializationRegistry { template <typename SerializationT> util::StatusOr<std::unique_ptr<Serialization>> SerializeParameters( const Parameters& parameters) ABSL_LOCKS_EXCLUDED(registry_mutex_) { - absl::MutexLock lock(®istry_mutex_); + absl::ReaderMutexLock lock(®istry_mutex_); return registry_.SerializeParameters<SerializationT>(parameters); } @@ -95,18 +95,20 @@ class MutableSerializationRegistry { util::StatusOr<std::unique_ptr<Serialization>> SerializeKey( const Key& key, absl::optional<SecretKeyAccessToken> token) ABSL_LOCKS_EXCLUDED(registry_mutex_) { - absl::MutexLock lock(®istry_mutex_); + absl::ReaderMutexLock lock(®istry_mutex_); return registry_.SerializeKey<SerializationT>(key, token); } // Resets to a new empty registry. void Reset() ABSL_LOCKS_EXCLUDED(registry_mutex_) { - absl::MutexLock lock(®istry_mutex_); + absl::WriterMutexLock lock(®istry_mutex_); registry_ = SerializationRegistry(); } private: mutable absl::Mutex registry_mutex_; + // Simple wrappers around const methods of `registry_` may safely acquire a + // shared (reader) lock. Other calls require an exclusive (writer) lock. SerializationRegistry registry_ ABSL_GUARDED_BY(registry_mutex_); }; |