X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=blobdiff_plain;f=folly%2Fio%2Fasync%2FSSLContext.cpp;h=b38ea2bb7b2ef1435adc6ff79676308d771ee80b;hp=353ae298e5dc464ef6304c070f4d3cf232ed738b;hb=c32f067bded198c6e907ee31ed76d83baa856a8e;hpb=b3e1ea389e31e7c12d6ec38ed6c47ef4c1d1e70e diff --git a/folly/io/async/SSLContext.cpp b/folly/io/async/SSLContext.cpp index 353ae298..b38ea2bb 100644 --- a/folly/io/async/SSLContext.cpp +++ b/folly/io/async/SSLContext.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -722,20 +723,32 @@ struct SSLLock { lockType(inLockType) { } - void lock() { + void lock(bool read) { if (lockType == SSLContext::LOCK_MUTEX) { mutex.lock(); } else if (lockType == SSLContext::LOCK_SPINLOCK) { spinLock.lock(); + } else if (lockType == SSLContext::LOCK_SHAREDMUTEX) { + if (read) { + sharedMutex.lock_shared(); + } else { + sharedMutex.lock(); + } } // lockType == LOCK_NONE, no-op } - void unlock() { + void unlock(bool read) { if (lockType == SSLContext::LOCK_MUTEX) { mutex.unlock(); } else if (lockType == SSLContext::LOCK_SPINLOCK) { spinLock.unlock(); + } else if (lockType == SSLContext::LOCK_SHAREDMUTEX) { + if (read) { + sharedMutex.unlock_shared(); + } else { + sharedMutex.unlock(); + } } // lockType == LOCK_NONE, no-op } @@ -743,6 +756,7 @@ struct SSLLock { SSLContext::SSLLockType lockType; folly::SpinLock spinLock{}; std::mutex mutex; + SharedMutex sharedMutex; }; // Statics are unsafe in environments that call exit(). @@ -763,9 +777,9 @@ static std::map& lockTypes() { static void callbackLocking(int mode, int n, const char*, int) { if (mode & CRYPTO_LOCK) { - locks()[size_t(n)].lock(); + locks()[size_t(n)].lock(mode & CRYPTO_READ); } else { - locks()[size_t(n)].unlock(); + locks()[size_t(n)].unlock(mode & CRYPTO_READ); } }