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