diff --git a/Makefile.am b/Makefile.am
index d2b7989..0c26a6f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -25,6 +25,7 @@
 	fan_speed.cpp \
 	fan_pwm.cpp \
 	timer.cpp \
-	hwmon.cpp
+	hwmon.cpp \
+	hwmonio.cpp
 
 SUBDIRS = . msl test tools
diff --git a/fan_pwm.cpp b/fan_pwm.cpp
index 04cb1b5..cf89552 100644
--- a/fan_pwm.cpp
+++ b/fan_pwm.cpp
@@ -1,6 +1,7 @@
 #include "env.hpp"
 #include "fan_pwm.hpp"
 #include "hwmon.hpp"
+#include "hwmonio.hpp"
 #include "sensorset.hpp"
 #include "sysfs.hpp"
 
@@ -30,8 +31,8 @@
                 type,
                 id,
                 empty,
-                sysfs::hwmonio::retries,
-                sysfs::hwmonio::delay);
+                hwmonio::retries,
+                hwmonio::delay);
         }
         catch (const std::system_error& e)
         {
diff --git a/fan_pwm.hpp b/fan_pwm.hpp
index 1541779..20baf38 100644
--- a/fan_pwm.hpp
+++ b/fan_pwm.hpp
@@ -1,5 +1,6 @@
 #pragma once
 
+#include "hwmonio.hpp"
 #include "interface.hpp"
 #include "sysfs.hpp"
 
@@ -54,7 +55,7 @@
         /** @brief hwmon id */
         std::string id;
         /** @brief Hwmon sysfs access. */
-        sysfs::hwmonio::HwmonIO ioAccess;
+        hwmonio::HwmonIO ioAccess;
         /** @brief Physical device path. */
         std::string devPath;
 };
diff --git a/fan_speed.cpp b/fan_speed.cpp
index 15ce946..f1afd55 100644
--- a/fan_speed.cpp
+++ b/fan_speed.cpp
@@ -4,6 +4,7 @@
 #include "env.hpp"
 #include "fan_speed.hpp"
 #include "hwmon.hpp"
+#include "hwmonio.hpp"
 #include "sysfs.hpp"
 
 using namespace phosphor::logging;
@@ -25,8 +26,8 @@
                     type,
                     id,
                     entry::target,
-                    sysfs::hwmonio::retries,
-                    sysfs::hwmonio::delay);
+                    hwmonio::retries,
+                    hwmonio::delay);
 
         }
         catch (const std::system_error& e)
@@ -70,8 +71,8 @@
                     type::pwm,
                     id,
                     entry::enable,
-                    sysfs::hwmonio::retries,
-                    sysfs::hwmonio::delay);
+                    hwmonio::retries,
+                    hwmonio::delay);
         }
         catch (const std::system_error& e)
         {
diff --git a/fan_speed.hpp b/fan_speed.hpp
index 7fc303a..fb97303 100644
--- a/fan_speed.hpp
+++ b/fan_speed.hpp
@@ -1,5 +1,6 @@
 #pragma once
 
+#include "hwmonio.hpp"
 #include "interface.hpp"
 #include "sysfs.hpp"
 
@@ -61,7 +62,7 @@
         /** @brief hwmon id */
         std::string id;
         /** @brief Hwmon sysfs access. */
-        sysfs::hwmonio::HwmonIO ioAccess;
+        hwmonio::HwmonIO ioAccess;
         /** @brief Physical device path. */
         std::string devPath;
 
diff --git a/hwmonio.cpp b/hwmonio.cpp
new file mode 100644
index 0000000..fe167f5
--- /dev/null
+++ b/hwmonio.cpp
@@ -0,0 +1,228 @@
+/**
+ * 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 <algorithm>
+#include <exception>
+#include <fstream>
+#include <thread>
+
+#include "config.h"
+#include "hwmonio.hpp"
+#include "sysfs.hpp"
+
+namespace hwmonio {
+
+static constexpr auto retryableErrors = {
+    /*
+     * Retry on bus or device errors or timeouts in case
+     * they are transient.
+     */
+    EIO,
+    ETIMEDOUT,
+
+    /*
+     * Retry CRC errors.
+     */
+    EBADMSG,
+
+    /*
+     * Some hwmon drivers do this when they aren't ready
+     * instead of blocking.  Retry.
+     */
+    EAGAIN,
+    /*
+     * We'll see this when for example i2c devices are
+     * unplugged but the driver is still bound.  Retry
+     * rather than exit on the off chance the device is
+     * plugged back in and the driver doesn't do a
+     * remove/probe.  If a remove does occur, we'll
+     * eventually get ENOENT.
+     */
+    ENXIO,
+
+    /*
+     * Some devices return this when they are busy doing
+     * something else.  Even if being busy isn't the cause,
+     * a retry still gives this app a shot at getting data
+     * as opposed to failing out on the first try.
+     */
+    ENODATA,
+};
+
+HwmonIO::HwmonIO(const std::string& path) : p(path)
+{
+}
+
+int64_t HwmonIO::read(
+        const std::string& type,
+        const std::string& id,
+        const std::string& sensor,
+        size_t retries,
+        std::chrono::milliseconds delay,
+        bool isOCC) const
+{
+    int64_t val;
+    std::ifstream ifs;
+    auto fullPath = sysfs::make_sysfs_path(
+            p, type, id, sensor);
+
+    ifs.exceptions(
+            std::ifstream::failbit |
+                std::ifstream::badbit |
+                std::ifstream::eofbit);
+
+    while (true)
+    {
+        try
+        {
+            errno = 0;
+            if (!ifs.is_open())
+                ifs.open(fullPath);
+            ifs.clear();
+            ifs.seekg(0);
+            ifs >> val;
+        }
+        catch (const std::exception& e)
+        {
+            auto rc = errno;
+
+            if (!rc)
+            {
+                throw;
+            }
+
+            if (rc == ENOENT || rc == ENODEV)
+            {
+                // If the directory or device disappeared then this application
+                // should gracefully exit.  There are race conditions between the
+                // unloading of a hwmon driver and the stopping of this service
+                // by systemd.  To prevent this application from falsely failing
+                // in these scenarios, it will simply exit if the directory or
+                // file can not be found.  It is up to the user(s) of this
+                // provided hwmon object to log the appropriate errors if the
+                // object disappears when it should not.
+                exit(0);
+            }
+
+            if (isOCC)
+            {
+                if (rc == EREMOTEIO)
+                {
+                    // For the OCCs, when an EREMOTEIO is return, set the
+                    // value to 255*1000
+                    // (0xFF = sensor is failed, 1000 = sensor factor)
+                    val = 255000;
+                    break;
+                }
+            }
+
+            if (0 == std::count(
+                        retryableErrors.begin(),
+                        retryableErrors.end(),
+                        rc) ||
+                    !retries)
+            {
+                // Not a retryable error or out of retries.
+#ifdef NEGATIVE_ERRNO_ON_FAIL
+                return -rc;
+#endif
+
+                // Work around GCC bugs 53984 and 66145 for callers by
+                // explicitly raising system_error here.
+                throw std::system_error(rc, std::generic_category());
+            }
+
+            --retries;
+            std::this_thread::sleep_for(delay);
+            continue;
+        }
+        break;
+    }
+
+    return val;
+}
+
+void HwmonIO::write(
+        uint32_t val,
+        const std::string& type,
+        const std::string& id,
+        const std::string& sensor,
+        size_t retries,
+        std::chrono::milliseconds delay) const
+
+{
+    std::ofstream ofs;
+    auto fullPath = sysfs::make_sysfs_path(
+            p, type, id, sensor);
+
+    ofs.exceptions(
+            std::ofstream::failbit |
+                std::ofstream::badbit |
+                std::ofstream::eofbit);
+
+    // See comments in the read method for an explanation of the odd exception
+    // handling behavior here.
+
+    while (true)
+    {
+        try
+        {
+            errno = 0;
+            if (!ofs.is_open())
+                ofs.open(fullPath);
+            ofs.clear();
+            ofs.seekp(0);
+            ofs << val;
+            ofs.flush();
+        }
+        catch (const std::exception& e)
+        {
+            auto rc = errno;
+
+            if (!rc)
+            {
+                throw;
+            }
+
+            if (rc == ENOENT)
+            {
+                exit(0);
+            }
+
+            if (0 == std::count(
+                        retryableErrors.begin(),
+                        retryableErrors.end(),
+                        rc) ||
+                    !retries)
+            {
+                // Not a retryable error or out of retries.
+
+                // Work around GCC bugs 53984 and 66145 for callers by
+                // explicitly raising system_error here.
+                throw std::system_error(rc, std::generic_category());
+            }
+
+            --retries;
+            std::this_thread::sleep_for(delay);
+            continue;
+        }
+        break;
+    }
+}
+
+std::string HwmonIO::path() const
+{
+    return p;
+}
+
+} // hwmonio
diff --git a/hwmonio.hpp b/hwmonio.hpp
new file mode 100644
index 0000000..b254b0f
--- /dev/null
+++ b/hwmonio.hpp
@@ -0,0 +1,99 @@
+#pragma once
+
+#include <chrono>
+#include <string>
+
+namespace hwmonio {
+
+static constexpr auto retries = 10;
+static constexpr auto delay = std::chrono::milliseconds{100};
+
+/** @class HwmonIO
+ *  @brief Convenience wrappers for HWMON sysfs attribute IO.
+ *
+ *  Unburden the rest of the application from having to check
+ *  ENOENT after every hwmon attribute io operation.  Hwmon
+ *  device drivers can be unbound at any time; the program
+ *  cannot always be terminated externally before we try to
+ *  do an io.
+ */
+class HwmonIO
+{
+    public:
+        HwmonIO() = delete;
+        HwmonIO(const HwmonIO&) = default;
+        HwmonIO(HwmonIO&&) = default;
+        HwmonIO& operator=(const HwmonIO&) = default;
+        HwmonIO& operator=(HwmonIO&&) = default;
+        ~HwmonIO() = default;
+
+        /** @brief Constructor
+         *
+         *  @param[in] path - hwmon instance root - eg:
+         *      /sys/class/hwmon/hwmon<N>
+         */
+        explicit HwmonIO(const std::string& path);
+
+        /** @brief Perform formatted hwmon sysfs read.
+         *
+         *  Propagates any exceptions other than ENOENT.
+         *  ENOENT will result in a call to exit(0) in case
+         *  the underlying hwmon driver is unbound and
+         *  the program is inadvertently left running.
+         *
+         *  For possibly transient errors will retry up to
+         *  the specified number of times.
+         *
+         *  @param[in] type - The hwmon type (ex. temp).
+         *  @param[in] id - The hwmon id (ex. 1).
+         *  @param[in] sensor - The hwmon sensor (ex. input).
+         *  @param[in] retries - The number of times to retry.
+         *  @param[in] delay - The time to sleep between retry attempts.
+         *
+         *  @return val - The read value.
+         */
+        int64_t read(
+                const std::string& type,
+                const std::string& id,
+                const std::string& sensor,
+                size_t retries,
+                std::chrono::milliseconds delay,
+                bool isOCC = false) const;
+
+        /** @brief Perform formatted hwmon sysfs write.
+         *
+         *  Propagates any exceptions other than ENOENT.
+         *  ENOENT will result in a call to exit(0) in case
+         *  the underlying hwmon driver is unbound and
+         *  the program is inadvertently left running.
+         *
+         *  For possibly transient errors will retry up to
+         *  the specified number of times.
+         *
+         *  @param[in] val - The value to be written.
+         *  @param[in] type - The hwmon type (ex. fan).
+         *  @param[in] id - The hwmon id (ex. 1).
+         *  @param[in] retries - The number of times to retry.
+         *  @param[in] delay - The time to sleep between retry attempts.
+         */
+        void write(
+                uint32_t val,
+                const std::string& type,
+                const std::string& id,
+                const std::string& sensor,
+                size_t retries,
+                std::chrono::milliseconds delay) const;
+
+
+        /** @brief Hwmon instance path access.
+         *
+         *  @return path - The hwmon instance path.
+         */
+        std::string path() const;
+
+    private:
+        std::string p;
+};
+} // namespace hwmonio
+
+// vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
diff --git a/mainloop.cpp b/mainloop.cpp
index 4c74f53..5324fcd 100644
--- a/mainloop.cpp
+++ b/mainloop.cpp
@@ -27,6 +27,7 @@
 #include "fan_pwm.hpp"
 #include "fan_speed.hpp"
 #include "hwmon.hpp"
+#include "hwmonio.hpp"
 #include "sensorset.hpp"
 #include "sysfs.hpp"
 #include "mainloop.hpp"
@@ -132,7 +133,7 @@
 
 auto addValue(const SensorSet::key_type& sensor,
               const RetryIO& retryIO,
-              sysfs::hwmonio::HwmonIO& ioAccess,
+              hwmonio::HwmonIO& ioAccess,
               ObjectInfo& info,
               bool isOCC = false)
 {
@@ -278,7 +279,7 @@
     objectPath.append(std::get<sensorLabel>(properties));
 
     ObjectInfo info(&_bus, std::move(objectPath), Object());
-    RetryIO retryIO(sysfs::hwmonio::retries, sysfs::hwmonio::delay);
+    RetryIO retryIO(hwmonio::retries, hwmonio::delay);
     if (rmSensors.find(sensor.first) != rmSensors.end())
     {
         // When adding a sensor that was purposely removed,
@@ -507,8 +508,8 @@
                         i.first.first,
                         i.first.second,
                         input,
-                        sysfs::hwmonio::retries,
-                        sysfs::hwmonio::delay,
+                        hwmonio::retries,
+                        hwmonio::delay,
                         _isOCC);
 
                 value = adjustValue(i.first, value);
diff --git a/mainloop.hpp b/mainloop.hpp
index 0453d8e..d139593 100644
--- a/mainloop.hpp
+++ b/mainloop.hpp
@@ -5,6 +5,7 @@
 #include <experimental/any>
 #include <memory>
 #include <sdbusplus/server.hpp>
+#include "hwmonio.hpp"
 #include "sensorset.hpp"
 #include "sysfs.hpp"
 #include "interface.hpp"
@@ -96,7 +97,7 @@
         /** @brief Sleep interval in microseconds. */
         uint64_t _interval = default_interval;
         /** @brief Hwmon sysfs access. */
-        sysfs::hwmonio::HwmonIO ioAccess;
+        hwmonio::HwmonIO ioAccess;
         /** @brief Timer */
         std::unique_ptr<phosphor::hwmon::Timer> timer;
         /** @brief the sd_event structure */
diff --git a/sysfs.cpp b/sysfs.cpp
index f689314..d7ad3a2 100644
--- a/sysfs.cpp
+++ b/sysfs.cpp
@@ -29,43 +29,6 @@
 
 namespace sysfs {
 
-static constexpr auto retryableErrors = {
-    /*
-     * Retry on bus or device errors or timeouts in case
-     * they are transient.
-     */
-    EIO,
-    ETIMEDOUT,
-
-    /*
-     * Retry CRC errors.
-     */
-    EBADMSG,
-
-    /*
-     * Some hwmon drivers do this when they aren't ready
-     * instead of blocking.  Retry.
-     */
-    EAGAIN,
-    /*
-     * We'll see this when for example i2c devices are
-     * unplugged but the driver is still bound.  Retry
-     * rather than exit on the off chance the device is
-     * plugged back in and the driver doesn't do a
-     * remove/probe.  If a remove does occur, we'll
-     * eventually get ENOENT.
-     */
-    ENXIO,
-
-    /*
-     * Some devices return this when they are busy doing
-     * something else.  Even if being busy isn't the cause,
-     * a retry still gives this app a shot at getting data
-     * as opposed to failing out on the first try.
-     */
-    ENODATA,
-};
-
 static const auto emptyString = ""s;
 static constexpr auto ofRoot = "/sys/firmware/devicetree/base";
 
@@ -277,176 +240,6 @@
     return emptyString;
 }
 
-namespace hwmonio
-{
+} // namespace sysfs
 
-HwmonIO::HwmonIO(const std::string& path) : p(path)
-{
-
-}
-
-int64_t HwmonIO::read(
-        const std::string& type,
-        const std::string& id,
-        const std::string& sensor,
-        size_t retries,
-        std::chrono::milliseconds delay,
-        bool isOCC) const
-{
-    int64_t val;
-    std::ifstream ifs;
-    auto fullPath = sysfs::make_sysfs_path(
-            p, type, id, sensor);
-
-    ifs.exceptions(
-            std::ifstream::failbit |
-                std::ifstream::badbit |
-                std::ifstream::eofbit);
-
-    while (true)
-    {
-        try
-        {
-            errno = 0;
-            if (!ifs.is_open())
-                ifs.open(fullPath);
-            ifs.clear();
-            ifs.seekg(0);
-            ifs >> val;
-        }
-        catch (const std::exception& e)
-        {
-            auto rc = errno;
-
-            if (!rc)
-            {
-                throw;
-            }
-
-            if (rc == ENOENT || rc == ENODEV)
-            {
-                // If the directory or device disappeared then this application
-                // should gracefully exit.  There are race conditions between the
-                // unloading of a hwmon driver and the stopping of this service
-                // by systemd.  To prevent this application from falsely failing
-                // in these scenarios, it will simply exit if the directory or
-                // file can not be found.  It is up to the user(s) of this
-                // provided hwmon object to log the appropriate errors if the
-                // object disappears when it should not.
-                exit(0);
-            }
-
-            if (isOCC)
-            {
-                if (rc == EREMOTEIO)
-                {
-                    // For the OCCs, when an EREMOTEIO is return, set the
-                    // value to 255*1000
-                    // (0xFF = sensor is failed, 1000 = sensor factor)
-                    val = 255000;
-                    break;
-                }
-            }
-
-            if (0 == std::count(
-                        retryableErrors.begin(),
-                        retryableErrors.end(),
-                        rc) ||
-                    !retries)
-            {
-                // Not a retryable error or out of retries.
-#ifdef NEGATIVE_ERRNO_ON_FAIL
-                return -rc;
-#endif
-
-                // Work around GCC bugs 53984 and 66145 for callers by
-                // explicitly raising system_error here.
-                throw std::system_error(rc, std::generic_category());
-            }
-
-            --retries;
-            std::this_thread::sleep_for(delay);
-            continue;
-        }
-        break;
-    }
-
-    return val;
-}
-
-void HwmonIO::write(
-        uint32_t val,
-        const std::string& type,
-        const std::string& id,
-        const std::string& sensor,
-        size_t retries,
-        std::chrono::milliseconds delay) const
-
-{
-    std::ofstream ofs;
-    auto fullPath = sysfs::make_sysfs_path(
-            p, type, id, sensor);
-
-    ofs.exceptions(
-            std::ofstream::failbit |
-                std::ofstream::badbit |
-                std::ofstream::eofbit);
-
-    // See comments in the read method for an explanation of the odd exception
-    // handling behavior here.
-
-    while (true)
-    {
-        try
-        {
-            errno = 0;
-            if (!ofs.is_open())
-                ofs.open(fullPath);
-            ofs.clear();
-            ofs.seekp(0);
-            ofs << val;
-            ofs.flush();
-        }
-        catch (const std::exception& e)
-        {
-            auto rc = errno;
-
-            if (!rc)
-            {
-                throw;
-            }
-
-            if (rc == ENOENT)
-            {
-                exit(0);
-            }
-
-            if (0 == std::count(
-                        retryableErrors.begin(),
-                        retryableErrors.end(),
-                        rc) ||
-                    !retries)
-            {
-                // Not a retryable error or out of retries.
-
-                // Work around GCC bugs 53984 and 66145 for callers by
-                // explicitly raising system_error here.
-                throw std::system_error(rc, std::generic_category());
-            }
-
-            --retries;
-            std::this_thread::sleep_for(delay);
-            continue;
-        }
-        break;
-    }
-}
-
-std::string HwmonIO::path() const
-{
-    return p;
-}
-
-} // namespace hwmonio
-}
 // vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
diff --git a/sysfs.hpp b/sysfs.hpp
index f66c3fb..10ab28d 100644
--- a/sysfs.hpp
+++ b/sysfs.hpp
@@ -75,98 +75,6 @@
  */
 std::string findCalloutPath(const std::string& instancePath);
 
-namespace hwmonio
-{
-static constexpr auto retries = 10;
-static constexpr auto delay = std::chrono::milliseconds{100};
-
-/** @class HwmonIO
- *  @brief Convenience wrappers for HWMON sysfs attribute IO.
- *
- *  Unburden the rest of the application from having to check
- *  ENOENT after every hwmon attribute io operation.  Hwmon
- *  device drivers can be unbound at any time; the program
- *  cannot always be terminated externally before we try to
- *  do an io.
- */
-class HwmonIO
-{
-    public:
-        HwmonIO() = delete;
-        HwmonIO(const HwmonIO&) = default;
-        HwmonIO(HwmonIO&&) = default;
-        HwmonIO& operator=(const HwmonIO&) = default;
-        HwmonIO& operator=(HwmonIO&&) = default;
-        ~HwmonIO() = default;
-
-        /** @brief Constructor
-         *
-         *  @param[in] path - hwmon instance root - eg:
-         *      /sys/class/hwmon/hwmon<N>
-         */
-        explicit HwmonIO(const std::string& path);
-
-        /** @brief Perform formatted hwmon sysfs read.
-         *
-         *  Propagates any exceptions other than ENOENT.
-         *  ENOENT will result in a call to exit(0) in case
-         *  the underlying hwmon driver is unbound and
-         *  the program is inadvertently left running.
-         *
-         *  For possibly transient errors will retry up to
-         *  the specified number of times.
-         *
-         *  @param[in] type - The hwmon type (ex. temp).
-         *  @param[in] id - The hwmon id (ex. 1).
-         *  @param[in] sensor - The hwmon sensor (ex. input).
-         *  @param[in] retries - The number of times to retry.
-         *  @param[in] delay - The time to sleep between retry attempts.
-         *
-         *  @return val - The read value.
-         */
-        int64_t read(
-                const std::string& type,
-                const std::string& id,
-                const std::string& sensor,
-                size_t retries,
-                std::chrono::milliseconds delay,
-                bool isOCC = false) const;
-
-        /** @brief Perform formatted hwmon sysfs write.
-         *
-         *  Propagates any exceptions other than ENOENT.
-         *  ENOENT will result in a call to exit(0) in case
-         *  the underlying hwmon driver is unbound and
-         *  the program is inadvertently left running.
-         *
-         *  For possibly transient errors will retry up to
-         *  the specified number of times.
-         *
-         *  @param[in] val - The value to be written.
-         *  @param[in] type - The hwmon type (ex. fan).
-         *  @param[in] id - The hwmon id (ex. 1).
-         *  @param[in] retries - The number of times to retry.
-         *  @param[in] delay - The time to sleep between retry attempts.
-         */
-        void write(
-                uint32_t val,
-                const std::string& type,
-                const std::string& id,
-                const std::string& sensor,
-                size_t retries,
-                std::chrono::milliseconds delay) const;
-
-
-        /** @brief Hwmon instance path access.
-         *
-         *  @return path - The hwmon instance path.
-         */
-        std::string path() const;
-
-    private:
-        std::string p;
-};
-} // namespace hwmonio
 } // namespace sysfs
 
 // vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
diff --git a/targets.hpp b/targets.hpp
index 02bdd4f..7f21c4b 100644
--- a/targets.hpp
+++ b/targets.hpp
@@ -7,6 +7,7 @@
 #include "env.hpp"
 #include "fan_speed.hpp"
 #include "fan_pwm.hpp"
+#include "hwmonio.hpp"
 
 enum class targetType
 {
@@ -61,7 +62,7 @@
  */
 template <typename T>
 std::shared_ptr<T> addTarget(const SensorSet::key_type& sensor,
-                             const sysfs::hwmonio::HwmonIO& ioAccess,
+                             const hwmonio::HwmonIO& ioAccess,
                              const std::string& devPath,
                              ObjectInfo& info)
 {
@@ -144,8 +145,8 @@
                     targetName,
                     targetId,
                     entry,
-                    sysfs::hwmonio::retries,
-                    sysfs::hwmonio::delay);
+                    hwmonio::retries,
+                    hwmonio::delay);
             }
             catch (const std::system_error& e)
             {
