There's really no point to always take write lock, and sort the
store->providers every time. Instead, check if store->providers is
sorted, and if not, then upgrade to the write lock, otherwise use read
lock.
Signed-off-by: Nikola Pajkovsky <nikolap@openssl.org>
Reviewed-by: Saša Nedvědický <sashan@openssl.org>
Reviewed-by: Paul Dale <paul.dale@oracle.com>
Reviewed-by: Neil Horman <nhorman@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/28927)
#endif
tmpl.name = (char *)name;
- if (!CRYPTO_THREAD_write_lock(store->lock))
+ if (!CRYPTO_THREAD_read_lock(store->lock))
return NULL;
- sk_OSSL_PROVIDER_sort(store->providers);
+ if (!sk_OSSL_PROVIDER_is_sorted(store->providers)) {
+ CRYPTO_THREAD_unlock(store->lock);
+ if (!CRYPTO_THREAD_write_lock(store->lock))
+ return NULL;
+ if (!sk_OSSL_PROVIDER_is_sorted(store->providers))
+ sk_OSSL_PROVIDER_sort(store->providers);
+ }
if ((i = sk_OSSL_PROVIDER_find(store->providers, &tmpl)) != -1)
prov = sk_OSSL_PROVIDER_value(store->providers, i);
CRYPTO_THREAD_unlock(store->lock);