fix: ensure trigger_state written last in zmTriggerEventOn to fix 1/3 event trigger rate

Agent-Logs-Url: https://github.com/ZoneMinder/zoneminder/sessions/68794b2b-7137-4888-b66e-20c629112a57

Co-authored-by: connortechnology <925519+connortechnology@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2026-05-04 13:22:13 +00:00
committed by Isaac Connor
parent edeeed8fca
commit 5603d025be
2 changed files with 8 additions and 3 deletions

View File

@@ -605,15 +605,18 @@ sub zmTriggerEventOn {
my $text = shift;
my $showtext = shift;
# Write score/cause/text before trigger_state so the analysis process always
# reads complete trigger data when it sees TRIGGER_ON. Perl hash iteration
# order is non-deterministic, so trigger_state must be written in a separate
# call that executes after all data fields are already in shared memory.
my $values = {
'trigger_data:trigger_score' => $score,
'trigger_data:trigger_cause' => $cause,
};
$values->{'trigger_data:trigger_text'} = $text if defined($text);
$values->{'trigger_data:trigger_showtext'} = $showtext if defined($showtext);
$values->{'trigger_data:trigger_state'} = TRIGGER_ON; # Write state last so event not read incomplete
zmMemWrite($monitor, $values);
zmMemWrite($monitor, {'trigger_data:trigger_state' => TRIGGER_ON}); # Write state last so event not read incomplete
}
sub zmTriggerEventOff {

View File

@@ -1452,10 +1452,12 @@ void Monitor::UpdateAdaptiveSkip() {
}
void Monitor::ForceAlarmOn( int force_score, const char *force_cause, const char *force_text ) {
trigger_data->trigger_state = TriggerState::TRIGGER_ON;
// Write score/cause/text before trigger_state so the analysis thread always
// reads complete trigger data when it observes TRIGGER_ON.
trigger_data->trigger_score = force_score;
strncpy(trigger_data->trigger_cause, force_cause, sizeof(trigger_data->trigger_cause)-1);
strncpy(trigger_data->trigger_text, force_text, sizeof(trigger_data->trigger_text)-1);
trigger_data->trigger_state = TriggerState::TRIGGER_ON;
}
void Monitor::ForceAlarmOff() {