From 2b34d09b846cfb3db16d3a34ad3db8961452acde Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 17 Mar 2021 12:49:50 -0400 Subject: [PATCH] Move analysis_thread into Monitor. Don't do extra gettimeofday if no delays are set. Fix status update on terminate --- src/zmc.cpp | 59 +++++++++++++++++++++-------------------------------- 1 file changed, 23 insertions(+), 36 deletions(-) diff --git a/src/zmc.cpp b/src/zmc.cpp index 19c8891c7..6a9a37c14 100644 --- a/src/zmc.cpp +++ b/src/zmc.cpp @@ -54,7 +54,6 @@ possible, this should run at more or less constant speed. */ #include "zm.h" -#include "zm_analysis_thread.h" #include "zm_camera.h" #include "zm_db.h" #include "zm_define.h" @@ -272,8 +271,6 @@ int main(int argc, char *argv[]) { } // end foreach monitor if (zm_terminate) break; - std::vector> analysis_threads = std::vector>(); - int *capture_delays = new int[monitors.size()]; int *alarm_capture_delays = new int[monitors.size()]; struct timeval * last_capture_times = new struct timeval[monitors.size()]; @@ -284,12 +281,6 @@ int main(int argc, char *argv[]) { alarm_capture_delays[i] = monitors[i]->GetAlarmCaptureDelay(); Debug(2, "capture delay(%u mSecs 1000/capture_fps) alarm delay(%u)", capture_delays[i], alarm_capture_delays[i]); - - Monitor::Function function = monitors[0]->GetFunction(); - if (function != Monitor::MONITOR) { - Debug(1, "Starting an analysis thread for monitor (%d)", monitors[i]->Id()); - analysis_threads.emplace_back(ZM::make_unique(monitors[i])); - } } struct timeval now; @@ -320,29 +311,31 @@ int main(int argc, char *argv[]) { break; } - gettimeofday(&now, nullptr); // capture_delay is the amount of time we should sleep in useconds to achieve the desired framerate. int delay = (monitors[i]->GetState() == Monitor::ALARM) ? alarm_capture_delays[i] : capture_delays[i]; - if (delay && last_capture_times[i].tv_sec) { - // DT_PREC_3 means that the value will be in thousands of a second - DELTA_TIMEVAL(delta_time, now, last_capture_times[i], DT_PREC_6); + if (delay) { + gettimeofday(&now, nullptr); + if (last_capture_times[i].tv_sec) { + // DT_PREC_3 means that the value will be in thousands of a second + DELTA_TIMEVAL(delta_time, now, last_capture_times[i], DT_PREC_6); - // You have to add back in the previous sleep time - sleep_time = delay - (delta_time.delta - sleep_time); - Debug(4, "Sleep time is %d from now:%d.%d last:%d.%d delta %d delay: %d", - sleep_time, - now.tv_sec, now.tv_usec, - last_capture_times[i].tv_sec, last_capture_times[i].tv_usec, - delta_time.delta, - delay - ); - - if (sleep_time > 0) { - Debug(4, "usleeping (%d)", sleep_time); - usleep(sleep_time); - } - } // end if has a last_capture time - last_capture_times[i] = now; + // You have to add back in the previous sleep time + sleep_time = delay - (delta_time.delta - sleep_time); + Debug(4, "Sleep time is %d from now:%d.%d last:%d.%d delta %d delay: %d", + sleep_time, + now.tv_sec, now.tv_usec, + last_capture_times[i].tv_sec, last_capture_times[i].tv_usec, + delta_time.delta, + delay + ); + + if (sleep_time > 0) { + Debug(4, "usleeping (%d)", sleep_time); + usleep(sleep_time); + } + } // end if has a last_capture time + last_capture_times[i] = now; + } // end if delay } // end foreach n_monitors if ((result < 0) or zm_reload) { @@ -351,16 +344,10 @@ int main(int argc, char *argv[]) { } } // end while ! zm_terminate and connected - for (std::unique_ptr &analysis_thread: analysis_threads) - analysis_thread->Stop(); - for (size_t i = 0; i < monitors.size(); i++) { monitors[i]->Close(); } - // Killoff the analysis threads. Don't need them spinning while we try to reconnect - analysis_threads.clear(); - delete [] alarm_capture_delays; delete [] capture_delays; delete [] last_capture_times; @@ -385,7 +372,7 @@ int main(int argc, char *argv[]) { for (std::shared_ptr &monitor : monitors) { static char sql[ZM_SQL_SML_BUFSIZ]; snprintf(sql, sizeof(sql), - "INSERT INTO Monitor_Status (MonitorId,Status) VALUES (%d, 'Connected') ON DUPLICATE KEY UPDATE Status='NotRunning'", + "INSERT INTO Monitor_Status (MonitorId,Status) VALUES (%d, 'NotRunning') ON DUPLICATE KEY UPDATE Status='NotRunning'", monitor->Id()); zmDbDo(sql); }