]> git.sesse.net Git - casparcg/commitdiff
[polling_filesystem_monitor] Fixed bug where unallocated memory could be read by...
authorHelge Norberg <helge.norberg@svt.se>
Tue, 8 Nov 2016 18:22:08 +0000 (19:22 +0100)
committerHelge Norberg <helge.norberg@svt.se>
Tue, 8 Nov 2016 18:22:08 +0000 (19:22 +0100)
common/polling_filesystem_monitor.cpp
shell/server.cpp

index c189218ea31ab0d450ef545009477131c33e241f..74962590b1884174f189dbb0275be81fcd7841de 100644 (file)
@@ -203,17 +203,19 @@ private:
        }
 };
 
-class polling_filesystem_monitor : public filesystem_monitor
+class polling_filesystem_monitor
+               : public filesystem_monitor
+               , public spl::enable_shared_from_this<polling_filesystem_monitor>
 {
-       tbb::atomic<bool> running_;
-       std::shared_ptr<boost::asio::io_service> scheduler_;
-       directory_monitor root_monitor_;
-       boost::asio::deadline_timer timer_;
-       int scan_interval_millis_;
-       std::promise<void> initial_scan_completion_;
-       tbb::concurrent_queue<boost::filesystem::path> to_reemmit_;
-       tbb::atomic<bool> reemmit_all_;
-       executor executor_;
+       tbb::atomic<bool>                                                               running_;
+       std::shared_ptr<boost::asio::io_service>                scheduler_;
+       directory_monitor                                                               root_monitor_;
+       boost::asio::deadline_timer                                             timer_;
+       int                                                                                             scan_interval_millis_;
+       std::promise<void>                                                              initial_scan_completion_;
+       tbb::concurrent_queue<boost::filesystem::path>  to_reemmit_;
+       tbb::atomic<bool>                                                               reemmit_all_;
+       executor                                                                                executor_;
 public:
        polling_filesystem_monitor(
                        const boost::filesystem::path& folder_to_watch,
@@ -231,6 +233,10 @@ public:
        {
                running_ = true;
                reemmit_all_ = false;
+       }
+
+       void start()
+       {
                executor_.begin_invoke([this]
                {
                        scan();
@@ -243,7 +249,7 @@ public:
        {
                running_ = false;
                boost::system::error_code e;
-               timer_.cancel(e);
+               timer_.cancel(e); // Can still have be queued for execution by asio, therefore the task has a weak_ptr to this
        }
 
        std::future<void> initial_files_processed() override
@@ -266,11 +272,15 @@ private:
                if (!running_)
                        return;
 
-               timer_.expires_from_now(
-                       boost::posix_time::milliseconds(scan_interval_millis_));
-               timer_.async_wait([this](const boost::system::error_code& e)
+               std::weak_ptr<polling_filesystem_monitor> weak_self = shared_from_this();
+
+               timer_.expires_from_now(boost::posix_time::milliseconds(scan_interval_millis_));
+               timer_.async_wait([weak_self](const boost::system::error_code& e)
                {
-                       begin_scan();
+                       auto strong_self = weak_self.lock();
+
+                       if (strong_self)
+                               strong_self->begin_scan();
                });
        }
 
@@ -344,7 +354,7 @@ filesystem_monitor::ptr polling_filesystem_monitor_factory::create(
                const filesystem_monitor_handler& handler,
                const initial_files_handler& initial_files_handler)
 {
-       return spl::make_shared<polling_filesystem_monitor>(
+       auto monitor = spl::make_shared<polling_filesystem_monitor>(
                        folder_to_watch,
                        events_of_interest_mask,
                        report_already_existing,
@@ -352,6 +362,10 @@ filesystem_monitor::ptr polling_filesystem_monitor_factory::create(
                        impl_->scheduler_,
                        handler,
                        initial_files_handler);
+
+       monitor->start();
+
+       return monitor;
 }
 
 }
index 3d78ed36b55bd61fe7576f6cf06413cf8302eeb5..69fa7c083c0430e8e50c568f242b7f04e1d65ad2 100644 (file)
@@ -109,12 +109,15 @@ std::shared_ptr<boost::asio::io_service> create_running_io_service()
                                CASPAR_LOG_CURRENT_EXCEPTION();
                        }
                }
+
+               CASPAR_LOG(info) << "[asio] Global io_service uninitialized.";
        });
 
        return std::shared_ptr<boost::asio::io_service>(
                        service.get(),
                        [service, work, thread](void*) mutable
                        {
+                               CASPAR_LOG(info) << "[asio] Shutting down global io_service.";
                                work.reset();
                                service->stop();
                                if (thread->get_id() != boost::this_thread::get_id())