diff --git a/Package.swift b/Package.swift index 71793c3b..4913d6bf 100644 --- a/Package.swift +++ b/Package.swift @@ -505,6 +505,7 @@ let package = Package( "internal/platform/cancellation_flag_test.cc", "internal/platform/bluetooth_adapter_test.cc", "internal/platform/byte_utils_test.cc", + "internal/platform/direct_executor_test.cc", // simulation "connections/implementation/offline_simulation_user.cc", "connections/implementation/simulation_user.cc", diff --git a/internal/platform/BUILD b/internal/platform/BUILD index 0cf557f5..2dcda5a9 100644 --- a/internal/platform/BUILD +++ b/internal/platform/BUILD @@ -309,6 +309,7 @@ cc_library( "condition_variable.h", "count_down_latch.h", "crypto.h", + "direct_executor.h", "file.h", "future.h", "lockable.h", @@ -411,6 +412,7 @@ cc_test( "count_down_latch_test.cc", "credential_storage_impl_test.cc", "crypto_test.cc", + "direct_executor_test.cc", "future_test.cc", "logging_test.cc", "multi_thread_executor_test.cc", diff --git a/internal/platform/direct_executor.h b/internal/platform/direct_executor.h new file mode 100644 index 00000000..a0406423 --- /dev/null +++ b/internal/platform/direct_executor.h @@ -0,0 +1,52 @@ +// Copyright 2022 Google LLC +// +// 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 +// +// https://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. +#ifndef THIRD_PARTY_NEARBY_INTERNAL_PLATFORM_DIRECT_EXECUTOR_H_ +#define THIRD_PARTY_NEARBY_INTERNAL_PLATFORM_DIRECT_EXECUTOR_H_ + +#include "absl/base/thread_annotations.h" +#include "internal/platform/implementation/executor.h" +#include "internal/platform/submittable_executor.h" + +namespace location { +namespace nearby { + +// An Executor that executes the tasks immediately on the thread calling +// `Execute()`. +// +// DirectExecutor is suitable for running fast, trivial runnables. +class ABSL_LOCKABLE DirectExecutor final : public api::Executor { + public: + DirectExecutor(const DirectExecutor &) = delete; + DirectExecutor &operator=(const DirectExecutor &) = delete; + static DirectExecutor &GetInstance() { + // DirectExecutor isn't technically trivially-destructible because it has a + // virtual destructor, but the class is final, the destructor is default + // (the base class is an interface) and there are no member fields. + // NOLINTNEXTLINE(google3-runtime-global-variables) + static DirectExecutor instance; + return instance; + } + + void Execute(Runnable &&runnable) override { runnable(); } + + void Shutdown() override {} + + private: + DirectExecutor() = default; +}; + +} // namespace nearby +} // namespace location + +#endif // THIRD_PARTY_NEARBY_INTERNAL_PLATFORM_DIRECT_EXECUTOR_H_ diff --git a/internal/platform/direct_executor_test.cc b/internal/platform/direct_executor_test.cc new file mode 100644 index 00000000..fa397307 --- /dev/null +++ b/internal/platform/direct_executor_test.cc @@ -0,0 +1,32 @@ + +// Copyright 2022 Google LLC +// +// 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 +// +// https://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 "internal/platform/direct_executor.h" + +#include "gtest/gtest.h" + +namespace location { +namespace nearby { + +TEST(DirectExecutorTest, ExecutesRunnable) { + int call_count = 0; + + DirectExecutor::GetInstance().Execute([&]() { call_count++; }); + + EXPECT_EQ(call_count, 1); +} + +} // namespace nearby +} // namespace location