From: Kyle Nekritz Date: Mon, 22 May 2017 21:36:33 +0000 (-0700) Subject: Add LOCK_SHAREDMUTEX SSLLockType. X-Git-Tag: v2017.05.29.00~19 X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=commitdiff_plain;h=c32f067bded198c6e907ee31ed76d83baa856a8e Add LOCK_SHAREDMUTEX SSLLockType. Summary: To take advantage of read locks. Reviewed By: siyengar Differential Revision: D5106090 fbshipit-source-id: a32afd698e9204196aa3d23f21a7d41803b2eb66 --- 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); } } diff --git a/folly/io/async/SSLContext.h b/folly/io/async/SSLContext.h index 7b9d3b89..548a84bd 100644 --- a/folly/io/async/SSLContext.h +++ b/folly/io/async/SSLContext.h @@ -421,11 +421,7 @@ class SSLContext { return ctx_; } - enum SSLLockType { - LOCK_MUTEX, - LOCK_SPINLOCK, - LOCK_NONE - }; + enum SSLLockType { LOCK_MUTEX, LOCK_SPINLOCK, LOCK_SHAREDMUTEX, LOCK_NONE }; /** * Set preferences for how to treat locks in OpenSSL. This must be