mirror of
https://github.com/ZoneMinder/zoneminder.git
synced 2026-05-09 23:23:34 -04:00
- zm_analysis_thread.cpp, zm_decoder_thread.cpp: Fix potential deadlock in Start() by calling Stop() before joining thread - zm_camera.cpp: Add null check after avformat_alloc_context() - zm_comms.cpp: Fix memory leak in InetSocket::bind(), fix error message typo in deleteReader(), fix clearReaders/clearWriters to recalculate mMaxFd properly - zm_config.cpp: Fix potential buffer underrun when parsing config files, fix misplaced SERVER_ID check logic - zm_db.cpp: Fix logger level not restored on early return in zmDbDo(), fix empty string access in DB_HOST parsing - zm_event.cpp: Fix typo "foudn" -> "found", fix memory leak with Tag allocation, fix variable shadowing with video_file - zm_event_tag.cpp: Fix null dereference when AssignedBy is NULL - zm_eventstream.cpp: Fix dangling pointer bugs with emplace_back (use auto& instead of auto), fix memory leak in loadInitialEventData Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
45 lines
1.2 KiB
C++
45 lines
1.2 KiB
C++
#include "zm_decoder_thread.h"
|
|
|
|
#include "zm_monitor.h"
|
|
#include "zm_signal.h"
|
|
|
|
DecoderThread::DecoderThread(Monitor *monitor) :
|
|
monitor_(monitor), terminate_(false) {
|
|
thread_ = std::thread(&DecoderThread::Run, this);
|
|
}
|
|
|
|
DecoderThread::~DecoderThread() {
|
|
Stop();
|
|
if (thread_.joinable()) thread_.join();
|
|
}
|
|
|
|
void DecoderThread::Start() {
|
|
Stop(); // Signal any running thread to terminate first
|
|
if (thread_.joinable()) thread_.join();
|
|
terminate_ = false;
|
|
thread_ = std::thread(&DecoderThread::Run, this);
|
|
}
|
|
|
|
void DecoderThread::Stop() {
|
|
terminate_ = true;
|
|
}
|
|
|
|
void DecoderThread::Join() {
|
|
if (thread_.joinable()) thread_.join();
|
|
}
|
|
|
|
void DecoderThread::Run() {
|
|
Debug(2, "DecoderThread::Run() for %d", monitor_->Id());
|
|
|
|
while (!(terminate_ or zm_terminate)) {
|
|
if (!monitor_->Decode()) {
|
|
if (!(terminate_ or zm_terminate)) {
|
|
// We only sleep when Decode returns false because it is an error condition and we will spin like mad if it persists.
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|