From: James Sedgwick Date: Wed, 18 Oct 2017 23:32:35 +0000 (-0700) Subject: move futures/QueuedImmediateExecutor to executors/QueuedImmediateExecutor X-Git-Tag: v2017.10.23.00~22 X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=commitdiff_plain;h=fe34da59aecff8fb1bfca13361d02026cfa3b17e move futures/QueuedImmediateExecutor to executors/QueuedImmediateExecutor Summary: as above Reviewed By: yfeldblum Differential Revision: D6076779 fbshipit-source-id: 4c223ab9fce3be8544f6f807781c3d0a99b61dad --- diff --git a/folly/Makefile.am b/folly/Makefile.am index b9adb7f6..ce29ac05 100644 --- a/folly/Makefile.am +++ b/folly/Makefile.am @@ -106,6 +106,7 @@ nobase_follyinclude_HEADERS = \ executors/ThreadPoolExecutor.h \ executors/ThreadedExecutor.h \ executors/UnboundedBlockingQueue.h \ + executors/QueuedImmediateExecutor.h \ Demangle.h \ DiscriminatedPtr.h \ DynamicConverter.h \ @@ -218,7 +219,6 @@ nobase_follyinclude_HEADERS = \ futures/ManualExecutor.h \ futures/Promise-inl.h \ futures/Promise.h \ - futures/QueuedImmediateExecutor.h \ futures/SharedPromise.h \ futures/SharedPromise-inl.h \ futures/ThreadWheelTimekeeper.h \ @@ -505,7 +505,6 @@ libfolly_la_SOURCES = \ futures/Future.cpp \ futures/FutureException.cpp \ futures/ManualExecutor.cpp \ - futures/QueuedImmediateExecutor.cpp \ futures/ThreadWheelTimekeeper.cpp \ futures/test/TestExecutor.cpp \ executors/CPUThreadPoolExecutor.cpp \ @@ -515,6 +514,7 @@ libfolly_la_SOURCES = \ executors/SerialExecutor.cpp \ executors/ThreadPoolExecutor.cpp \ executors/ThreadedExecutor.cpp \ + executors/QueuedImmediateExecutor.cpp \ experimental/hazptr/hazptr.cpp \ experimental/hazptr/memory_resource.cpp \ GroupVarint.cpp \ diff --git a/folly/executors/QueuedImmediateExecutor.cpp b/folly/executors/QueuedImmediateExecutor.cpp new file mode 100644 index 00000000..1dbdb5c1 --- /dev/null +++ b/folly/executors/QueuedImmediateExecutor.cpp @@ -0,0 +1,37 @@ +/* + * Copyright 2017 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. + */ + +#include +#include +#include + +namespace folly { + +void QueuedImmediateExecutor::addStatic(Func callback) { + static folly::ThreadLocal> q_; + + if (q_->empty()) { + q_->push(std::move(callback)); + while (!q_->empty()) { + q_->front()(); + q_->pop(); + } + } else { + q_->push(std::move(callback)); + } +} + +} // namespace diff --git a/folly/executors/QueuedImmediateExecutor.h b/folly/executors/QueuedImmediateExecutor.h new file mode 100644 index 00000000..b98047a0 --- /dev/null +++ b/folly/executors/QueuedImmediateExecutor.h @@ -0,0 +1,39 @@ +/* + * Copyright 2017 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 + +namespace folly { + +/** + * Runs inline like InlineExecutor, but with a queue so that any tasks added + * to this executor by one of its own callbacks will be queued instead of + * executed inline (nested). This is usually better behavior than Inline. + */ +class QueuedImmediateExecutor : public Executor { + public: + /// There's really only one queue per thread, no matter how many + /// QueuedImmediateExecutor objects you may have. + static void addStatic(Func); + + void add(Func func) override { + addStatic(std::move(func)); + } +}; + +} // namespace folly diff --git a/folly/futures/QueuedImmediateExecutor.cpp b/folly/futures/QueuedImmediateExecutor.cpp deleted file mode 100644 index 204d424b..00000000 --- a/folly/futures/QueuedImmediateExecutor.cpp +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2017 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. - */ - -#include -#include -#include - -namespace folly { - -void QueuedImmediateExecutor::addStatic(Func callback) { - static folly::ThreadLocal> q_; - - if (q_->empty()) { - q_->push(std::move(callback)); - while (!q_->empty()) { - q_->front()(); - q_->pop(); - } - } else { - q_->push(std::move(callback)); - } -} - -} // namespace diff --git a/folly/futures/QueuedImmediateExecutor.h b/folly/futures/QueuedImmediateExecutor.h deleted file mode 100644 index b98047a0..00000000 --- a/folly/futures/QueuedImmediateExecutor.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2017 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 - -namespace folly { - -/** - * Runs inline like InlineExecutor, but with a queue so that any tasks added - * to this executor by one of its own callbacks will be queued instead of - * executed inline (nested). This is usually better behavior than Inline. - */ -class QueuedImmediateExecutor : public Executor { - public: - /// There's really only one queue per thread, no matter how many - /// QueuedImmediateExecutor objects you may have. - static void addStatic(Func); - - void add(Func func) override { - addStatic(std::move(func)); - } -}; - -} // namespace folly diff --git a/folly/futures/test/ExecutorTest.cpp b/folly/futures/test/ExecutorTest.cpp index 88679ecb..2c201d0a 100644 --- a/folly/futures/test/ExecutorTest.cpp +++ b/folly/futures/test/ExecutorTest.cpp @@ -15,12 +15,15 @@ */ #include +#include #include #include #include -#include #include +// TODO(jsedgwick) move this test to executors/test/ once the tested executors +// have all moved + using namespace folly; TEST(ManualExecutor, runIsStable) {