Commit c32f067b authored by Kyle Nekritz's avatar Kyle Nekritz Committed by Facebook Github Bot

Add LOCK_SHAREDMUTEX SSLLockType.

Summary: To take advantage of read locks.

Reviewed By: siyengar

Differential Revision: D5106090

fbshipit-source-id: a32afd698e9204196aa3d23f21a7d41803b2eb66
parent b3e1ea38
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <folly/Format.h> #include <folly/Format.h>
#include <folly/Memory.h> #include <folly/Memory.h>
#include <folly/Random.h> #include <folly/Random.h>
#include <folly/SharedMutex.h>
#include <folly/SpinLock.h> #include <folly/SpinLock.h>
#include <folly/ThreadId.h> #include <folly/ThreadId.h>
...@@ -722,20 +723,32 @@ struct SSLLock { ...@@ -722,20 +723,32 @@ struct SSLLock {
lockType(inLockType) { lockType(inLockType) {
} }
void lock() { void lock(bool read) {
if (lockType == SSLContext::LOCK_MUTEX) { if (lockType == SSLContext::LOCK_MUTEX) {
mutex.lock(); mutex.lock();
} else if (lockType == SSLContext::LOCK_SPINLOCK) { } else if (lockType == SSLContext::LOCK_SPINLOCK) {
spinLock.lock(); spinLock.lock();
} else if (lockType == SSLContext::LOCK_SHAREDMUTEX) {
if (read) {
sharedMutex.lock_shared();
} else {
sharedMutex.lock();
}
} }
// lockType == LOCK_NONE, no-op // lockType == LOCK_NONE, no-op
} }
void unlock() { void unlock(bool read) {
if (lockType == SSLContext::LOCK_MUTEX) { if (lockType == SSLContext::LOCK_MUTEX) {
mutex.unlock(); mutex.unlock();
} else if (lockType == SSLContext::LOCK_SPINLOCK) { } else if (lockType == SSLContext::LOCK_SPINLOCK) {
spinLock.unlock(); spinLock.unlock();
} else if (lockType == SSLContext::LOCK_SHAREDMUTEX) {
if (read) {
sharedMutex.unlock_shared();
} else {
sharedMutex.unlock();
}
} }
// lockType == LOCK_NONE, no-op // lockType == LOCK_NONE, no-op
} }
...@@ -743,6 +756,7 @@ struct SSLLock { ...@@ -743,6 +756,7 @@ struct SSLLock {
SSLContext::SSLLockType lockType; SSLContext::SSLLockType lockType;
folly::SpinLock spinLock{}; folly::SpinLock spinLock{};
std::mutex mutex; std::mutex mutex;
SharedMutex sharedMutex;
}; };
// Statics are unsafe in environments that call exit(). // Statics are unsafe in environments that call exit().
...@@ -763,9 +777,9 @@ static std::map<int, SSLContext::SSLLockType>& lockTypes() { ...@@ -763,9 +777,9 @@ static std::map<int, SSLContext::SSLLockType>& lockTypes() {
static void callbackLocking(int mode, int n, const char*, int) { static void callbackLocking(int mode, int n, const char*, int) {
if (mode & CRYPTO_LOCK) { if (mode & CRYPTO_LOCK) {
locks()[size_t(n)].lock(); locks()[size_t(n)].lock(mode & CRYPTO_READ);
} else { } else {
locks()[size_t(n)].unlock(); locks()[size_t(n)].unlock(mode & CRYPTO_READ);
} }
} }
......
...@@ -421,11 +421,7 @@ class SSLContext { ...@@ -421,11 +421,7 @@ class SSLContext {
return ctx_; return ctx_;
} }
enum SSLLockType { enum SSLLockType { LOCK_MUTEX, LOCK_SPINLOCK, LOCK_SHAREDMUTEX, LOCK_NONE };
LOCK_MUTEX,
LOCK_SPINLOCK,
LOCK_NONE
};
/** /**
* Set preferences for how to treat locks in OpenSSL. This must be * Set preferences for how to treat locks in OpenSSL. This must be
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment