diff --git a/src/zm_analysis_thread.cpp b/src/zm_analysis_thread.cpp index 7a6b01bbb..7aa037074 100644 --- a/src/zm_analysis_thread.cpp +++ b/src/zm_analysis_thread.cpp @@ -4,10 +4,8 @@ #include "zm_signal.h" #include "zm_utils.h" -//AnalysisThread::AnalysisThread(std::shared_ptr monitor) : -AnalysisThread::AnalysisThread(Monitor* monitor) : +AnalysisThread::AnalysisThread(Monitor *monitor) : monitor_(monitor), terminate_(false) { - //monitor_(std::move(monitor)), terminate_(false) { thread_ = std::thread(&AnalysisThread::Run, this); } @@ -43,7 +41,7 @@ void AnalysisThread::Run() { Debug(2, "Analyzing"); if (!monitor_->Analyse()) { - if ( !(terminate_ or zm_terminate) ) { + if (!(terminate_ or zm_terminate)) { Microseconds sleep_for = monitor_->Active() ? Microseconds(ZM_SAMPLE_RATE) : Microseconds(ZM_SUSPENDED_RATE); Debug(2, "Sleeping for %" PRId64 "us", int64(sleep_for.count())); std::this_thread::sleep_for(sleep_for); diff --git a/src/zm_analysis_thread.h b/src/zm_analysis_thread.h index 7fc0fd8c9..e5b95601f 100644 --- a/src/zm_analysis_thread.h +++ b/src/zm_analysis_thread.h @@ -1,15 +1,15 @@ #ifndef ZM_ANALYSIS_THREAD_H #define ZM_ANALYSIS_THREAD_H -class Monitor; #include #include #include +class Monitor; + class AnalysisThread { public: - explicit AnalysisThread(Monitor* monitor); - //explicit AnalysisThread(std::shared_ptr monitor); + explicit AnalysisThread(Monitor *monitor); ~AnalysisThread(); AnalysisThread(AnalysisThread &rhs) = delete; AnalysisThread(AnalysisThread &&rhs) = delete; @@ -19,8 +19,7 @@ class AnalysisThread { private: void Run(); - Monitor* monitor_; - //std::shared_ptr monitor_; + Monitor *monitor_; std::atomic terminate_; std::thread thread_; }; diff --git a/src/zm_monitor.cpp b/src/zm_monitor.cpp index 7e18dd73f..de3740715 100644 --- a/src/zm_monitor.cpp +++ b/src/zm_monitor.cpp @@ -3216,7 +3216,7 @@ int Monitor::PrimeCapture() { if (!analysis_it) analysis_it = packetqueue.get_video_it(false); if (!analysis_thread) { Debug(1, "Starting an analysis thread for monitor (%d)", id); - analysis_thread = new AnalysisThread(this); + analysis_thread = ZM::make_unique(this); } } else { @@ -3229,17 +3229,18 @@ int Monitor::PreCapture() const { return camera->PreCapture(); } int Monitor::PostCapture() const { return camera->PostCapture(); } int Monitor::Close() { // Because the stream indexes may change we have to clear out the packetqueue - if (decoder) decoder->Stop(); - if (analysis_thread) analysis_thread->Stop(); + if (decoder) { + decoder->Stop(); + } + if (analysis_thread) { + analysis_thread->Stop(); + } packetqueue.clear(); + if (decoder) { delete decoder; decoder = nullptr; } - if (analysis_thread) { - delete analysis_thread; - analysis_thread = nullptr; - } std::lock_guard lck(event_mutex); if (event) { Info("%s: image_count:%d - Closing event %" PRIu64 ", shutting down", name, image_count, event->Id()); diff --git a/src/zm_monitor.h b/src/zm_monitor.h index 5543ed4ef..a48870397 100644 --- a/src/zm_monitor.h +++ b/src/zm_monitor.h @@ -376,7 +376,7 @@ protected: VideoStore *videoStore; PacketQueue packetqueue; packetqueue_iterator *analysis_it; - AnalysisThread *analysis_thread; + std::unique_ptr analysis_thread; packetqueue_iterator *decoder_it; DecoderThread *decoder; AVFrame *dest_frame; // Used by decoding thread doing colorspace conversions