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

Reply via email to