Commit 4fde7096 authored by Yedidya Feldblum's avatar Yedidya Feldblum Committed by Facebook Github Bot 3

Move RequestContext definitions to source files

Summary:
[Folly] Move `RequestContext` definitions to source files.

Keeping headers lightweight can help with build times.

Reviewed By: djwatson

Differential Revision: D3609809

fbshipit-source-id: 20608e3ff764c86c24355a328da1dcca9a08fce4
parent 6645b95d
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#pragma once #pragma once
#include <functional> #include <functional>
#include <thread>
#include <typeinfo> #include <typeinfo>
#include <folly/AtomicIntrusiveLinkedList.h> #include <folly/AtomicIntrusiveLinkedList.h>
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <boost/thread/barrier.hpp> #include <boost/thread/barrier.hpp>
#include <folly/Conv.h>
#include <folly/futures/Future.h> #include <folly/futures/Future.h>
#include <vector> #include <vector>
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <folly/io/async/HHWheelTimer.h> #include <folly/io/async/HHWheelTimer.h>
#include <folly/io/async/Request.h> #include <folly/io/async/Request.h>
#include <folly/Memory.h>
#include <folly/Optional.h> #include <folly/Optional.h>
#include <folly/ScopeGuard.h> #include <folly/ScopeGuard.h>
......
...@@ -18,10 +18,107 @@ ...@@ -18,10 +18,107 @@
* specific language governing permissions and limitations * specific language governing permissions and limitations
* under the License. * under the License.
*/ */
#include <folly/io/async/Request.h> #include <folly/io/async/Request.h>
#include <glog/logging.h>
#include <folly/SingletonThreadLocal.h>
namespace folly { namespace folly {
void RequestContext::setContextData(
const std::string& val,
std::unique_ptr<RequestData> data) {
folly::RWSpinLock::WriteHolder guard(lock);
if (data_.find(val) != data_.end()) {
LOG_FIRST_N(WARNING, 1)
<< "Called RequestContext::setContextData with data already set";
data_[val] = nullptr;
} else {
data_[val] = std::move(data);
}
}
bool RequestContext::setContextDataIfAbsent(
const std::string& val,
std::unique_ptr<RequestData> data) {
folly::RWSpinLock::UpgradedHolder guard(lock);
if (data_.find(val) != data_.end()) {
return false;
}
folly::RWSpinLock::WriteHolder writeGuard(std::move(guard));
data_[val] = std::move(data);
return true;
}
bool RequestContext::hasContextData(const std::string& val) const {
folly::RWSpinLock::ReadHolder guard(lock);
return data_.find(val) != data_.end();
}
RequestData* RequestContext::getContextData(const std::string& val) {
folly::RWSpinLock::ReadHolder guard(lock);
auto r = data_.find(val);
if (r == data_.end()) {
return nullptr;
} else {
return r->second.get();
}
}
const RequestData* RequestContext::getContextData(
const std::string& val) const {
folly::RWSpinLock::ReadHolder guard(lock);
auto r = data_.find(val);
if (r == data_.end()) {
return nullptr;
} else {
return r->second.get();
}
}
void RequestContext::onSet() {
folly::RWSpinLock::ReadHolder guard(lock);
for (auto const& ent : data_) {
if (RequestData* data = ent.second.get()) {
data->onSet();
}
}
}
void RequestContext::onUnset() {
folly::RWSpinLock::ReadHolder guard(lock);
for (auto const& ent : data_) {
if (RequestData* data = ent.second.get()) {
data->onUnset();
}
}
}
void RequestContext::clearContextData(const std::string& val) {
folly::RWSpinLock::WriteHolder guard(lock);
data_.erase(val);
}
std::shared_ptr<RequestContext> RequestContext::setContext(
std::shared_ptr<RequestContext> ctx) {
auto& prev = getStaticContext();
if (ctx != prev) {
using std::swap;
if (ctx) {
ctx->onSet();
}
if (prev) {
prev->onUnset();
}
swap(ctx, prev);
}
return ctx;
}
std::shared_ptr<RequestContext>& RequestContext::getStaticContext() { std::shared_ptr<RequestContext>& RequestContext::getStaticContext() {
using SingletonT = SingletonThreadLocal<std::shared_ptr<RequestContext>>; using SingletonT = SingletonThreadLocal<std::shared_ptr<RequestContext>>;
static SingletonT singleton; static SingletonT singleton;
......
...@@ -22,9 +22,7 @@ ...@@ -22,9 +22,7 @@
#include <map> #include <map>
#include <memory> #include <memory>
#include <glog/logging.h>
#include <folly/RWSpinLock.h> #include <folly/RWSpinLock.h>
#include <folly/SingletonThreadLocal.h>
namespace folly { namespace folly {
...@@ -34,8 +32,8 @@ namespace folly { ...@@ -34,8 +32,8 @@ namespace folly {
class RequestData { class RequestData {
public: public:
virtual ~RequestData() = default; virtual ~RequestData() = default;
virtual void onSet(){}; virtual void onSet() {}
virtual void onUnset(){}; virtual void onUnset() {}
}; };
class RequestContext; class RequestContext;
...@@ -66,69 +64,24 @@ class RequestContext { ...@@ -66,69 +64,24 @@ class RequestContext {
// This access is still performance sensitive, so please ask if you need help // This access is still performance sensitive, so please ask if you need help
// profiling any use of these functions. // profiling any use of these functions.
void setContextData( void setContextData(
const std::string& val, std::unique_ptr<RequestData> data) { const std::string& val,
folly::RWSpinLock::WriteHolder guard(lock); std::unique_ptr<RequestData> data);
if (data_.find(val) != data_.end()) {
LOG_FIRST_N(WARNING, 1) <<
"Called RequestContext::setContextData with data already set";
data_[val] = nullptr;
} else {
data_[val] = std::move(data);
}
}
// Unlike setContextData, this method does not panic if the key is already // Unlike setContextData, this method does not panic if the key is already
// present. Returns true iff the new value has been inserted. // present. Returns true iff the new value has been inserted.
bool setContextDataIfAbsent(const std::string& val, bool setContextDataIfAbsent(
std::unique_ptr<RequestData> data) { const std::string& val,
folly::RWSpinLock::UpgradedHolder guard(lock); std::unique_ptr<RequestData> data);
if (data_.find(val) != data_.end()) {
return false;
}
folly::RWSpinLock::WriteHolder writeGuard(std::move(guard));
data_[val] = std::move(data);
return true;
}
bool hasContextData(const std::string& val) { bool hasContextData(const std::string& val) const;
folly::RWSpinLock::ReadHolder guard(lock);
return data_.find(val) != data_.end();
}
RequestData* getContextData(const std::string& val) { RequestData* getContextData(const std::string& val);
folly::RWSpinLock::ReadHolder guard(lock); const RequestData* getContextData(const std::string& val) const;
auto r = data_.find(val);
if (r == data_.end()) {
return nullptr;
} else {
return r->second.get();
}
}
void onSet() {
folly::RWSpinLock::ReadHolder guard(lock);
for (auto const& ent : data_) {
if (RequestData* data = ent.second.get()) {
data->onSet();
}
}
}
void onUnset() { void onSet();
folly::RWSpinLock::ReadHolder guard(lock); void onUnset();
for (auto const& ent : data_) {
if (RequestData* data = ent.second.get()) {
data->onUnset();
}
}
}
void clearContextData(const std::string& val) { void clearContextData(const std::string& val);
folly::RWSpinLock::WriteHolder guard(lock);
data_.erase(val);
}
// The following API is used to pass the context through queues / threads. // The following API is used to pass the context through queues / threads.
// saveContext is called to get a shared_ptr to the context, and // saveContext is called to get a shared_ptr to the context, and
...@@ -140,21 +93,8 @@ class RequestContext { ...@@ -140,21 +93,8 @@ class RequestContext {
// //
// A shared_ptr is used, because many request may fan out across // A shared_ptr is used, because many request may fan out across
// multiple threads, or do post-send processing, etc. // multiple threads, or do post-send processing, etc.
static std::shared_ptr<RequestContext> static std::shared_ptr<RequestContext> setContext(
setContext(std::shared_ptr<RequestContext> ctx) { std::shared_ptr<RequestContext> ctx);
auto& prev = getStaticContext();
if (ctx != prev) {
using std::swap;
if (ctx) {
ctx->onSet();
}
if (prev) {
prev->onUnset();
}
swap(ctx, prev);
}
return ctx;
}
static std::shared_ptr<RequestContext> saveContext() { static std::shared_ptr<RequestContext> saveContext() {
return getStaticContext(); return getStaticContext();
...@@ -163,7 +103,7 @@ class RequestContext { ...@@ -163,7 +103,7 @@ class RequestContext {
private: private:
static std::shared_ptr<RequestContext>& getStaticContext(); static std::shared_ptr<RequestContext>& getStaticContext();
folly::RWSpinLock lock; mutable folly::RWSpinLock lock;
std::map<std::string, std::unique_ptr<RequestData>> data_; std::map<std::string, std::unique_ptr<RequestData>> data_;
}; };
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include <iostream> #include <iostream>
#include <list> #include <list>
#include <set> #include <set>
#include <thread>
#include <gmock/gmock.h> #include <gmock/gmock.h>
......
...@@ -30,11 +30,12 @@ ...@@ -30,11 +30,12 @@
#include <folly/portability/Sockets.h> #include <folly/portability/Sockets.h>
#include <folly/portability/Unistd.h> #include <folly/portability/Unistd.h>
#include <fcntl.h>
#include <gtest/gtest.h> #include <gtest/gtest.h>
#include <sys/types.h>
#include <condition_variable>
#include <iostream> #include <iostream>
#include <list> #include <list>
#include <fcntl.h>
#include <sys/types.h>
namespace folly { namespace folly {
......
...@@ -16,7 +16,9 @@ ...@@ -16,7 +16,9 @@
* specific language governing permissions and limitations * specific language governing permissions and limitations
* under the License. * under the License.
*/ */
#include <folly/Memory.h> #include <folly/Memory.h>
#include <folly/ScopeGuard.h>
#include <folly/io/async/AsyncTimeout.h> #include <folly/io/async/AsyncTimeout.h>
#include <folly/io/async/EventBase.h> #include <folly/io/async/EventBase.h>
......
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