// Create a unique requext context for this request.
// It will be passed between queues / threads (where implemented),
// so it should be valid for the lifetime of the request.
- static bool create() {
+ static void create() {
if(!FLAGS_enable_request_context) {
- return false;
+ return;
}
- bool prev = getStaticContext().get() != nullptr;
- getStaticContext().reset(new std::shared_ptr<RequestContext>(
- std::make_shared<RequestContext>()));
- return prev;
+ getStaticContext() = std::make_shared<RequestContext>();
}
// Get the current context.
static RequestContext* get() {
- if (!FLAGS_enable_request_context ||
- getStaticContext().get() == nullptr) {
+ if (getStaticContext() == nullptr) {
if (defaultContext == nullptr) {
defaultContext = new RequestContext;
}
return defaultContext;
}
- return getStaticContext().get()->get();
+ return getStaticContext().get();
}
// The following API may be used to set per-request data in a thread-safe way.
setContext(std::shared_ptr<RequestContext> ctx) {
if (FLAGS_enable_request_context) {
std::shared_ptr<RequestContext> old_ctx;
- if (getStaticContext().get()) {
- old_ctx = *getStaticContext().get();
- }
- if (ctx == nullptr) {
- getStaticContext().reset(nullptr);
- } else {
- getStaticContext().reset(new std::shared_ptr<RequestContext>(ctx));
+ if (getStaticContext()) {
+ old_ctx = getStaticContext();
}
+ getStaticContext() = ctx;
return old_ctx;
}
- return std::shared_ptr<RequestContext>();
+ return nullptr;
}
static std::shared_ptr<RequestContext> saveContext() {
- if (!FLAGS_enable_request_context) {
- return std::shared_ptr<RequestContext>();
- }
- if (getStaticContext().get() == nullptr) {
- return std::shared_ptr<RequestContext>();
- } else {
- return *getStaticContext().get();
- }
+ return getStaticContext();
}
// Used to solve static destruction ordering issue. Any static object
// See below link for more details.
// http://stackoverflow.com/questions/335369/
// finding-c-static-initialization-order-problems#335746
- static folly::ThreadLocalPtr<std::shared_ptr<RequestContext>>&
+ static std::shared_ptr<RequestContext>&
getStaticContext() {
- static folly::ThreadLocalPtr<std::shared_ptr<RequestContext> > context;
- return context;
+ static folly::ThreadLocal<std::shared_ptr<RequestContext> > context;
+ return *context;
}
private:
std::map<std::string, std::unique_ptr<RequestData>> data_;
};
-/**
- * Set the request context for a specific scope. For example,
- * if you ran a part of a request in another thread you could
- * use RequestContextGuard to copy apply the request context
- * inside the other therad.
- */
-class RequestContextGuard {
- public:
- explicit RequestContextGuard(std::shared_ptr<RequestContext> ctx) {
- oldctx_ = RequestContext::setContext(std::move(ctx));
- }
-
- ~RequestContextGuard() {
- RequestContext::setContext(std::move(oldctx_));
- }
-
- private:
- std::shared_ptr<RequestContext> oldctx_;
-};
-
}