This is an automated email from the ASF dual-hosted git repository.
westonpace pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git
The following commit(s) were added to refs/heads/main by this push:
new 5c61cbcf63 GH-34150: [C++] Fix error due to improper initialization of
conversion option defaults (#34209)
5c61cbcf63 is described below
commit 5c61cbcf63d06eb523a92e5eec0bca7e25b8f54b
Author: Weston Pace <[email protected]>
AuthorDate: Tue Feb 21 14:39:17 2023 -0800
GH-34150: [C++] Fix error due to improper initialization of conversion
option defaults (#34209)
* Closes: #34150
Authored-by: Weston Pace <[email protected]>
Signed-off-by: Weston Pace <[email protected]>
---
cpp/src/arrow/engine/substrait/options.cc | 65 +++++++++++++++++++------------
1 file changed, 40 insertions(+), 25 deletions(-)
diff --git a/cpp/src/arrow/engine/substrait/options.cc
b/cpp/src/arrow/engine/substrait/options.cc
index b4b10a021d..11715eadd9 100644
--- a/cpp/src/arrow/engine/substrait/options.cc
+++ b/cpp/src/arrow/engine/substrait/options.cc
@@ -170,45 +170,60 @@ class DefaultExtensionProvider : public
BaseExtensionProvider {
namespace {
-std::shared_ptr<ExtensionProvider> g_default_extension_provider =
- std::make_shared<DefaultExtensionProvider>();
+template <typename T>
+class ConfigurableSingleton {
+ public:
+ explicit ConfigurableSingleton(T new_value) : instance(std::move(new_value))
{}
-std::mutex g_default_extension_provider_mutex;
+ T Get() {
+ std::lock_guard lk(mutex);
+ return instance;
+ }
-} // namespace
+ void Set(T new_value) {
+ std::lock_guard lk(mutex);
+ instance = std::move(new_value);
+ }
-std::shared_ptr<ExtensionProvider> default_extension_provider() {
- std::unique_lock<std::mutex> lock(g_default_extension_provider_mutex);
- return g_default_extension_provider;
-}
+ private:
+ T instance;
+ std::mutex mutex;
+};
-void set_default_extension_provider(const std::shared_ptr<ExtensionProvider>&
provider) {
- std::unique_lock<std::mutex> lock(g_default_extension_provider_mutex);
- g_default_extension_provider = provider;
+ConfigurableSingleton<std::shared_ptr<ExtensionProvider>>&
+default_extension_provider_singleton() {
+ static ConfigurableSingleton<std::shared_ptr<ExtensionProvider>> singleton(
+ std::make_shared<DefaultExtensionProvider>());
+ return singleton;
}
-namespace {
+ConfigurableSingleton<NamedTapProvider>&
default_named_tap_provider_singleton() {
+ static ConfigurableSingleton<NamedTapProvider> singleton(
+ [](const std::string& tap_kind, std::vector<compute::Declaration::Input>
inputs,
+ const std::string& tap_name,
+ std::shared_ptr<Schema> tap_schema) -> Result<compute::Declaration> {
+ return Status::NotImplemented(
+ "Plan contained a NamedTapRel but no provider configured");
+ });
+ return singleton;
+}
-NamedTapProvider g_default_named_tap_provider =
- [](const std::string& tap_kind, std::vector<compute::Declaration::Input>
inputs,
- const std::string& tap_name,
- std::shared_ptr<Schema> tap_schema) -> Result<compute::Declaration> {
- return Status::NotImplemented(
- "Plan contained a NamedTapRel but no provider configured");
-};
+} // namespace
-std::mutex g_default_named_tap_provider_mutex;
+std::shared_ptr<ExtensionProvider> default_extension_provider() {
+ return default_extension_provider_singleton().Get();
+}
-} // namespace
+void set_default_extension_provider(const std::shared_ptr<ExtensionProvider>&
provider) {
+ default_extension_provider_singleton().Set(provider);
+}
NamedTapProvider default_named_tap_provider() {
- std::unique_lock<std::mutex> lock(g_default_named_tap_provider_mutex);
- return g_default_named_tap_provider;
+ return default_named_tap_provider_singleton().Get();
}
void set_default_named_tap_provider(NamedTapProvider provider) {
- std::unique_lock<std::mutex> lock(g_default_named_tap_provider_mutex);
- g_default_named_tap_provider = provider;
+ default_named_tap_provider_singleton().Set(std::move(provider));
}
} // namespace engine