/* * Copyright 2018-present Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include #include #include namespace folly { class InitThreadFactory : public ThreadFactory { public: explicit InitThreadFactory( std::shared_ptr threadFactory, Func&& threadInitializer, Func&& threadFinializer = [] {}) : threadFactory_(std::move(threadFactory)), threadInitFini_(std::make_shared( std::move(threadInitializer), std::move(threadFinializer))) {} std::thread newThread(Func&& func) override { return threadFactory_->newThread( [func = std::move(func), threadInitFini = threadInitFini_]() mutable { threadInitFini->initializer(); SCOPE_EXIT { threadInitFini->finalizer(); }; func(); }); } private: std::shared_ptr threadFactory_; struct ThreadInitFini { ThreadInitFini(Func&& init, Func&& fini) : initializer(std::move(init)), finalizer(std::move(fini)) {} Func initializer; Func finalizer; }; std::shared_ptr threadInitFini_; }; } // namespace folly